Bootstrap4.xの使い方をBootstrap3.xからの変更箇所を交えて解説しています。
伸長リンク(Stretched link) v4.3.0新設
CSSを使用して入れ子になったリンクを「伸長する」ことによって、HTML要素またはBootstrapコンポーネントをクリック可能にする。
リンクに .stretched-link
を追加して、 ::after
擬似要素を介して包含ブロックをクリック可能にする。ほとんどの場合、これは position: relative;
(相対位置)を持つ要素が .stretched-link
クラスとのリンクを含めることで実現可能。CSSの位置がどのように機能するかを考えると、.stretched-link
はほとんどのテーブル要素と混在させることはできないので注意(※裏技として掲載していたテーブルの場合の解説はv4.6.0で削除)。
同一要素内の複数のリンクとタップのターゲットは、伸長リンクでは推奨しない。もし、これが必要な場合は、数個の position
と z-index
のスタイルを付ける必要がある。
実例(Examples)
カードの場合
Bootstrapのカードはデフォルトで position: relative;
なので、.stretched-link
クラスは他のHTMLを変更せずに安全にカードのリンクに追加可能。
見本
設定例
<div class="card" style="width: 18rem;">
<img src="..." alt="カード画像の説明" class="card-img-top">
<div class="card-body">
<h5 class="card-title">伸長リンク付きカード</h5>
<p class="card-text">カードのタイトルに基づいてカードの内容の大部分を占める簡単なサンプルテキスト。</p>
<a href="#" class="btn btn-primary stretched-link">リンクボタン</a>
</div>
</div>
【設定】
.card
内のリンク(<a>
)に.stretched-link
を入れるとカードのどこからでもクリック可能になる
メディアオブジェクトの場合
メディアオブジェクトはデフォルトで position: relative;
ではないので、リンクがメディアオブジェクトの外側に伸びないように .position-relative
を追加する必要がある。
見本
伸長リンク付きメディア
これは、メディアオブジェクトのプレースホルダーコンテンツ。これは、実際のコンテンツがどのように見えるかを模倣することを目的としており、ここでは、コンポーネントに少しボディとサイズを与えるために使用している。
リンク設定例
<div class="media position-relative">
<img src="..." alt="..." class="mr-3">
<div class="media-body">
<h5 class="mt-0">伸長リンク付きメディア</h5>
<p>これは、メディアオブジェクトのプレースホルダーコンテンツ。...</p>
<a href="#" class="stretched-link">リンク</a>
</div>
</div>
【設定】
.media
内のリンク(<a>
)に.stretched-link
を入れて.media
に.position-relative
を追加すると、メディアのどこからでもクリック可能になる
グリッドの場合
グリッド列はデフォルトで position: relative;
なので、クリック可能なグリッド列はリンク上に .stretched-link
クラスのみを必要とするが、.row
全体にリンクを張るには、列に .position-static
と行に .position-relative
が必要。
見本
伸長リンク付きのグリッド列
もう一つのカスタムコンポーネントのプレースホルダーコンテンツの別の実例。これは、実際のコンテンツがどのように見えるかを模倣することを目的としており、ここでは、コンポーネントに少しボディとサイズを与えるために使用している。
リンク設定例
<div class="row no-gutters bg-light position-relative">
<div class="col-md-6 mb-md-0 p-md-4">
<img src="..." alt="..." class="w-100">
</div>
<div class="col-md-6 position-static p-4 pl-md-0">
<h5 class="mt-0">伸長リンク付きのグリッド列</h5>
<p>もう一つのカスタムコンポーネントのプレースホルダーコンテンツの別の実例。...</p>
<a href="#" class="stretched-link">リンク</a>
</div>
</div>
【設定】
.col-*
内のリンク(<a>
)に.stretched-link
を入れて.row
内のどこからでもクリック可能にしたい場合は、.col-*
に.position-static
を、.row
に.position-relative
をそれぞれ追加
包含ブロックの識別(Identifying the containing block)
伸長リンクが機能していないように見える場合、包含ブロックが原因である可能性がある。以下のcssプロパティは要素を包含ブロックにする:
position
の値がstatic
以外(relative
,absolute
,fixed
,sticky
)の場合transform
またはperspective
の値がnone
以外の場合will-change
の値がtransform
またはperspective
の場合filter
の値がnone
以外、またはwill-change
の値がfilter
の場合(Firefoxのみで動作)
見本
伸長リンク付きカード
カードのタイトルに基づいてカードの内容の大部分を占める簡単なサンプルテキスト。
リンクに position: relative
が追加されているため、ここでは伸長リンクは機能しない
この伸長リンクは、transform
が適用されているため、p
タグ内でのみ機能する。
設定例
<div class="card" style="width: 18rem;">
<img src="..." alt="カード画像の説明" class="card-img-top">
<div class="card-body">
<h5 class="card-title">伸長リンク付きカード</h5>
<p class="card-text">カードのタイトルに基づいてカードの内容の大部分を占める簡単なサンプルテキスト。</p>
<p class="card-text">
<a href="#card-link-1" class="stretched-link text-danger" style="position: relative;">リンクに <code>position: relative</code> が追加されているため、ここでは伸長リンクは機能しない</a>
</p>
<p class="card-text bg-light" style="transform: rotate(0);">
この<a href="#card-unclickable-link" class="text-warning stretched-link">伸長リンク</a>は、<code>transform</code> が適用されているため、<code>p</code> タグ内でのみ機能する。</p>
</div>
</div>
【注意】
- 包含ブロックの要素内のリンクに
.stretched-link
を追加しても機能しない