オフキャンバス Offcanvas
いくつかのクラスとJavaScriptプラグインを使用して、ナビゲーション、ショッピングカートなどのために隠しサイドバーをプロジェクトに組み込むことができます。
仕組み
Offcanvasは、JavaScriptを介してビューポートの左、右、上、または下の端から表示されるようにトグルできるサイドバーコンポーネントです。ボタンまたはアンカーは、トグルする特定の要素にアタッチされるトリガーとして使用され、data属性を使用してJavaScriptを呼び出します。
- Offcanvasはモーダルと同じJavaScriptコードの一部を共有しています。概念的には非常に似ていますが、個別のプラグインです。
- 同様に、offcanvasのスタイルと寸法の一部のsource Sass変数は、モーダルの変数から継承されています。
- 表示されると、offcanvasにはデフォルトのbackdropが含まれており、クリックしてoffcanvasを非表示にすることができます。
- モーダルと同様に、一度に1つのoffcanvasのみを表示できます。
注意! CSSがアニメーションを処理する方法を考えると、.offcanvas要素でmarginまたはtranslateを使用することはできません。代わりに、クラスを独立したラッピング要素として使用してください。
このコンポーネントのアニメーション効果は、prefers-reduced-motionメディアクエリに依存しています。詳細については、アクセシビリティドキュメントのreduced motionセクションを参照してください。
例
オフキャンバスコンポーネント
以下は、デフォルトで表示されるoffcanvasの例です(.offcanvasの.show経由)。Offcanvasには、閉じるボタンを含むヘッダーのサポートと、いくつかの初期paddingのためのオプションのbodyクラスが含まれています。可能な限り、却下アクションを含むoffcanvasヘッダーを含めるか、明示的な却下アクションを提供することをお勧めします。
Offcanvas
<div class="offcanvas offcanvas-start show" tabindex="-1" id="offcanvas" aria-labelledby="offcanvasLabel">
<div class="offcanvas-header">
<h5 class="offcanvas-title" id="offcanvasLabel">Offcanvas</h5>
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" aria-label="Close"></button>
</div>
<div class="offcanvas-body">
Content for the offcanvas goes here. You can place just about any Bootstrap component or custom elements here.
</div>
</div> ライブデモ
以下のボタンを使用して、.offcanvasクラスを持つ要素の.showクラスをトグルするJavaScriptを介してoffcanvas要素を表示および非表示にします。
.offcanvasはコンテンツを非表示にします(デフォルト).offcanvas.showはコンテンツを表示します
href属性を持つリンク、またはdata-bs-target属性を持つボタンを使用できます。どちらの場合も、data-bs-toggle="offcanvas"が必要です。
Offcanvas
<a class="btn btn-primary" data-bs-toggle="offcanvas" href="#offcanvasExample" role="button" aria-controls="offcanvasExample">
Link with href
</a>
<button class="btn btn-primary" type="button" data-bs-toggle="offcanvas" data-bs-target="#offcanvasExample" aria-controls="offcanvasExample">
Button with data-bs-target
</button>
<div class="offcanvas offcanvas-start" tabindex="-1" id="offcanvasExample" aria-labelledby="offcanvasExampleLabel">
<div class="offcanvas-header">
<h5 class="offcanvas-title" id="offcanvasExampleLabel">Offcanvas</h5>
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" aria-label="Close"></button>
</div>
<div class="offcanvas-body">
<div>
Some text as placeholder. In real life you can have the elements you have chosen. Like, text, images, lists, etc.
</div>
<div class="dropdown mt-3">
<button class="btn btn-secondary dropdown-toggle" type="button" data-bs-toggle="dropdown">
Dropdown button
</button>
<ul class="dropdown-menu">
<li><a class="dropdown-item" href="#">Action</a></li>
<li><a class="dropdown-item" href="#">Another action</a></li>
<li><a class="dropdown-item" href="#">Something else here</a></li>
</ul>
</div>
</div>
</div> ボディスクロール
offcanvasとそのbackdropが表示されている場合、<body>要素のスクロールは無効になります。<body>スクロールを有効にするには、data-bs-scroll属性を使用します。
Offcanvas with body scrolling
Try scrolling the rest of the page to see this option in action.
<button class="btn btn-primary" type="button" data-bs-toggle="offcanvas" data-bs-target="#offcanvasScrolling" aria-controls="offcanvasScrolling">Enable body scrolling</button>
<div class="offcanvas offcanvas-start" data-bs-scroll="true" data-bs-backdrop="false" tabindex="-1" id="offcanvasScrolling" aria-labelledby="offcanvasScrollingLabel">
<div class="offcanvas-header">
<h5 class="offcanvas-title" id="offcanvasScrollingLabel">Offcanvas with body scrolling</h5>
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" aria-label="Close"></button>
</div>
<div class="offcanvas-body">
<p>Try scrolling the rest of the page to see this option in action.</p>
</div>
</div> ボディスクロールとバックドロップ
表示されているbackdropで<body>スクロールを有効にすることもできます。
Backdrop with scrolling
Try scrolling the rest of the page to see this option in action.
<button class="btn btn-primary" type="button" data-bs-toggle="offcanvas" data-bs-target="#offcanvasWithBothOptions" aria-controls="offcanvasWithBothOptions">Enable both scrolling & backdrop</button>
<div class="offcanvas offcanvas-start" data-bs-scroll="true" tabindex="-1" id="offcanvasWithBothOptions" aria-labelledby="offcanvasWithBothOptionsLabel">
<div class="offcanvas-header">
<h5 class="offcanvas-title" id="offcanvasWithBothOptionsLabel">Backdrop with scrolling</h5>
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" aria-label="Close"></button>
</div>
<div class="offcanvas-body">
<p>Try scrolling the rest of the page to see this option in action.</p>
</div>
</div> 静的バックドロップ
backdropが静的に設定されている場合、外側をクリックしてもoffcanvasは閉じません。
Offcanvas
<button class="btn btn-primary" type="button" data-bs-toggle="offcanvas" data-bs-target="#staticBackdrop" aria-controls="staticBackdrop">
Toggle static offcanvas
</button>
<div class="offcanvas offcanvas-start" data-bs-backdrop="static" tabindex="-1" id="staticBackdrop" aria-labelledby="staticBackdropLabel">
<div class="offcanvas-header">
<h5 class="offcanvas-title" id="staticBackdropLabel">Offcanvas</h5>
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" aria-label="Close"></button>
</div>
<div class="offcanvas-body">
<div>
I will not close if you click outside of me.
</div>
</div>
</div> ダークオフキャンバス
Deprecated in v5.3.0 Added in v5.2.0ダークナビゲーションバーなどの異なるコンテキストにより適合させるために、ユーティリティを使用してoffcanvasの外観を変更します。ここでは、ダークoffcanvasで適切なスタイリングを行うために、.offcanvasに.text-bg-darkを、.btn-closeに.btn-close-whiteを追加しています。内部にドロップダウンがある場合は、.dropdown-menuに.dropdown-menu-darkを追加することも検討してください。
注意! コンポーネントのダークバリアントは、カラーモードの導入によりv5.3.0で非推奨になりました。上記のクラスを手動で追加する代わりに、ルート要素、親ラッパー、またはコンポーネント自体にdata-bs-theme="dark"を設定してください。
Offcanvas
Place offcanvas content here.
<div class="offcanvas offcanvas-start show text-bg-dark" tabindex="-1" id="offcanvasDark" aria-labelledby="offcanvasDarkLabel">
<div class="offcanvas-header">
<h5 class="offcanvas-title" id="offcanvasDarkLabel">Offcanvas</h5>
<button type="button" class="btn-close btn-close-white" data-bs-dismiss="offcanvasDark" aria-label="Close"></button>
</div>
<div class="offcanvas-body">
<p>Place offcanvas content here.</p>
</div>
</div> レスポンシブ
Added in v5.2.0レスポンシブoffcanvasクラスは、指定されたブレークポイント以下でビューポートの外側にコンテンツを非表示にします。そのブレークポイントより上では、内部のコンテンツは通常どおりに動作します。たとえば、.offcanvas-lgはlgブレークポイントより下でoffcanvasのコンテンツを非表示にしますが、lgブレークポイントより上ではコンテンツを表示します。レスポンシブoffcanvasクラスは、各ブレークポイントで利用できます。
.offcanvas.offcanvas-sm.offcanvas-md.offcanvas-lg.offcanvas-xl.offcanvas-xxl
レスポンシブoffcanvasを作成するには、.offcanvas基本クラスをレスポンシブバリアントに置き換え、閉じるボタンに明示的なdata-bs-targetがあることを確認してください。
Responsive offcanvas
This is content within an .offcanvas-lg.
<button class="btn btn-primary d-lg-none" type="button" data-bs-toggle="offcanvas" data-bs-target="#offcanvasResponsive" aria-controls="offcanvasResponsive">Toggle offcanvas</button>
<div class="alert alert-info d-none d-lg-block">Resize your browser to show the responsive offcanvas toggle.</div>
<div class="offcanvas-lg offcanvas-end" tabindex="-1" id="offcanvasResponsive" aria-labelledby="offcanvasResponsiveLabel">
<div class="offcanvas-header">
<h5 class="offcanvas-title" id="offcanvasResponsiveLabel">Responsive offcanvas</h5>
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" data-bs-target="#offcanvasResponsive" aria-label="Close"></button>
</div>
<div class="offcanvas-body">
<p class="mb-0">This is content within an <code>.offcanvas-lg</code>.</p>
</div>
</div> 配置
offcanvasコンポーネントのデフォルトの配置はないため、以下の修飾クラスのいずれかを追加する必要があります。
.offcanvas-startはビューポートの左側にoffcanvasを配置します(上記参照).offcanvas-endはビューポートの右側にoffcanvasを配置します.offcanvas-topはビューポートの上部にoffcanvasを配置します.offcanvas-bottomはビューポートの下部にoffcanvasを配置します
以下の上、右、下の例を試してください。
Offcanvas top
<button class="btn btn-primary" type="button" data-bs-toggle="offcanvas" data-bs-target="#offcanvasTop" aria-controls="offcanvasTop">Toggle top offcanvas</button>
<div class="offcanvas offcanvas-top" tabindex="-1" id="offcanvasTop" aria-labelledby="offcanvasTopLabel">
<div class="offcanvas-header">
<h5 class="offcanvas-title" id="offcanvasTopLabel">Offcanvas top</h5>
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" aria-label="Close"></button>
</div>
<div class="offcanvas-body">
...
</div>
</div> Offcanvas right
<button class="btn btn-primary" type="button" data-bs-toggle="offcanvas" data-bs-target="#offcanvasRight" aria-controls="offcanvasRight">Toggle right offcanvas</button>
<div class="offcanvas offcanvas-end" tabindex="-1" id="offcanvasRight" aria-labelledby="offcanvasRightLabel">
<div class="offcanvas-header">
<h5 class="offcanvas-title" id="offcanvasRightLabel">Offcanvas right</h5>
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" aria-label="Close"></button>
</div>
<div class="offcanvas-body">
...
</div>
</div> Offcanvas bottom
<button class="btn btn-primary" type="button" data-bs-toggle="offcanvas" data-bs-target="#offcanvasBottom" aria-controls="offcanvasBottom">Toggle bottom offcanvas</button>
<div class="offcanvas offcanvas-bottom" tabindex="-1" id="offcanvasBottom" aria-labelledby="offcanvasBottomLabel">
<div class="offcanvas-header">
<h5 class="offcanvas-title" id="offcanvasBottomLabel">Offcanvas bottom</h5>
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" aria-label="Close"></button>
</div>
<div class="offcanvas-body small">
...
</div>
</div> アクセシビリティ
offcanvasパネルは概念的にはモーダルダイアログであるため、offcanvasのタイトルを参照するaria-labelledby="..."を.offcanvasに必ず追加してください。JavaScriptを介してすでに追加しているため、role="dialog"を追加する必要はありません。
CSS
変数
Added in v5.2.0BootstrapのCSS変数アプローチの進化の一環として、offcanvasは.offcanvasでローカルCSS変数を使用して、リアルタイムのカスタマイズを強化しています。CSS変数の値はSassを介して設定されるため、Sassのカスタマイズも引き続きサポートされています。
--#{$prefix}offcanvas-zindex: #{$zindex-offcanvas};
--#{$prefix}offcanvas-width: #{$offcanvas-horizontal-width};
--#{$prefix}offcanvas-height: #{$offcanvas-vertical-height};
--#{$prefix}offcanvas-padding-x: #{$offcanvas-padding-x};
--#{$prefix}offcanvas-padding-y: #{$offcanvas-padding-y};
--#{$prefix}offcanvas-color: #{$offcanvas-color};
--#{$prefix}offcanvas-bg: #{$offcanvas-bg-color};
--#{$prefix}offcanvas-border-width: #{$offcanvas-border-width};
--#{$prefix}offcanvas-border-color: #{$offcanvas-border-color};
--#{$prefix}offcanvas-box-shadow: #{$offcanvas-box-shadow};
--#{$prefix}offcanvas-transition: #{transform $offcanvas-transition-duration ease-in-out};
--#{$prefix}offcanvas-title-line-height: #{$offcanvas-title-line-height};
Sass 変数
$offcanvas-padding-y: $modal-inner-padding;
$offcanvas-padding-x: $modal-inner-padding;
$offcanvas-horizontal-width: 400px;
$offcanvas-vertical-height: 30vh;
$offcanvas-transition-duration: .3s;
$offcanvas-border-color: $modal-content-border-color;
$offcanvas-border-width: $modal-content-border-width;
$offcanvas-title-line-height: $modal-title-line-height;
$offcanvas-bg-color: var(--#{$prefix}body-bg);
$offcanvas-color: var(--#{$prefix}body-color);
$offcanvas-box-shadow: $modal-content-box-shadow-xs;
$offcanvas-backdrop-bg: $modal-backdrop-bg;
$offcanvas-backdrop-opacity: $modal-backdrop-opacity;
使用方法
offcanvasプラグインは、重労働を処理するためにいくつかのクラスと属性を利用します:
.offcanvasはコンテンツを非表示にします.offcanvas.showはコンテンツを表示します.offcanvas-startは左側のoffcanvasを非表示にします.offcanvas-endは右側のoffcanvasを非表示にします.offcanvas-topは上部のoffcanvasを非表示にします.offcanvas-bottomは下部のoffcanvasを非表示にします
JavaScript機能をトリガーするdata-bs-dismiss="offcanvas"属性を持つ却下ボタンを追加します。すべてのデバイスで適切な動作をするために、必ず<button>要素を使用してください。
データ属性経由
トグル
data-bs-toggle="offcanvas"とdata-bs-targetまたはhrefを要素に追加して、1つのoffcanvas要素のコントロールを自動的に割り当てます。data-bs-target属性は、offcanvasを適用するためのCSSセレクタを受け入れます。offcanvas要素にクラスoffcanvasを必ず追加してください。デフォルトで開いた状態にしたい場合は、追加のクラスshowを追加してください。
却下
以下のように、offcanvas内のボタンにdata-bs-dismiss属性を指定することで閉じることができます:
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" aria-label="Close"></button>
または、以下のように、offcanvasの外側のボタンに追加のdata-bs-targetを使用することもできます:
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" data-bs-target="#my-offcanvas" aria-label="Close"></button> offcanvasを却下する両方の方法がサポートされていますが、offcanvasの外側から却下することはARIA Authoring Practices Guide dialog (modal) patternに一致しないことに注意してください。自己責任で行ってください。
JavaScript 経由
手動で有効にします:
const offcanvasElementList = document.querySelectorAll('.offcanvas')
const offcanvasList = [...offcanvasElementList].map(offcanvasEl => new bootstrap.Offcanvas(offcanvasEl))
オプション
オプションはdata属性またはJavaScriptを介して渡すことができます。data-bs-にオプション名を追加できます。例: data-bs-animation="{value}"。data属性を介してオプションを渡す場合は、オプション名の大文字小文字を"camelCase"から"kebab-case"に変更してください。例えば、data-bs-customClass="beautifier"の代わりにdata-bs-custom-class="beautifier"を使用します。
Bootstrap 5.2.0以降、すべてのコンポーネントは、JSON文字列として単純なコンポーネント設定を格納できる実験的な予約済みdata属性data-bs-configをサポートしています。要素にdata-bs-config='{"delay":0, "title":123}'とdata-bs-title="456"属性がある場合、最終的なtitle値は456になり、個別のdata属性はdata-bs-configで指定された値を上書きします。さらに、既存のdata属性はdata-bs-delay='{"show":0,"hide":150}'のようなJSON値を格納できます。
最終的な設定オブジェクトは、data-bs-config、data-bs-、およびjs objectのマージされた結果であり、最後に指定されたキー値が他の値を上書きします。
| Name | Type | Default | Description |
|---|---|---|---|
backdrop | boolean または文字列 static | true | offcanvasが開いているときにbody上にbackdropを適用します。または、クリックしてもoffcanvasが閉じないbackdropにはstaticを指定します。 |
keyboard | boolean | true | escapeキーが押されたときにoffcanvasを閉じます。 |
scroll | boolean | false | offcanvasが開いているときにbodyのスクロールを許可します。 |
メソッド
すべてのAPIメソッドは非同期でトランジションを開始します。 トランジションが開始されるとすぐに呼び出し元に戻りますが、終了する前に戻ります。さらに、トランジション中のコンポーネントに対するメソッド呼び出しは無視されます。JavaScriptドキュメントで詳細を確認してください。
コンテンツをoffcanvas要素としてアクティブ化します。オプションのobjectを受け入れます。
コンストラクタを使用してoffcanvasインスタンスを作成できます。例えば:
const bsOffcanvas = new bootstrap.Offcanvas('#myOffcanvas')
| Method | Description |
|---|---|
dispose | 要素のoffcanvasを破棄します。 |
getInstance | DOM要素に関連付けられたoffcanvasインスタンスを取得できる静的メソッドです。 |
getOrCreateInstance | DOM要素に関連付けられたoffcanvasインスタンスを取得するか、初期化されていない場合は新しいインスタンスを作成する静的メソッドです。 |
hide | offcanvas要素を非表示にします。offcanvas要素が実際に非表示になる前に呼び出し元に戻ります(つまり、hidden.bs.offcanvasイベントが発生する前)。 |
show | offcanvas要素を表示します。offcanvas要素が実際に表示される前に呼び出し元に戻ります(つまり、shown.bs.offcanvasイベントが発生する前)。 |
toggle | offcanvas要素を表示または非表示に切り替えます。offcanvas要素が実際に表示または非表示になる前に呼び出し元に戻ります(つまり、shown.bs.offcanvasまたはhidden.bs.offcanvasイベントが発生する前)。 |
イベント
Bootstrapのoffcanvasクラスは、offcanvas機能にフックするためのいくつかのイベントを公開しています。
| Event type | Description |
|---|---|
hide.bs.offcanvas | このイベントは、hideメソッドが呼び出されたときに即座に発生します。 |
hidden.bs.offcanvas | このイベントは、offcanvas要素がユーザーから非表示にされたときに発生します(CSSトランジションの完了を待ちます)。 |
hidePrevented.bs.offcanvas | このイベントは、offcanvasが表示されていて、そのbackdropがstaticで、offcanvasの外側がクリックされたときに発生します。このイベントは、escapeキーが押され、keyboardオプションがfalseに設定されている場合にも発生します。 |
show.bs.offcanvas | このイベントは、showインスタンスメソッドが呼び出されたときに即座に発生します。 |
shown.bs.offcanvas | このイベントは、offcanvas要素がユーザーに表示されたときに発生します(CSSトランジションの完了を待ちます)。 |
const myOffcanvas = document.getElementById('myOffcanvas')
myOffcanvas.addEventListener('hidden.bs.offcanvas', event => {
// do something...
})