Bootstrap - Scrollspy: 初心者向けガイド

こんにちは、Web開発志望の方々!今日は、Bootstrapの魅力的な機能であるScrollspyについて深く掘り下げます。プログラミングが初めてであっても心配しないでください。私はこのトピックをステップバイステップでガイドします。コーヒーを用意して、始めましょう!

Bootstrap - Scrollspy

Scrollspyとは?

技術的な詳細に入る前に、まずScrollspyとは何かを理解しましょう。オンラインで長い記事を読んでいると、スクロールをするとナビゲーションメニューが自動的に現在読んでいるセクションをハイライトする機能を思い浮かべてください。それがScrollspyです!ユーザーの現在位置を視覚的にフィードバックする機能で、ユーザーエクスペリエンスを向上させる便利な小物です。

キャラクター

Scrollspyは、ウェブページのスクロール位置を監視し、ナビゲーションアイテムのアクティブ状態を更新します。まるで小さなスパイ(その名の通り!)がページ上の位置を監視し、ナビゲーションメニューに「ユーザーがここにいる」と伝えるようなものです。

基本的な例を見てみましょう:

<body data-bs-spy="scroll" data-bs-target="#navbar-example">
<div id="navbar-example">
<ul class="nav nav-tabs">
<li class="nav-item"><a class="nav-link" href="#section1">セクション1</a></li>
<li class="nav-item"><a class="nav-link" href="#section2">セクション2</a></li>
</ul>
</div>

<div data-bs-spy="scroll" data-bs-target="#navbar-example" data-bs-offset="0" tabindex="0">
<h4 id="section1">セクション1</h4>
<p>...</p>
<h4 id="section2">セクション2</h4>
<p>...</p>
</div>
</body>

この例では、Bootstrapにスクロール位置を監視させ(data-bs-spy="scroll")、ナビゲーションを#navbar-exampleに更新させます。コンテンツをスクロールすると、対応するナビアイテムがハイライトされます。

ナビバー

Scrollspyの最も一般的な用途の一つはナビバーと一緒に使うことです。より詳細な例を見てみましょう:

<nav id="navbar-example2" class="navbar navbar-light bg-light px-3">
<a class="navbar-brand" href="#">ナビバー</a>
<ul class="nav nav-pills">
<li class="nav-item">
<a class="nav-link" href="#scrollspyHeading1">最初</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#scrollspyHeading2">第二</a>
</li>
</ul>
</nav>

<div data-bs-spy="scroll" data-bs-target="#navbar-example2" data-bs-offset="0" class="scrollspy-example" tabindex="0">
<h4 id="scrollspyHeading1">最初の見出し</h4>
<p>...</p>
<h4 id="scrollspyHeading2">第二の見出し</h4>
<p>...</p>
</div>

この例では、ナビバーに2つのリンクがあります。コンテンツをスクロールすると、対応するナビバー項目がハイライトされます。まるでウェブページのGPSのようです!

ネストされたナビ

時々、ネストされたナビゲーションアイテムを使いたくなるかもしれません。Scrollspyはそれも対応できます。以下のようにします:

<nav id="navbar-example3" class="navbar navbar-light bg-light flex-column align-items-stretch p-3">
<a class="navbar-brand" href="#">ナビバー</a>
<nav class="nav nav-pills flex-column">
<a class="nav-link" href="#item-1">アイテム1</a>
<nav class="nav nav-pills flex-column">
<a class="nav-link ms-3 my-1" href="#item-1-1">アイテム1-1</a>
<a class="nav-link ms-3 my-1" href="#item-1-2">アイテム1-2</a>
</nav>
<a class="nav-link" href="#item-2">アイテム2</a>
</nav>
</nav>

<div data-bs-spy="scroll" data-bs-target="#navbar-example3" data-bs-offset="0" tabindex="0">
<h4 id="item-1">アイテム1</h4>
<p>...</p>
<h5 id="item-1-1">アイテム1-1</h5>
<p>...</p>
<h5 id="item-1-2">アイテム1-2</h5>
<p>...</p>
<h4 id="item-2">アイテム2</h4>
<p>...</p>
</div>

これにより、ネストされたナビゲーション構造が作成され、セクションやサブセクションをスクロールすると更新されます。まるで本の章と節がインタラクティブなようです!

リストグループ

Scrollspyはナビバーに限らず、リストグループでも使えます:

<div id="list-example" class="list-group">
<a class="list-group-item list-group-item-action" href="#list-item-1">アイテム1</a>
<a class="list-group-item list-group-item-action" href="#list-item-2">アイテム2</a>
</div>

<div data-bs-spy="scroll" data-bs-target="#list-example" data-bs-offset="0" class="scrollspy-example" tabindex="0">
<h4 id="list-item-1">アイテム1</h4>
<p>...</p>
<h4 id="list-item-2">アイテム2</h4>
<p>...</p>
</div>

これにより、リストグループが作成され、コンテンツをスクロールすると更新されます。まるで本の目次がユーザーの現在位置を知っているようです!

シンプルなアンカー

時々、フルなナビバーまたはリストグループではなく、シンプルなアンカーを使いたくなるかもしれません:

<nav id="navbar-example2" class="navbar navbar-light bg-light px-3">
<a class="navbar-brand" href="#">ナビバー</a>
<ul class="nav">
<li class="nav-item">
<a class="nav-link" href="#fat">@fat</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#mdo">@mdo</a>
</li>
</ul>
</nav>

<div data-bs-spy="scroll" data-bs-target="#navbar-example2" data-bs-offset="0" tabindex="0">
<h4 id="fat">@fat</h4>
<p>...</p>
<h4 id="mdo">@mdo</h4>
<p>...</p>
</div>

これにより、シンプルなアンカーが作成され、スクロールすると更新されます。まるでウェブページのブックマークがユーザーが到達すると光るようです!

非表示要素

Scrollspyは、最初は表示されていない要素でも動作します:

<nav id="navbar-example2" class="navbar navbar-light bg-light px-3">
<a class="navbar-brand" href="#">ナビバー</a>
<ul class="nav nav-pills">
<li class="nav-item">
<a class="nav-link" href="#fat">@fat</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#mdo">@mdo</a>
</li>
</ul>
</nav>

<div data-bs-spy="scroll" data-bs-target="#navbar-example2" data-bs-offset="0" tabindex="0">
<h4 id="fat">@fat</h4>
<p>...</p>
<h4 id="mdo">@mdo</h4>
<p>...</p>
<h4 id="one">one</h4>
<p>...</p>
<h4 id="two">two</h4>
<p>...</p>
<h4 id="three">three</h4>
<p>...</p>
</div>

<script>
var scrollSpy = new bootstrap.ScrollSpy(document.body, {
target: '#navbar-example2'
})
</script>

この例では、最初は表示されていない要素でも、表示されたときにScrollspyが動作します。まるでスパイが壁を透視できるようです!

使用方法

Scrollspyを使うには、以下の3つのことを行う必要があります:

  1. スクロールを監視したい要素にdata-bs-spy="scroll"を追加(通常は<body>)。
  2. ナビを指定するためにdata-bs-target="#navId"を追加。
  3. スクロール位置の計算に使用するピクセルを指定するためにdata-bs-offset=""を追加。

以下は使用可能なデータ属性の表です:

属性 説明
data-bs-spy スクロールspyを有効に
data-bs-target スクロールspyに使用するナビを指定
data-bs-offset スクロール位置の計算に使用するピクセルのオフセット
data-bs-method スクロールspyが現在のセクションを特定する方法

オプション

JavaScriptでScrollspyを初期化することもできます:

var scrollSpy = new bootstrap.ScrollSpy(document.body, {
target: '#navbar-example'
})

以下は使用可能なオプションの表です:

オプション タイプ デフォルト 説明
offset number 10 スクロール位置の計算に使用するピクセルのオフセット
method string 'auto' スクロールspyが現在のセクションを特定する方法
target string '' スクロールspyに使用するナビを指定

CSSプロパティ

Scrollspyは以下のCSSプロパティを使って魔法を起こします:

.scrollspy-example {
position: relative;
height: 200px;
margin-top: .5rem;
overflow: auto;
}

position: relativeoverflow: autoプロパティは、Scrollspyが正しく動作するために不可欠です。

そして、ここまででBootstrapのScrollspy機能を使うための知識を手に入れました。実践が完璧になるまで練習を続けてください。コーディングを楽しんで、スクロールが常にスムーズであることを祈っています!

Credits: Image by storyset