Lewati ke konten utama Lewati ke navigasi dokumen
Check
in English

Scrollspy

Perbarui navigasi Bootstrap atau daftar komponen grup secara otomatis berdasarkan posisi gulir untuk menunjukkan tautan mana yang saat ini aktif di viewport.

Bagaimana itu bekerja

Scrollspy mengaktifkan .activekelas pada elemen jangkar ( <a>) ketika elemen dengan idreferensi oleh jangkar di href-scroll ke tampilan. Scrollspy paling baik digunakan bersama dengan komponen Bootstrap nav atau grup daftar , tetapi itu juga akan berfungsi dengan elemen jangkar apa pun di halaman saat ini. Berikut cara kerjanya.

  • Untuk memulai, scrollspy memerlukan dua hal: navigasi, grup daftar, atau kumpulan tautan sederhana, ditambah wadah yang dapat digulir. Wadah yang dapat digulir dapat berupa <body>atau elemen khusus dengan set heightdan overflow-y: scroll.

  • Pada wadah yang dapat digulir, tambahkan data-bs-spy="scroll"dan data-bs-target="#navId"di mana navIdkeunikan idnavigasi terkait. Pastikan juga menyertakan a tabindex="0"untuk memastikan akses keyboard.

  • Saat Anda menggulir wadah "mata-mata", sebuah .activekelas ditambahkan dan dihapus dari tautan jangkar dalam navigasi terkait. Tautan harus memiliki idtarget yang dapat diselesaikan, jika tidak maka akan diabaikan. Misalnya, a <a href="#home">home</a>harus sesuai dengan sesuatu di DOM seperti<div id="home"></div>

  • Elemen target yang tidak terlihat akan diabaikan. Lihat bagian Elemen yang tidak terlihat di bawah.

Contoh

Gulir area di bawah bilah navigasi dan perhatikan perubahan kelas yang aktif. Buka menu dropdown dan lihat item dropdown juga disorot.

Judul pertama

Ini adalah beberapa konten placeholder untuk halaman scrollspy. Perhatikan bahwa saat Anda menggulir halaman ke bawah, tautan navigasi yang sesuai akan disorot. Ini diulang di seluruh contoh komponen. Kami terus menambahkan beberapa salinan contoh di sini untuk menekankan pengguliran dan penyorotan.

Judul kedua

Ini adalah beberapa konten placeholder untuk halaman scrollspy. Perhatikan bahwa saat Anda menggulir halaman ke bawah, tautan navigasi yang sesuai akan disorot. Ini diulang di seluruh contoh komponen. Kami terus menambahkan beberapa salinan contoh di sini untuk menekankan pengguliran dan penyorotan.

Judul ketiga

Ini adalah beberapa konten placeholder untuk halaman scrollspy. Perhatikan bahwa saat Anda menggulir halaman ke bawah, tautan navigasi yang sesuai akan disorot. Ini diulang di seluruh contoh komponen. Kami terus menambahkan beberapa salinan contoh di sini untuk menekankan pengguliran dan penyorotan.

Judul keempat

Ini adalah beberapa konten placeholder untuk halaman scrollspy. Perhatikan bahwa saat Anda menggulir halaman ke bawah, tautan navigasi yang sesuai akan disorot. Ini diulang di seluruh contoh komponen. Kami terus menambahkan beberapa salinan contoh di sini untuk menekankan pengguliran dan penyorotan.

Judul kelima

Ini adalah beberapa konten placeholder untuk halaman scrollspy. Perhatikan bahwa saat Anda menggulir halaman ke bawah, tautan navigasi yang sesuai akan disorot. Ini diulang di seluruh contoh komponen. Kami terus menambahkan beberapa salinan contoh di sini untuk menekankan pengguliran dan penyorotan.

<nav id="navbar-example2" class="navbar bg-light px-3 mb-3">
  <a class="navbar-brand" href="#">Navbar</a>
  <ul class="nav nav-pills">
    <li class="nav-item">
      <a class="nav-link" href="#scrollspyHeading1">First</a>
    </li>
    <li class="nav-item">
      <a class="nav-link" href="#scrollspyHeading2">Second</a>
    </li>
    <li class="nav-item dropdown">
      <a class="nav-link dropdown-toggle" data-bs-toggle="dropdown" href="#" role="button" aria-expanded="false">Dropdown</a>
      <ul class="dropdown-menu">
        <li><a class="dropdown-item" href="#scrollspyHeading3">Third</a></li>
        <li><a class="dropdown-item" href="#scrollspyHeading4">Fourth</a></li>
        <li><hr class="dropdown-divider"></li>
        <li><a class="dropdown-item" href="#scrollspyHeading5">Fifth</a></li>
      </ul>
    </li>
  </ul>
</nav>
<div data-bs-spy="scroll" data-bs-target="#navbar-example2" data-bs-root-margin="0px 0px -40%" data-bs-smooth-scroll="true" class="scrollspy-example bg-light p-3 rounded-2" tabindex="0">
  <h4 id="scrollspyHeading1">First heading</h4>
  <p>...</p>
  <h4 id="scrollspyHeading2">Second heading</h4>
  <p>...</p>
  <h4 id="scrollspyHeading3">Third heading</h4>
  <p>...</p>
  <h4 id="scrollspyHeading4">Fourth heading</h4>
  <p>...</p>
  <h4 id="scrollspyHeading5">Fifth heading</h4>
  <p>...</p>
</div>

navigasi bersarang

Scrollspy juga berfungsi dengan .navs bersarang. Jika bersarang .navadalah .active, orang tuanya juga akan .active. Gulir area di sebelah navbar dan perhatikan perubahan kelas yang aktif.

Barang 1

Ini adalah beberapa konten placeholder untuk halaman scrollspy. Perhatikan bahwa saat Anda menggulir halaman ke bawah, tautan navigasi yang sesuai akan disorot. Ini diulang di seluruh contoh komponen. Kami terus menambahkan beberapa salinan contoh di sini untuk menekankan pengguliran dan penyorotan.

Ingatlah bahwa plugin JavaScript mencoba memilih elemen yang tepat di antara semua yang mungkin terlihat. Beberapa target scrollspy yang terlihat secara bersamaan dapat menyebabkan beberapa masalah.

Butir 1-1

Ini adalah beberapa konten placeholder untuk halaman scrollspy. Perhatikan bahwa saat Anda menggulir halaman ke bawah, tautan navigasi yang sesuai akan disorot. Ini diulang di seluruh contoh komponen. Kami terus menambahkan beberapa salinan contoh di sini untuk menekankan pengguliran dan penyorotan.

Ingatlah bahwa plugin JavaScript mencoba memilih elemen yang tepat di antara semua yang mungkin terlihat. Beberapa target scrollspy yang terlihat secara bersamaan dapat menyebabkan beberapa masalah.

Butir 1-2

Ini adalah beberapa konten placeholder untuk halaman scrollspy. Perhatikan bahwa saat Anda menggulir halaman ke bawah, tautan navigasi yang sesuai akan disorot. Ini diulang di seluruh contoh komponen. Kami terus menambahkan beberapa salinan contoh di sini untuk menekankan pengguliran dan penyorotan.

Ingatlah bahwa plugin JavaScript mencoba memilih elemen yang tepat di antara semua yang mungkin terlihat. Beberapa target scrollspy yang terlihat secara bersamaan dapat menyebabkan beberapa masalah.

Butir 2

Ini adalah beberapa konten placeholder untuk halaman scrollspy. Perhatikan bahwa saat Anda menggulir halaman ke bawah, tautan navigasi yang sesuai akan disorot. Ini diulang di seluruh contoh komponen. Kami terus menambahkan beberapa salinan contoh di sini untuk menekankan pengguliran dan penyorotan.

Ingatlah bahwa plugin JavaScript mencoba memilih elemen yang tepat di antara semua yang mungkin terlihat. Beberapa target scrollspy yang terlihat secara bersamaan dapat menyebabkan beberapa masalah.

Butir 3

Ini adalah beberapa konten placeholder untuk halaman scrollspy. Perhatikan bahwa saat Anda menggulir halaman ke bawah, tautan navigasi yang sesuai akan disorot. Ini diulang di seluruh contoh komponen. Kami terus menambahkan beberapa salinan contoh di sini untuk menekankan pengguliran dan penyorotan.

Ingatlah bahwa plugin JavaScript mencoba memilih elemen yang tepat di antara semua yang mungkin terlihat. Beberapa target scrollspy yang terlihat secara bersamaan dapat menyebabkan beberapa masalah.

Butir 3-1

Ini adalah beberapa konten placeholder untuk halaman scrollspy. Perhatikan bahwa saat Anda menggulir halaman ke bawah, tautan navigasi yang sesuai akan disorot. Ini diulang di seluruh contoh komponen. Kami terus menambahkan beberapa salinan contoh di sini untuk menekankan pengguliran dan penyorotan.

Ingatlah bahwa plugin JavaScript mencoba memilih elemen yang tepat di antara semua yang mungkin terlihat. Beberapa target scrollspy yang terlihat secara bersamaan dapat menyebabkan beberapa masalah.

Butir 3-2

Ini adalah beberapa konten placeholder untuk halaman scrollspy. Perhatikan bahwa saat Anda menggulir halaman ke bawah, tautan navigasi yang sesuai akan disorot. Ini diulang di seluruh contoh komponen. Kami terus menambahkan beberapa salinan contoh di sini untuk menekankan pengguliran dan penyorotan.

Ingatlah bahwa plugin JavaScript mencoba memilih elemen yang tepat di antara semua yang mungkin terlihat. Beberapa target scrollspy yang terlihat secara bersamaan dapat menyebabkan beberapa masalah.

<div class="row">
  <div class="col-4">
    <nav id="navbar-example3" class="h-100 flex-column align-items-stretch pe-4 border-end">
      <nav class="nav nav-pills flex-column">
        <a class="nav-link" href="#item-1">Item 1</a>
        <nav class="nav nav-pills flex-column">
          <a class="nav-link ms-3 my-1" href="#item-1-1">Item 1-1</a>
          <a class="nav-link ms-3 my-1" href="#item-1-2">Item 1-2</a>
        </nav>
        <a class="nav-link" href="#item-2">Item 2</a>
        <a class="nav-link" href="#item-3">Item 3</a>
        <nav class="nav nav-pills flex-column">
          <a class="nav-link ms-3 my-1" href="#item-3-1">Item 3-1</a>
          <a class="nav-link ms-3 my-1" href="#item-3-2">Item 3-2</a>
        </nav>
      </nav>
    </nav>
  </div>

  <div class="col-8">
    <div data-bs-spy="scroll" data-bs-target="#navbar-example3" data-bs-smooth-scroll="true" class="scrollspy-example-2" tabindex="0">
      <div id="item-1">
        <h4>Item 1</h4>
        <p>...</p>
      </div>
      <div id="item-1-1">
        <h5>Item 1-1</h5>
        <p>...</p>
      </div>
      <div id="item-1-2">
        <h5>Item 1-2</h5>
        <p>...</p>
      </div>
      <div id="item-2">
        <h4>Item 2</h4>
        <p>...</p>
      </div>
      <div id="item-3">
        <h4>Item 3</h4>
        <p>...</p>
      </div>
      <div id="item-3-1">
        <h5>Item 3-1</h5>
        <p>...</p>
      </div>
      <div id="item-3-2">
        <h5>Item 3-2</h5>
        <p>...</p>
      </div>
    </div>
  </div>
</div>

Daftar grup

Scrollspy juga bekerja dengan .list-groups. Gulir area di sebelah grup daftar dan perhatikan perubahan kelas yang aktif.

Barang 1

Ini adalah beberapa konten placeholder untuk halaman scrollspy. Perhatikan bahwa saat Anda menggulir halaman ke bawah, tautan navigasi yang sesuai akan disorot. Ini diulang di seluruh contoh komponen. Kami terus menambahkan beberapa salinan contoh di sini untuk menekankan pengguliran dan penyorotan.

Butir 2

Ini adalah beberapa konten placeholder untuk halaman scrollspy. Perhatikan bahwa saat Anda menggulir halaman ke bawah, tautan navigasi yang sesuai akan disorot. Ini diulang di seluruh contoh komponen. Kami terus menambahkan beberapa salinan contoh di sini untuk menekankan pengguliran dan penyorotan.

Butir 3

Ini adalah beberapa konten placeholder untuk halaman scrollspy. Perhatikan bahwa saat Anda menggulir halaman ke bawah, tautan navigasi yang sesuai akan disorot. Ini diulang di seluruh contoh komponen. Kami terus menambahkan beberapa salinan contoh di sini untuk menekankan pengguliran dan penyorotan.

Butir 4

Ini adalah beberapa konten placeholder untuk halaman scrollspy. Perhatikan bahwa saat Anda menggulir halaman ke bawah, tautan navigasi yang sesuai akan disorot. Ini diulang di seluruh contoh komponen. Kami terus menambahkan beberapa salinan contoh di sini untuk menekankan pengguliran dan penyorotan.

<div class="row">
  <div class="col-4">
    <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>
  <div class="col-8">
    <div data-bs-spy="scroll" data-bs-target="#list-example" data-bs-smooth-scroll="true" class="scrollspy-example" tabindex="0">
      <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>
  </div>
</div>

Jangkar sederhana

Scrollspy tidak terbatas pada komponen nav dan grup daftar, jadi ini akan bekerja pada <a>elemen jangkar apa pun di dokumen saat ini. Gulir area dan saksikan .activeperubahan kelas.

Barang 1

Ini adalah beberapa konten placeholder untuk halaman scrollspy. Perhatikan bahwa saat Anda menggulir halaman ke bawah, tautan navigasi yang sesuai akan disorot. Ini diulang di seluruh contoh komponen. Kami terus menambahkan beberapa salinan contoh di sini untuk menekankan pengguliran dan penyorotan.

Butir 2

Ini adalah beberapa konten placeholder untuk halaman scrollspy. Perhatikan bahwa saat Anda menggulir halaman ke bawah, tautan navigasi yang sesuai akan disorot. Ini diulang di seluruh contoh komponen. Kami terus menambahkan beberapa salinan contoh di sini untuk menekankan pengguliran dan penyorotan.

Butir 3

Ini adalah beberapa konten placeholder untuk halaman scrollspy. Perhatikan bahwa saat Anda menggulir halaman ke bawah, tautan navigasi yang sesuai akan disorot. Ini diulang di seluruh contoh komponen. Kami terus menambahkan beberapa salinan contoh di sini untuk menekankan pengguliran dan penyorotan.

Butir 4

Ini adalah beberapa konten placeholder untuk halaman scrollspy. Perhatikan bahwa saat Anda menggulir halaman ke bawah, tautan navigasi yang sesuai akan disorot. Ini diulang di seluruh contoh komponen. Kami terus menambahkan beberapa salinan contoh di sini untuk menekankan pengguliran dan penyorotan.

Butir 5

Ini adalah beberapa konten placeholder untuk halaman scrollspy. Perhatikan bahwa saat Anda menggulir halaman ke bawah, tautan navigasi yang sesuai akan disorot. Ini diulang di seluruh contoh komponen. Kami terus menambahkan beberapa salinan contoh di sini untuk menekankan pengguliran dan penyorotan.

<div class="row">
  <div class="col-4">
    <div id="simple-list-example" class="d-flex flex-column gap-2 simple-list-example-scrollspy text-center">
      <a class="p-1 rounded" href="#simple-list-item-1">Item 1</a>
      <a class="p-1 rounded" href="#simple-list-item-2">Item 2</a>
      <a class="p-1 rounded" href="#simple-list-item-3">Item 3</a>
      <a class="p-1 rounded" href="#simple-list-item-4">Item 4</a>
      <a class="p-1 rounded" href="#simple-list-item-5">Item 5</a>
    </div>
  </div>
  <div class="col-8">
    <div data-bs-spy="scroll" data-bs-target="#simple-list-example" data-bs-offset="0" data-bs-smooth-scroll="true" class="scrollspy-example" tabindex="0">
      <h4 id="simple-list-item-1">Item 1</h4>
      <p>...</p>
      <h4 id="simple-list-item-2">Item 2</h4>
      <p>...</p>
      <h4 id="simple-list-item-3">Item 3</h4>
      <p>...</p>
      <h4 id="simple-list-item-4">Item 4</h4>
      <p>...</p>
      <h4 id="simple-list-item-5">Item 5</h4>
      <p>...</p>
    </div>
  </div>
</div>

Elemen yang tidak terlihat

Elemen target yang tidak terlihat akan diabaikan dan item navigasi yang sesuai tidak akan menerima .activekelas. Instance Scrollspy yang diinisialisasi dalam pembungkus yang tidak terlihat akan mengabaikan semua elemen target. Gunakan refreshmetode untuk memeriksa elemen yang dapat diamati setelah pembungkus terlihat.

document.querySelectorAll('#nav-tab>[data-bs-toggle="tab"]').forEach(el => {
  el.addEventListener('shown.bs.tab', () => {
    const target = el.getAttribute('data-bs-target')
    const scrollElem = document.querySelector(`${target} [data-bs-spy="scroll"]`)
    bootstrap.ScrollSpy.getOrCreateInstance(scrollElem).refresh()
  })
})

Penggunaan

Melalui atribut data

Untuk dengan mudah menambahkan perilaku scrollspy ke navigasi bilah atas Anda, tambahkan data-bs-spy="scroll"ke elemen yang ingin Anda mata-matai (biasanya ini adalah <body>). Kemudian tambahkan data-bs-targetatribut dengan idnama kelas or dari elemen induk dari setiap .navkomponen Bootstrap.

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

Melalui JavaScript

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

Pilihan

Karena opsi dapat diteruskan melalui atribut data atau JavaScript, Anda dapat menambahkan nama opsi ke data-bs-, seperti pada data-bs-animation="{value}". Pastikan untuk mengubah jenis huruf dari nama opsi dari “ camelCase ” menjadi “ kebab-case ” saat meneruskan opsi melalui atribut data. Misalnya, gunakan data-bs-custom-class="beautifier"alih-alih data-bs-customClass="beautifier".

Pada Bootstrap 5.2.0, semua komponen mendukung atribut data cadangan eksperimentaldata-bs-config yang dapat menampung konfigurasi komponen sederhana sebagai string JSON. Ketika suatu elemen memiliki data-bs-config='{"delay":0, "title":123}'dan data-bs-title="456"atribut, nilai akhir titleakan menjadi 456dan atribut data yang terpisah akan menimpa nilai yang diberikan pada data-bs-config. Selain itu, atribut data yang ada dapat menampung nilai JSON seperti data-bs-delay='{"show":0,"hide":150}'.

Nama Jenis Bawaan Keterangan
rootMargin rangkaian 0px 0px -25% Intersection Observer rootMargin unit valid, saat menghitung posisi gulir.
smoothScroll boolean false Memungkinkan pengguliran yang mulus saat pengguna mengeklik tautan yang merujuk ke ScrollSpy yang dapat diamati.
target string, elemen DOM null Menentukan elemen untuk menerapkan plugin Scrollspy.
threshold Himpunan [0.1, 0.5, 1] IntersectionObserver ambang input yang valid, saat menghitung posisi gulir.

Opsi yang Tidak Digunakan Lagi

Hingga v5.1.3 kami menggunakan offset& methodopsi, yang sekarang tidak digunakan lagi dan digantikan oleh rootMargin. Untuk menjaga kompatibilitas mundur, kami akan terus mengurai yang diberikan offsetke rootMargin, tetapi fitur ini akan dihapus di v6 .

Metode

metode Keterangan
dispose Menghancurkan scrollspy elemen. (Menghapus data yang tersimpan pada elemen DOM)
getInstance Metode statis untuk mendapatkan instance scrollspy yang terkait dengan elemen DOM.
getOrCreateInstance Metode statis untuk mendapatkan instance scrollspy yang terkait dengan elemen DOM, atau untuk membuat yang baru jika tidak diinisialisasi.
refresh Saat menambahkan atau menghapus elemen di DOM, Anda harus memanggil metode refresh.

Berikut ini contoh menggunakan metode refresh:

const dataSpyList = document.querySelectorAll('[data-bs-spy="scroll"]')
dataSpyList.forEach(dataSpyEl => {
  bootstrap.ScrollSpy.getInstance(dataSpyEl).refresh()
})

Acara

Peristiwa Keterangan
activate.bs.scrollspy Acara ini diaktifkan pada elemen gulir setiap kali jangkar diaktifkan oleh scrollspy.
const firstScrollSpyEl = document.querySelector('[data-bs-spy="scroll"]')
firstScrollSpyEl.addEventListener('activate.bs.scrollspy', () => {
  // do something...
})