Treci la conținutul principal Treceți la navigarea documentelor
Check
in English

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ă .activeclasa pe <a>elementele ancoră ( ) atunci când elementul la care idface referire ancoră hrefeste 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 set heightși overflow-y: scroll.

  • Pe containerul care poate fi derulat, adăugați data-bs-spy="scroll"și data-bs-target="#navId"unde navIdeste unicul idnavigației asociate. Asigurați-vă că includeți și un tabindex="0"pentru a asigura accesul la tastatură.

  • Pe măsură ce derulați containerul „spionat”, o .activeclasă este adăugată și eliminată din linkurile de ancorare din navigația asociată. Linkurile trebuie să aibă ținte rezolvabile id, 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

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 .navs imbricate. Dacă un imbricat .naveste .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-groups. 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 .activeschimbă 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 .activeclasă. Instanțele Scrollspy inițializate într-un wrapper nevizibil vor ignora toate elementele țintă. Utilizați refreshmetoda 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-targetatributul cu numele idsau clasa elementului părinte al oricărei .navcomponente 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ă titleva 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& methodopțiuni, care acum sunt depreciate și înlocuite cu rootMargin. Pentru a menține compatibilitatea cu versiunea anterioară, vom continua să analizăm o dată offsetla 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...
})