Bootstrap4 の使い方(5) Components (3)
Bootstrap のドキュメントを元にしたコンポーネントについての解説やサンプルです。
この他に以下のページもあるのでよろしければご覧ください。
- Layout(Bootstrap の読み込み、グリッドシステム、メディアオブジェクト)
- Content(タイポグラフィ、コード、イメージ、フィギュア、テーブル)
- Components part1(アラート、バッジ、パンくずリスト、ボタン、ドロップダウン、フォーム、インプットグループ、リストグループ、 ページネーション)
- Components part2(カード、表示・非表示切り替え、アコーディオン、ツールチップ、ポップオーバー、モーダル、ナビゲーション、ナビゲーションバー)
- Components part3(このページ。カルーセル、スクロールスパイ)
- Utilities
以下で説明している Bootstrap のバージョンは、4.1.3 です。
作成日:2018年12月18日
カルーセル(Carousel)
カルーセルはスライドショーのように画像やテキストなどのコンテンツを順番に繰り返し表示する機能で、CSS 3D transforms と JavaScript で構築されており、「前へ」や「次へ」などのコントロールや各スライドに対応するアイコンを表示するインディケーターの機能が組み込まれています。(Carousel)
ブラウザで Page Visibility API がサポートされていれば、ウィンドウが最小化されていたり、タブがアクティブでない場合などウェブページがユーザーに表示されていない場合はスライドしないようになっています。
注意点としては、ネストされた(入れ子になった)カルーセルはサポートされていません。また、カルーセルはアクセシビリティの標準に対応していません。そして、Bootstrap の JavaScript をソースからビルドしている場合は、util.js が必要になります。
カルーセルは自動的にスライドの寸法を調整(normalize)しないので、場合によっては、適切なサイズにするようにユーティリティクラスを使用したり、独自のスタイルを指定する必要があります。また、「前へ」や「次へ」などのコントロールやインディケーターが組み込まれていますが、これらを使用するかどうかは必要に応じて判断します。
active クラスをスライドの1つに必ず指定する必要があります(指定しないとカルーセル自体が表示されません)。
また、carousel クラスを指定した要素には一意の id 属性を指定します(特に複数のカルーセルを同じページに配置する場合)。コントロールやインディケータの要素には、data-target 属性(a 要素を使う場合は href 属性)を追加してカルーセルの要素の id の値を指定する必要があります。
data 属性と JavaScript
data-ride="carousel" 属性を指定すると、ページがロードされたらカルーセルのアニメーションを開始します(JavaScript の記述は必要ありません)。
data-ride="carousel" 属性を指定しない場合は、ユーザーがコントロールを使って最初のスライドを作動させると、自動的にカルーセルを開始します。
JavaScript を使ってカルーセルを呼び出す(初期化する)には、以下のように記述します。但し、同じカルーセルに対して JavaScript での明示的な初期化を組み合わせて使用することはできません(冗長であり不要)。
$('.carousel').carousel()
関連ページ:WordPress で Bootstrap 4 のカルーセルを使う
スライドのみの例
カルーセルを作成するには、その範囲をカルーセルの id 属性を指定した div 要素で囲み、carousel クラスと slide クラス(スライド表示させるクラス)を指定します。
data-ride="carousel" 属性を指定すると、カルーセルが自動的に開始されます。
続いて carousel-inner クラスを指定した div 要素を記述し、この中にそれぞれの画像やコンテンツを入れる carousel-item クラスを指定した div 要素を配置し、初期表示される画像の要素には active クラスを指定します。carousel-item クラスを指定した div 要素内に img 要素や表示するコンテンツを配置します。
また、ブラウザのデフォルトの画像の配置を防ぐために、画像には d-block と w-100 のクラス(それぞれ display:block と width:100%)を指定しています。(display utilities / sizing utilities)
<div id="carouselExampleSlidesOnly" class="carousel slide" data-ride="carousel"> <div class="carousel-inner"> <div class="carousel-item active"> <img class="d-block w-100" src="../images/carousel_1.png" alt="First slide"> </div> <div class="carousel-item"> <img class="d-block w-100" src="../images/carousel_2.png" alt="Second slide"> </div> <div class="carousel-item"> <img class="d-block w-100" src="../images/carousel_3.png" alt="Third slide"> </div> </div> </div>
コントロールの追加
「前へ」や「次へ」を示すコントロールのためにそれぞれ carousel-control-prev、carousel-control-next クラスと href 属性にカルーセルの id を指定した以下のような a 要素を記述します。(スムーズスクロールなどを使用している場合、a 要素が競合する場合があります)
- 「前へ」の a 要素:data-slide="prev" 属性を指定。carousel-control-prev-icon クラスと aria-hidden="true" を指定した span 要素と sr-only クラスを指定した span 要素(前へ)を配置。
- 「次へ」の a 要素:data-slide="next" 属性を指定。carousel-control-next-icon クラスと aria-hidden="true" を指定した span 要素と sr-only クラスを指定した span 要素(次へ)を配置。
aria-hidden="true"(アイコン自体は装飾のためのものなので、スクリーンリーダに読み上げられないように伝える指定)と sr-only クラス(読み上げられるが表示されない)の span 要素はアクセシビリティのための記述です。
<div id="carouselExampleControls" class="carousel slide" data-ride="carousel"> <div class="carousel-inner"> <div class="carousel-item active"> <img class="d-block w-100" src="../images/carousel_1.png" alt="First slide"> </div> <div class="carousel-item"> <img class="d-block w-100" src="../images/carousel_2.png" alt="Second slide"> </div> <div class="carousel-item"> <img class="d-block w-100" src="../images/carousel_3.png" alt="Third slide"> </div> </div> <!-- コントロール --> <a class="carousel-control-prev" href="#carouselExampleControls" role="button" data-slide="prev"> <span class="carousel-control-prev-icon" aria-hidden="true"></span><!-- アイコン --> <span class="sr-only">前へ</span> </a> <a class="carousel-control-next" href="#carouselExampleControls" role="button" data-slide="next"> <span class="carousel-control-next-icon" aria-hidden="true"></span><!-- アイコン --> <span class="sr-only">次へ</span> </a> </div>
インディケーターの追加
各スライドに対応するアイコンを表示するインディケーターは、carousel-indicators クラスを指定した ol 要素を配置し、画像の数だけ li 要素を記述します。
li 要素には、data-target 属性(値にはカルーセルの id を指定)と data-slide-to 属性(値はそれぞれのスライドに対応する数値を0から順に指定)を指定します。また、初期表示される画像に対応する li 要素には active クラスを指定します。
<div id="carouselExampleIndicators" class="carousel slide" data-ride="carousel"> <!-- インディケーター --> <ol class="carousel-indicators"> <li data-target="#carouselExampleIndicators" data-slide-to="0" class="active"></li> <li data-target="#carouselExampleIndicators" data-slide-to="1"></li> <li data-target="#carouselExampleIndicators" data-slide-to="2"></li> </ol> <div class="carousel-inner"> <div class="carousel-item active"> <img class="d-block w-100" src="../images/carousel_1.png" alt="First slide"> </div> <div class="carousel-item"> <img class="d-block w-100" src="../images/carousel_2.png" alt="Second slide"> </div> <div class="carousel-item"> <img class="d-block w-100" src="../images/carousel_3.png" alt="Third slide"> </div> </div> <a class="carousel-control-prev" href="#carouselExampleIndicators" role="button" data-slide="prev"> <span class="carousel-control-prev-icon" aria-hidden="true"></span> <span class="sr-only">前へ</span> </a> <a class="carousel-control-next" href="#carouselExampleIndicators" role="button" data-slide="next"> <span class="carousel-control-next-icon" aria-hidden="true"></span> <span class="sr-only">次へ</span> </a> </div>
クロスフェード効果
スライドではなく、クロスフェード効果で表示するには、carousel-fade クラスをカルーセルの要素に指定します。(Crossfade)
<div id="carouselExampleFade" class="carousel slide carousel-fade" data-ride="carousel"> <div class="carousel-inner"> <div class="carousel-item active"> <img class="d-block w-100" src="../images/carousel_1.png" alt="First slide"> </div> <div class="carousel-item"> <img class="d-block w-100" src="../images/carousel_2.png" alt="Second slide"> </div> <div class="carousel-item"> <img class="d-block w-100" src="../images/carousel_3.png" alt="Third slide"> </div> </div> <a class="carousel-control-prev" href="#carouselExampleFade" role="button" data-slide="prev"> <span class="carousel-control-prev-icon" aria-hidden="true"></span> <span class="sr-only">前へ</span> </a> <a class="carousel-control-next" href="#carouselExampleFade" role="button" data-slide="next"> <span class="carousel-control-next-icon" aria-hidden="true"></span> <span class="sr-only">次へ</span> </a> </div><
オプション
オプションは、data 属性または JavaScript を使って指定することができます。data 属性を使って指定する場合、interval オプションを指定するには、data-interval="2000" のように指定します。(Options)
<div id="carouselExample" class="carousel slide" data-ride="carousel" data-interval="2000">
JavaScript を使って指定するには、以下のように記述します。
$('.carousel').carousel({ interval: 2000 })
オプション名 | タイプ | デフォルト値 | 説明 |
---|---|---|---|
interval | number | 5000 | 次のスライドを表示するまでの時間をミリ秒で指定。false を指定するとカルーセルは自動的に循環しない(コントロールをクリックして手動で動かす)。 data-interval="2000"(スライドの表示間隔:2秒) data-interval="false"(手動で動かす) |
keyboard | boolean | true | キーボードイベントに反応するかどうかの真偽値 |
pause | string | boolean | "hover" | "hover" が指定された場合(デフォルトの場合)、カルーセル上にマウスが入る(mouseenter)と動作を停止し、マウスが外れる(mouseleave)と再開する。false が指定されるとホバー時にも停止されない。タッチ対応デバイスでは、"hover" の場合、タッチされると2インターバル分停止後に再開される。 data-pause="false"(ホバー時に停止されない) |
ride | string | false | デフォルトの(data-ride 属性や JavaScript を使って何も指定していない)場合、ユーザーが最初のスライドを作動させた場合にカルーセルが自動的に開始され、"carousel" が指定された場合は、ページ読み込み時に自動的に開始される。 data-ride="carousel"(自動的に開始) |
wrap | boolean | true | カルーセルが循環動作を継続させるか停止させるかの真偽値。false を指定すると一巡すると停止。 data-wrap="false"(最後の画像で停止) |
メソッドとイベント
Asynchronous methods and transitions(非同期メソッドとトランジション)
全ての API メソッドは非同期で、transition(トランジション・遷移)を開始します。メソッドはトランジションが開始すると直ちに(それが終了する前に)呼び出し元に戻します。また、現在トランジション中(transitioning)のコンポーネントへのメソッド呼び出しは無視されます。(Methods)
オプションを指定してカルーセルを初期化するには、以下のように記述します。
$('.carousel').carousel({ interval: 2000 //オプションの指定 })
以下のようなメソッドが用意されています。
オプション | 説明 |
---|---|
.carousel('cycle') | 左から右へカルーセルの循環を実行 |
.carousel('pause') | カルーセルの一時停止 |
.carousel(number) | number で指定したスライドへ移動(number は0から始まる)。 |
.carousel('prev') | 1つ前のスライドへ移動 |
.carousel('next') | 次のスライドへ移動 |
.carousel('dispose') | 要素のカルーセルを破棄 |
イベント
カルーセルには2つのイベントがあり、それぞれ以下の追加のプロパティがあります。(Events)
- direction: カルーセルがスライドする方向 ("left" または "right")
- relatedTarget: アクティブなアイテムとしてスライドが実行されている DOM 要素T
- from:現在のアイテムのインデックス
- to: 次のアイテムのインデックス
カルーセルのイベントはカルーセル自身(carousel クラスを指定した div 要素など)で発火します。
イベントタイプ | 説明 |
---|---|
slide.bs.carousel | このイベントは slide インスタンスメソッドが呼び出されると発火します。 |
slid.bs.carousel | このイベントは slide トランジションが完了すると発火します。 |
$('#myCarousel').on('slide.bs.carousel', function () { // 処理を記述 })
トランジション期間の変更
carousel-item クラスを指定したアイテムのトランジションの時間は、Sass 変数の $carousel-transition を使って変更することができます。複数のトランジションを適用する場合は、最初に transform トランジションの定義を記述する必要があります(例:transition: transform 2s ease, opacity .5s ease-out)。(Change transition duration)
デフォルトでは、以下が _variables.scss に設定されています。
$carousel-transition:transform .6s ease !default;
スクロールスパイ(Scrollspy)
スクロールスパイは Bootstrap のナビゲーションやリストグループで現在のビューポート上での位置に対応するリンクを自動的に示す機能です。(Scrollspy)
スクロールスパイが正しく機能するには、以下の要件を満たす必要があります。
- Bootstrap の JavaScript をソースからビルドしている場合は、util.js が必要になります。
- Bootstrap の nav コンポーネントか list group コンポーネントと使用する必要があります。
- スクロールスパイで監視する対象の要素(通常は body )には、position: relative; が適用されている必要があります。
- body 要素以外を監視対象の要素とする場合は、height(高さ)と overflow-y: scroll が指定されている必要があります。
- アンカー(a 要素)の href 属性でそれぞれの要素の id を参照している必要があります。
data-spy="scroll"
ナビゲーションバーにスクロールスパイを実装するには、監視対象の要素(たいていの場合は body 要素)に data-spy="scroll" 属性を指定します。そして data-target 属性の値に、nav クラスを指定した要素の親要素の id を指定します。
body { position: relative; }
<body data-spy="scroll" data-target="#navbar-example"><!-- 監視対象の要素 --> ... <div id="navbar-example"> <ul class="nav nav-tabs" role="tablist"> ... </ul> </div> ... </body>
JavaScript
上述の HTML で data-spy 属性ではなく、JavaScript で初期化するには、以下のようにします(監視対象が body 要素で、nav クラスを指定した要素の親要素の id が navbar-example の場合)。
$('body').scrollspy({ target: '#navbar-example' })
リストグループ
以下はリストグループ(list group)を使った例です。
内側でスクロールしてみてください。
Item 1
Ex consequat commodo adipisicing exercitation aute excepteur occaecat ullamco duis aliqua id magna ullamco eu. Do aute ipsum ipsum ullamco cillum consectetur ut et aute consectetur labore. Fugiat laborum incididunt tempor eu consequat enim dolore proident. Qui laborum do non excepteur nulla magna eiusmod consectetur in. Aliqua et aliqua officia quis et incididunt voluptate non anim reprehenderit adipisicing dolore ut consequat deserunt mollit dolore. Aliquip nulla enim veniam non fugiat id cupidatat nulla elit cupidatat commodo velit ut eiusmod cupidatat elit dolore.
Item 2
Quis magna Lorem anim amet ipsum do mollit sit cillum voluptate ex nulla tempor. Laborum consequat non elit enim exercitation cillum aliqua consequat id aliqua. Esse ex consectetur mollit voluptate est in duis laboris ad sit ipsum anim Lorem. Incididunt veniam velit elit elit veniam Lorem aliqua quis ullamco deserunt sit enim elit aliqua esse irure. Laborum nisi sit est tempor laborum mollit labore officia laborum excepteur commodo non commodo dolor excepteur commodo. Ipsum fugiat ex est consectetur ipsum commodo tempor sunt in proident.
Item 3
Quis anim sit do amet fugiat dolor velit sit ea ea do reprehenderit culpa duis. Nostrud aliqua ipsum fugiat minim proident occaecat excepteur aliquip culpa aute tempor reprehenderit. Deserunt tempor mollit elit ex pariatur dolore velit fugiat mollit culpa irure ullamco est ex ullamco excepteur.
Item 4
Quis anim sit do amet fugiat dolor velit sit ea ea do reprehenderit culpa duis. Nostrud aliqua ipsum fugiat minim proident occaecat excepteur aliquip culpa aute tempor reprehenderit. Deserunt tempor mollit elit ex pariatur dolore velit fugiat mollit culpa irure ullamco est ex ullamco excepteur.
この例の場合、data-spy="scroll" 属性を指定した div 要素(監視対象要素)にはインラインスタイル style="height: 200px; overflow-y:scroll; position: relative;" で height(高さ)、position、overflow を指定しています。
<div id="list-example" class="list-group"> <a class="list-group-item list-group-item-action" href="#list-item-1">Item 1</a> <a class="list-group-item list-group-item-action" href="#list-item-2">Item 2</a> <a class="list-group-item list-group-item-action" href="#list-item-3">Item 3</a> <a class="list-group-item list-group-item-action" href="#list-item-4">Item 4</a> </div> <div data-spy="scroll" data-target="#list-example" data-offset="0" style="height: 200px; overflow-y:scroll; position: relative;" > <h4 id="list-item-1">Item 1</h4> <p>...</p> <h4 id="list-item-2">Item 2</h4> <p>...</p> <h4 id="list-item-3">Item 3</h4> <p>...</p> <h4 id="list-item-4">Item 4</h4> <p>...</p> </div>
メソッド
以下のメソッドが用意されています。(Methods)
.scrollspy('refresh')
スクロールスパイを使用する際に、DOM に要素を追加したり削除する場合は、リフレッシュメソッドを呼ぶ必要があります。
$('[data-spy="scroll"]').each(function () { var $spy = $(this).scrollspy('refresh') })
.scrollspy('dispose')
要素のスクロールスパイを破棄するメソッドです。
オプションとイベント
オプションは data 属性または JavaScript で指定できます。data 属性の場合は、オプション名を data- に付け加えます。例えば offset の場合は、data-offset="" のように指定します。(Options)
オプション名 | タイプ | デフォルト値 | 説明 |
---|---|---|---|
offset | number | 10 | スクロール位置を算出する際のトップからのオフセット値をピクセル(単位は付けない)で指定 |
イベント
スクロールスパイには以下のイベントが定義されています。(Events)
イベントタイプ | 説明 |
---|---|
activate.bs.scrollspy | このイベントはスクロールスパイによって新しいアイテムがアクティブになるとスクロール要素で発火します。 |
$('[data-spy="scroll"]').on('activate.bs.scrollspy', function () { // 処理を記述 })