Bootstrapでスクロールスパイ(Scrollspy)を作る方法

Bootstrapでスクロールスパイ(Scrollspy)を作る方法

実装方法

Bootstrap導入

まず、BootstrapのCSSファイルとJSファイルを読み込みます。

<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous">
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/js/bootstrap.bundle.min.js" integrity="sha384-MrcW6ZMFYlzcLA8Nl+NtUVF0sA7MsXsP1UyJoMp4YLEuNSfAP+JcXn/tWtIaxVXM" crossorigin="anonymous"></script>

導入方法の詳細は、以下のページをご覧ください。

スクロールスパイ実装

  • nav component or list group 上で使用する必要があります。
  • 通常は の <body>にposition: relative; を設定します。
  • <body>以外の要素で使用する場合は、height を設定し、overflow-y: scroll; を設定します。
  • アンカー (<a>)は必須で、その id を持たさなければなりません。
<body>に設定する方法
<body data-bs-spy="scroll" data-bs-target="#navbar-example" style="position: relative;">
  ...
</body>

<body>に設定する場合には、二つの属性(「data-bs-spy」と「data-bs-target」)を設定し、スタイルに「position:relative」を設定してください。

「data-bs-spy」にはscrollを、「data-bs-target」には、ナビゲーションオブジェクトのIDを指定してください。

<body data-bs-spy="scroll" data-bs-target="#navbar-example" style="position: relative;">
  ...
  <div id="navbar-example">
    <ul class="nav nav-tabs" role="tablist">
      ...
    </ul>
  </div>
  ...
</body>

最後に表示エリアとナビゲーションメニューをアンカータグ(<a>)で実装して、紐づければ、完了です。

<body data-bs-spy="scroll" data-bs-target="#navbar-example" style="position: relative;">
  ...
  <div id="navbar-example">
    <ul class="nav nav-tabs" role="tablist">
      <li class="nav-item">
        <a class="nav-link" href="#scrollspyHeading1">1番目</a>
      </li>
    </ul>
  </div>
  <div id="scrollspyHeading1" >
    <h1>セクション1</h1>
    <div style="height:500px"></div>
  </div>
</body>

<body>以外に設定する場合
<div
  data-bs-spy="scroll"
  data-bs-target="#navbar-example2"
  data-bs-offset="0"
  class="scrollspy-example"
  tabindex="0"
  style="position:relative;height:500px;margin-top:.5rem;overflow:auto"
>
  <h4 id="scrollspyHeading1">第1セクション</h4>
  <p><div style="height:500px"></div></p>
    ...
</div>

<body>以外で設定する場合には、コンテンツエリアに対して属性「data-bs-spy」と「data-bs-target」を設定してください。

「data-bs-target」はナビゲーションエリアのIDと紐づけてください。

<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">1番目</a>
    </li>
      ...
  </ul>
</nav>

<div
  data-bs-spy="scroll"
  data-bs-target="#navbar-example2"
  data-bs-offset="0"
  class="scrollspy-example"
  tabindex="0"
  style="position:relative;height:500px;margin-top:.5rem;overflow:auto"
>
  <h4 id="scrollspyHeading1">第1セクション</h4>
  <p><div style="height:500px"></div></p>
    ...
</div>

最後に表示エリアとナビゲーションメニューをアンカータグ(<a>)で実装して、紐づければ、完了です。

<body>に設定する場合のサンプル

<body>に設定するサンプルが以下のデモページとHTMLコードになります。

デモ

HTMLコード

<!DOCTYPE html>
<html>
<head>
   <meta charset="utf-8" />
   <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1" />
   <title>Bootstrap Scrollspy demo(1)</title>
   <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous">
  <!-- JSファイル読み込み -->
  <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/js/bootstrap.bundle.min.js" integrity="sha384-MrcW6ZMFYlzcLA8Nl+NtUVF0sA7MsXsP1UyJoMp4YLEuNSfAP+JcXn/tWtIaxVXM" crossorigin="anonymous"></script>
</head>
<body data-bs-spy="scroll" data-bs-target="#navbar-example" style="position: relative;">
  <div class="container">
    <div class="row">
      <div>
        <div id="navbar-example" class="sticky-top bg-light " >
          <ul class="nav nav-tabs nav-pills" role="tablist">
          <li class="nav-item">
            <a class="nav-link" href="#scrollspyHeading1">1番目</a>
          </li>
          <li class="nav-item">
            <a class="nav-link" href="#scrollspyHeading2">2番目</a>
          </li>
          <li class="nav-item">
            <a class="nav-link" href="#scrollspyHeading3">3番目</a>
          </li>
          </ul>
        </div>
        <div id="scrollspyHeading1" >
          <h1>セクション1</h1>
          <div style="height:500px"></div>
        </div>
        <div id="scrollspyHeading2" >
          <h1>セクション2</h1>
          <div style="height:500px"></div>
        </div>
        <div id="scrollspyHeading3" >
          <h1>セクション3</h1>
          <div style="height:500px"></div>
        </div>
      </div>
    </div><!-- row -->
  </div><!-- container -->
</body>
</html>

<body>以外に設定する場合のサンプル

<body>以外に設定する場合のサンプルが以下のデモページとHTMLコードになります。

デモ

HTMLコード

<!DOCTYPE html>
<html>
<head>
   <meta charset="utf-8" />
   <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1" />
   <title>Bootstrap Scrollspy demo(2)</title>
   <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous">
  <!-- JSファイル読み込み -->
  <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/js/bootstrap.bundle.min.js" integrity="sha384-MrcW6ZMFYlzcLA8Nl+NtUVF0sA7MsXsP1UyJoMp4YLEuNSfAP+JcXn/tWtIaxVXM" crossorigin="anonymous"></script>
</head>
<body>
  <div class="container">
    <div class="row">
      <div>
        <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">1番目</a>
            </li>
            <li class="nav-item">
              <a class="nav-link" href="#scrollspyHeading2">2番目</a>
            </li>
            <li class="nav-item dropdown">
              <a
                class="nav-link dropdown-toggle"
                data-bs-toggle="dropdown"
                href="#"
                role="button"
                aria-expanded="false"
                >ドロップダウン</a
              >
              <ul class="dropdown-menu">
                <li><a class="dropdown-item" href="#scrollspyHeading3">3番目</a></li>
                <li><a class="dropdown-item" href="#scrollspyHeading4">4番目</a></li>
                <li><hr class="dropdown-divider" /></li>
                <li><a class="dropdown-item" href="#scrollspyHeading5">5番目</a></li>
              </ul>
            </li>
          </ul>
        </nav>
        <div
          data-bs-spy="scroll"
          data-bs-target="#navbar-example2"
          data-bs-offset="0"
          class="scrollspy-example"
          tabindex="0"
          style="position:relative;height:500px;margin-top:.5rem;overflow:auto"
        >
          <h4 id="scrollspyHeading1">第1セクション</h4>
          <p><div style="height:500px"></div></p>
          <h4 id="scrollspyHeading2">第2セクション</h4>
          <p><div style="height:500px"></div></p>
          <h4 id="scrollspyHeading3">第3セクション</h4>
          <p><div style="height:500px"></div></p>
          <h4 id="scrollspyHeading4">第4セクション</h4>
          <p><div style="height:500px"></div></p>
          <h4 id="scrollspyHeading5">第5セクション</h4>
          <p><div style="height:500px"></div></p>
        </div>
      </div>
    </div><!-- row -->
  </div><!-- container -->
</body>
</html>

ネストされたナビのサンプル

デモ

<!DOCTYPE html>
<html>
<head>
   <meta charset="utf-8" />
   <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1" />
   <title>Bootstrap Scrollspy demo(3)</title>
   <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous">
  <!-- JSファイル読み込み -->
  <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/js/bootstrap.bundle.min.js" integrity="sha384-MrcW6ZMFYlzcLA8Nl+NtUVF0sA7MsXsP1UyJoMp4YLEuNSfAP+JcXn/tWtIaxVXM" crossorigin="anonymous"></script>
</head>
<body data-bs-spy="scroll" data-bs-target="#navbar-example3" style="position: relative;">
  <div class="container">
    <div class="row">
      <div class="col-3 ">
        <nav
          id="navbar-example3"
          class="navbar navbar-light bg-light flex-column align-items-stretch p-3 sticky-top "
        >
          <a class="navbar-brand" href="#">ナビゲーションバー</a>
          <nav class="nav nav-pills flex-column">
            <a class="nav-link" hre	f="#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>
            <a class="nav-link" href="#item-3">項目 3</a>
            <nav class="nav nav-pills flex-column">
              <a class="nav-link ms-3 my-1" href="#item-3-1">項目 3-1</a>
              <a class="nav-link ms-3 my-1" href="#item-3-2">項目 3-2</a>
            </nav>
          </nav>
        </nav>
      </div>
      <div class="col-9">
        <div>
          <h4 id="item-1">項目 1</h4>
          <p><div style="height:500px"></div></p>
          <h5 id="item-1-1">項目 1-1</h5>
          <p><div style="height:500px"></div></p>
          <h5 id="item-1-2">項目 1-2</h5>
          <p><div style="height:500px"></div></p>
          <h4 id="item-2">項目 2</h4>
          <p><div style="height:500px"></div></p>
          <h4 id="item-3">項目 3</h4>
          <p><div style="height:500px"></div></p>
          <h5 id="item-3-1">項目 3-1</h5>
          <p><div style="height:500px"></div></p>
          <h5 id="item-3-2">項目 3-2</h5>
          <p><div style="height:500px"></div></p>
        </div>
      </div>
    </div><!-- row -->
  </div><!-- container -->
</body>
</html>

list-groupのサンプル

デモ

HTMLコード

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1" />
  <title>Bootstrap Scrollspy demo(3)</title>
  <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous">
  <!-- JSファイル読み込み -->
  <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/js/bootstrap.bundle.min.js" integrity="sha384-MrcW6ZMFYlzcLA8Nl+NtUVF0sA7MsXsP1UyJoMp4YLEuNSfAP+JcXn/tWtIaxVXM" crossorigin="anonymous"></script>
</head>
<body data-bs-spy="scroll" data-bs-target="#list-example" style="position: relative;">
  <div class="container">
    <div class="row">
      <div class="col-3 ">
        <div id="list-example" class="list-group sticky-top">
          <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>
          <a class="list-group-item list-group-item-action" href="#list-item-3">項目3</a>
          <a class="list-group-item list-group-item-action" href="#list-item-4">項目4</a>
        </div>
      </div>
      <div class="col-9">
        <div>
          <h4 id="list-item-1">項目1</h4>
          <p><div style="height:500px"></div></p>
          <h4 id="list-item-2">項目2</h4>
          <p><div style="height:500px"></div></p>
          <h4 id="list-item-3">項目3</h4>
          <p><div style="height:500px"></div></p>
          <h4 id="list-item-4">項目4</h4>
          <p><div style="height:500px"></div></p>
        </div>
      </div>
    </div><!-- row -->
  </div><!-- container -->
</body>
</html>

ご参考

関連ページ