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 .active
kelas pada elemen jangkar ( <a>
) ketika elemen dengan id
referensi 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 setheight
danoverflow-y: scroll
. -
Pada wadah yang dapat digulir, tambahkan
data-bs-spy="scroll"
dandata-bs-target="#navId"
di mananavId
keunikanid
navigasi terkait. Pastikan juga menyertakan atabindex="0"
untuk memastikan akses keyboard. -
Saat Anda menggulir wadah "mata-mata", sebuah
.active
kelas ditambahkan dan dihapus dari tautan jangkar dalam navigasi terkait. Tautan harus memilikiid
target 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
navigasi
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 .nav
s bersarang. Jika bersarang .nav
adalah .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-group
s. 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 .active
perubahan 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 .active
kelas. Instance Scrollspy yang diinisialisasi dalam pembungkus yang tidak terlihat akan mengabaikan semua elemen target. Gunakan refresh
metode 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-target
atribut dengan id
nama kelas or dari elemen induk dari setiap .nav
komponen 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 title
akan menjadi 456
dan 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
& method
opsi, yang sekarang tidak digunakan lagi dan digantikan oleh rootMargin
. Untuk menjaga kompatibilitas mundur, kami akan terus mengurai yang diberikan offset
ke 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...
})