Scrollspy
Actualizați automat navigarea Bootstrap sau listați componentele grupului pe baza poziției de defilare pentru a indica ce link este activ în prezent în fereastra de vizualizare.
Cum functioneaza
Scrollspy comută .active
clasa pe <a>
elementele ancoră ( ) atunci când elementul la care id
face referire ancoră href
este derulat la vedere. Scrollspy este cel mai bine utilizat împreună cu o componentă de navigare Bootstrap sau cu un grup de liste , dar va funcționa și cu orice elemente de ancorare din pagina curentă. Iată cum funcționează.
-
Pentru a începe, scrollspy necesită două lucruri: o navigare, un grup de liste sau un simplu set de link-uri, plus un container care poate fi derulat. Containerul derulabil poate fi
<body>
sau un element personalizat cu un setheight
șioverflow-y: scroll
. -
Pe containerul care poate fi derulat, adăugați
data-bs-spy="scroll"
șidata-bs-target="#navId"
undenavId
este uniculid
navigației asociate. Asigurați-vă că includeți și untabindex="0"
pentru a asigura accesul la tastatură. -
Pe măsură ce derulați containerul „spionat”, o
.active
clasă este adăugată și eliminată din linkurile de ancorare din navigația asociată. Linkurile trebuie să aibă ținte rezolvabileid
, altfel sunt ignorate. De exemplu, un<a href="#home">home</a>
trebuie să corespundă cu ceva în DOM ca<div id="home"></div>
-
Elementele țintă care nu sunt vizibile vor fi ignorate. Consultați secțiunea Elemente nevizibile de mai jos.
Exemple
Bara de navigare
Derulați zona de sub bara de navigare și urmăriți schimbarea clasei active. Deschideți meniul drop-down și urmăriți ca elementele drop-down sunt, de asemenea, evidențiate.
Primul titlu
Acesta este un conținut substituent pentru pagina scrollspy. Rețineți că pe măsură ce derulați în jos în pagină, linkul de navigare corespunzător este evidențiat. Se repetă în întregul exemplu de componentă. Continuăm să adăugăm câteva exemple de copie aici pentru a sublinia derularea și evidențierea.
Al doilea titlu
Acesta este un conținut substituent pentru pagina scrollspy. Rețineți că pe măsură ce derulați în jos în pagină, linkul de navigare corespunzător este evidențiat. Se repetă în întregul exemplu de componentă. Continuăm să adăugăm câteva exemple de copie aici pentru a sublinia derularea și evidențierea.
Al treilea titlu
Acesta este un conținut substituent pentru pagina scrollspy. Rețineți că pe măsură ce derulați în jos în pagină, linkul de navigare corespunzător este evidențiat. Se repetă în întregul exemplu de componentă. Continuăm să adăugăm câteva exemple de copie aici pentru a sublinia derularea și evidențierea.
Al patrulea titlu
Acesta este un conținut substituent pentru pagina scrollspy. Rețineți că pe măsură ce derulați în jos în pagină, linkul de navigare corespunzător este evidențiat. Se repetă în întregul exemplu de componentă. Continuăm să adăugăm câteva exemple de copie aici pentru a sublinia derularea și evidențierea.
Al cincilea titlu
Acesta este un conținut substituent pentru pagina scrollspy. Rețineți că pe măsură ce derulați în jos în pagină, linkul de navigare corespunzător este evidențiat. Se repetă în întregul exemplu de componentă. Continuăm să adăugăm câteva exemple de copie aici pentru a sublinia derularea și evidențierea.
<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>
Navigare imbricată
Scrollspy funcționează și cu .nav
s imbricate. Dacă un imbricat .nav
este .active
, părinții săi vor fi și .active
. Derulați zona de lângă bara de navigare și urmăriți schimbarea clasei active.
Punctul 1
Acesta este un conținut substituent pentru pagina scrollspy. Rețineți că pe măsură ce derulați în jos în pagină, linkul de navigare corespunzător este evidențiat. Se repetă în întregul exemplu de componentă. Continuăm să adăugăm câteva exemple de copie aici pentru a sublinia derularea și evidențierea.
Rețineți că pluginul JavaScript încearcă să aleagă elementul potrivit dintre tot ceea ce poate fi vizibil. Mai multe ținte scrollspy vizibile în același timp pot cauza unele probleme.
Punctul 1-1
Acesta este un conținut substituent pentru pagina scrollspy. Rețineți că pe măsură ce derulați în jos în pagină, linkul de navigare corespunzător este evidențiat. Se repetă în întregul exemplu de componentă. Continuăm să adăugăm câteva exemple de copie aici pentru a sublinia derularea și evidențierea.
Rețineți că pluginul JavaScript încearcă să aleagă elementul potrivit dintre tot ceea ce poate fi vizibil. Mai multe ținte scrollspy vizibile în același timp pot cauza unele probleme.
Punctul 1-2
Acesta este un conținut substituent pentru pagina scrollspy. Rețineți că pe măsură ce derulați în jos în pagină, linkul de navigare corespunzător este evidențiat. Se repetă în întregul exemplu de componentă. Continuăm să adăugăm câteva exemple de copie aici pentru a sublinia derularea și evidențierea.
Rețineți că pluginul JavaScript încearcă să aleagă elementul potrivit dintre tot ceea ce poate fi vizibil. Mai multe ținte scrollspy vizibile în același timp pot cauza unele probleme.
Punctul 2
Acesta este un conținut substituent pentru pagina scrollspy. Rețineți că pe măsură ce derulați în jos în pagină, linkul de navigare corespunzător este evidențiat. Se repetă în întregul exemplu de componentă. Continuăm să adăugăm câteva exemple de copie aici pentru a sublinia derularea și evidențierea.
Rețineți că pluginul JavaScript încearcă să aleagă elementul potrivit dintre tot ceea ce poate fi vizibil. Mai multe ținte scrollspy vizibile în același timp pot cauza unele probleme.
Punctul 3
Acesta este un conținut substituent pentru pagina scrollspy. Rețineți că pe măsură ce derulați în jos în pagină, linkul de navigare corespunzător este evidențiat. Se repetă în întregul exemplu de componentă. Continuăm să adăugăm câteva exemple de copie aici pentru a sublinia derularea și evidențierea.
Rețineți că pluginul JavaScript încearcă să aleagă elementul potrivit dintre tot ceea ce poate fi vizibil. Mai multe ținte scrollspy vizibile în același timp pot cauza unele probleme.
Punctul 3-1
Acesta este un conținut substituent pentru pagina scrollspy. Rețineți că pe măsură ce derulați în jos în pagină, linkul de navigare corespunzător este evidențiat. Se repetă în întregul exemplu de componentă. Continuăm să adăugăm câteva exemple de copie aici pentru a sublinia derularea și evidențierea.
Rețineți că pluginul JavaScript încearcă să aleagă elementul potrivit dintre tot ceea ce poate fi vizibil. Mai multe ținte scrollspy vizibile în același timp pot cauza unele probleme.
Punctul 3-2
Acesta este un conținut substituent pentru pagina scrollspy. Rețineți că pe măsură ce derulați în jos în pagină, linkul de navigare corespunzător este evidențiat. Se repetă în întregul exemplu de componentă. Continuăm să adăugăm câteva exemple de copie aici pentru a sublinia derularea și evidențierea.
Rețineți că pluginul JavaScript încearcă să aleagă elementul potrivit dintre tot ceea ce poate fi vizibil. Mai multe ținte scrollspy vizibile în același timp pot cauza unele probleme.
<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>
Lista grupului
Scrollspy funcționează și cu .list-group
s. Derulați zona de lângă grupul de listă și urmăriți schimbarea clasei active.
Punctul 1
Acesta este un conținut substituent pentru pagina scrollspy. Rețineți că pe măsură ce derulați în jos în pagină, linkul de navigare corespunzător este evidențiat. Se repetă în întregul exemplu de componentă. Continuăm să adăugăm câteva exemple de copie aici pentru a sublinia derularea și evidențierea.
Punctul 2
Acesta este un conținut substituent pentru pagina scrollspy. Rețineți că pe măsură ce derulați în jos în pagină, linkul de navigare corespunzător este evidențiat. Se repetă în întregul exemplu de componentă. Continuăm să adăugăm câteva exemple de copie aici pentru a sublinia derularea și evidențierea.
Punctul 3
Acesta este un conținut substituent pentru pagina scrollspy. Rețineți că pe măsură ce derulați în jos în pagină, linkul de navigare corespunzător este evidențiat. Se repetă în întregul exemplu de componentă. Continuăm să adăugăm câteva exemple de copie aici pentru a sublinia derularea și evidențierea.
Punctul 4
Acesta este un conținut substituent pentru pagina scrollspy. Rețineți că pe măsură ce derulați în jos în pagină, linkul de navigare corespunzător este evidențiat. Se repetă în întregul exemplu de componentă. Continuăm să adăugăm câteva exemple de copie aici pentru a sublinia derularea și evidențierea.
<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>
Ancore simple
Scrollspy nu se limitează la componentele de navigare și la grupurile de liste, așa că va funcționa pe orice <a>
elemente de ancorare din documentul curent. Derulați zona și urmăriți cum se .active
schimbă clasa.
Punctul 1
Acesta este un conținut substituent pentru pagina scrollspy. Rețineți că pe măsură ce derulați în jos în pagină, linkul de navigare corespunzător este evidențiat. Se repetă în întregul exemplu de componentă. Continuăm să adăugăm câteva exemple de copie aici pentru a sublinia derularea și evidențierea.
Punctul 2
Acesta este un conținut substituent pentru pagina scrollspy. Rețineți că pe măsură ce derulați în jos în pagină, linkul de navigare corespunzător este evidențiat. Se repetă în întregul exemplu de componentă. Continuăm să adăugăm câteva exemple de copie aici pentru a sublinia derularea și evidențierea.
Punctul 3
Acesta este un conținut substituent pentru pagina scrollspy. Rețineți că pe măsură ce derulați în jos în pagină, linkul de navigare corespunzător este evidențiat. Se repetă în întregul exemplu de componentă. Continuăm să adăugăm câteva exemple de copie aici pentru a sublinia derularea și evidențierea.
Punctul 4
Acesta este un conținut substituent pentru pagina scrollspy. Rețineți că pe măsură ce derulați în jos în pagină, linkul de navigare corespunzător este evidențiat. Se repetă în întregul exemplu de componentă. Continuăm să adăugăm câteva exemple de copie aici pentru a sublinia derularea și evidențierea.
Punctul 5
Acesta este un conținut substituent pentru pagina scrollspy. Rețineți că pe măsură ce derulați în jos în pagină, linkul de navigare corespunzător este evidențiat. Se repetă în întregul exemplu de componentă. Continuăm să adăugăm câteva exemple de copie aici pentru a sublinia derularea și evidențierea.
<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>
Elemente nevizibile
Elementele țintă care nu sunt vizibile vor fi ignorate, iar elementele lor de navigare corespunzătoare nu vor primi o .active
clasă. Instanțele Scrollspy inițializate într-un wrapper nevizibil vor ignora toate elementele țintă. Utilizați refresh
metoda pentru a verifica elementele observabile odată ce ambalajul devine vizibil.
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()
})
})
Utilizare
Prin atribute de date
Pentru a adăuga cu ușurință comportamentul scrollspy la navigarea din bara de sus, adăugați data-bs-spy="scroll"
la elementul pe care doriți să îl spionați (de obicei, acesta ar fi <body>
). Apoi adăugați data-bs-target
atributul cu numele id
sau clasa elementului părinte al oricărei .nav
componente 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>
Prin JavaScript
const scrollSpy = new bootstrap.ScrollSpy(document.body, {
target: '#navbar-example'
})
Opțiuni
Deoarece opțiunile pot fi transmise prin atribute de date sau JavaScript, puteți adăuga un nume de opțiune la data-bs-
, ca în data-bs-animation="{value}"
. Asigurați-vă că schimbați tipul de caz al numelui opțiunii din „ camelCase ” în „ kebab-case ” atunci când treceți opțiunile prin atributele de date. De exemplu, utilizați data-bs-custom-class="beautifier"
în loc de data-bs-customClass="beautifier"
.
Începând cu Bootstrap 5.2.0, toate componentele acceptă un atribut de date rezervat experimentaldata-bs-config
care poate găzdui configurarea simplă a componentelor ca șir JSON. Când un element are data-bs-config='{"delay":0, "title":123}'
și data-bs-title="456"
atribute, valoarea finală title
va fi 456
și atributele de date separate vor înlocui valorile date pe data-bs-config
. În plus, atributele de date existente pot găzdui valori JSON precum data-bs-delay='{"show":0,"hide":150}'
.
Nume | Tip | Mod implicit | Descriere |
---|---|---|---|
rootMargin |
şir | 0px 0px -25% |
Intersection Observer rootMargin unități valide, la calcularea poziției derulării. |
smoothScroll |
boolean | false |
Permite derularea lină atunci când un utilizator face clic pe un link care se referă la observabile ScrollSpy. |
target |
șir, element DOM | null |
Specifică elementul pentru a aplica pluginul Scrollspy. |
threshold |
matrice | [0.1, 0.5, 1] |
IntersectionObserver prag de intrare validă, atunci când se calculează poziţia de defilare. |
Opțiuni depreciate
Până la v5.1.3 am folosit offset
& method
opțiuni, care acum sunt depreciate și înlocuite cu rootMargin
. Pentru a menține compatibilitatea cu versiunea anterioară, vom continua să analizăm o dată offset
la rootMargin
, dar această caracteristică va fi eliminată în v6 .
Metode
Metodă | Descriere |
---|---|
dispose |
Distruge scrollspy-ul unui element. (Elimină datele stocate pe elementul DOM) |
getInstance |
Metodă statică pentru a obține instanța scrollspy asociată cu un element DOM. |
getOrCreateInstance |
Metodă statică pentru a obține instanța scrollspy asociată cu un element DOM sau pentru a crea unul nou în cazul în care nu a fost inițializat. |
refresh |
Când adăugați sau eliminați elemente în DOM, va trebui să apelați metoda de reîmprospătare. |
Iată un exemplu de utilizare a metodei de reîmprospătare:
const dataSpyList = document.querySelectorAll('[data-bs-spy="scroll"]')
dataSpyList.forEach(dataSpyEl => {
bootstrap.ScrollSpy.getInstance(dataSpyEl).refresh()
})
Evenimente
Eveniment | Descriere |
---|---|
activate.bs.scrollspy |
Acest eveniment se declanșează asupra elementului de defilare ori de câte ori o ancoră este activată de scrollspy. |
const firstScrollSpyEl = document.querySelector('[data-bs-spy="scroll"]')
firstScrollSpyEl.addEventListener('activate.bs.scrollspy', () => {
// do something...
})