Ga naar hoofdinhoud Ga naar navigatie in documenten
Check
in English

Scrollspy

Update automatisch Bootstrap-navigatie of lijstgroepcomponenten op basis van schuifpositie om aan te geven welke link momenteel actief is in de viewport.

Hoe het werkt

Scrollspy schakelt de .activeklasse op anker ( <a>) -elementen wanneer het element met de idwaarnaar wordt verwezen door het anker in hrefbeeld wordt gescrolld. Scrollspy kan het beste worden gebruikt in combinatie met een Bootstrap - navigatiecomponent of lijstgroep , maar het werkt ook met alle ankerelementen op de huidige pagina. Dit is hoe het werkt.

  • Om te beginnen heeft scrollspy twee dingen nodig: een navigatie, lijstgroep of een eenvoudige set links, plus een schuifbare container. De schuifbare container kan het <body>of een aangepast element zijn met een set heighten overflow-y: scroll.

  • Voeg op de schuifbare container toe data-bs-spy="scroll"en data-bs-target="#navId"waar navIdis het unieke idvan de bijbehorende navigatie. Zorg ervoor dat u ook een a tabindex="0"toevoegt om toegang tot het toetsenbord te garanderen.

  • Terwijl u door de "bespioneerde" container bladert, wordt een .activeklasse toegevoegd aan en verwijderd uit ankerlinks binnen de bijbehorende navigatie. Links moeten oplosbare iddoelen hebben, anders worden ze genegeerd. Een <a href="#home">home</a>moet bijvoorbeeld overeenkomen met iets in de DOM zoals<div id="home"></div>

  • Doelelementen die niet zichtbaar zijn, worden genegeerd. Zie de sectie Niet-zichtbare elementen hieronder.

Voorbeelden

Scroll door het gebied onder de navigatiebalk en kijk hoe de actieve klas verandert. Open het vervolgkeuzemenu en kijk hoe de vervolgkeuzelijsten ook worden gemarkeerd.

Eerste rubriek

Dit is wat tijdelijke inhoud voor de scrollspy-pagina. Houd er rekening mee dat wanneer u door de pagina bladert, de juiste navigatielink wordt gemarkeerd. Het wordt in het hele componentvoorbeeld herhaald. We blijven hier nog wat voorbeeldkopieën toevoegen om het scrollen en markeren te benadrukken.

Tweede rubriek

Dit is wat tijdelijke inhoud voor de scrollspy-pagina. Houd er rekening mee dat wanneer u door de pagina bladert, de juiste navigatielink wordt gemarkeerd. Het wordt in het hele componentvoorbeeld herhaald. We blijven hier nog wat voorbeeldkopieën toevoegen om het scrollen en markeren te benadrukken.

derde rubriek

Dit is wat tijdelijke inhoud voor de scrollspy-pagina. Houd er rekening mee dat wanneer u door de pagina bladert, de juiste navigatielink wordt gemarkeerd. Het wordt in het hele componentvoorbeeld herhaald. We blijven hier nog wat voorbeeldkopieën toevoegen om het scrollen en markeren te benadrukken.

vierde rubriek

Dit is wat tijdelijke inhoud voor de scrollspy-pagina. Houd er rekening mee dat wanneer u door de pagina bladert, de juiste navigatielink wordt gemarkeerd. Het wordt in het hele componentvoorbeeld herhaald. We blijven hier nog wat voorbeeldkopieën toevoegen om het scrollen en markeren te benadrukken.

vijfde rubriek

Dit is wat tijdelijke inhoud voor de scrollspy-pagina. Houd er rekening mee dat wanneer u door de pagina bladert, de juiste navigatielink wordt gemarkeerd. Het wordt in het hele componentvoorbeeld herhaald. We blijven hier nog wat voorbeeldkopieën toevoegen om het scrollen en markeren te benadrukken.

<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>

Geneste navigatie

Scrollspy werkt ook met geneste .navs. Als een geneste .navis .active, zullen zijn ouders dat ook zijn .active. Scroll door het gebied naast de navigatiebalk en kijk hoe de actieve klas verandert.

Item 1

Dit is wat tijdelijke inhoud voor de scrollspy-pagina. Houd er rekening mee dat wanneer u door de pagina bladert, de juiste navigatielink wordt gemarkeerd. Het wordt in het hele componentvoorbeeld herhaald. We blijven hier nog wat voorbeeldkopieën toevoegen om het scrollen en markeren te benadrukken.

Houd er rekening mee dat de JavaScript-plug-in probeert het juiste element te kiezen uit alles wat zichtbaar is. Meerdere zichtbare scrollspy-doelen tegelijkertijd kunnen problemen veroorzaken.

Artikel 1-1

Dit is wat tijdelijke inhoud voor de scrollspy-pagina. Houd er rekening mee dat wanneer u door de pagina bladert, de juiste navigatielink wordt gemarkeerd. Het wordt in het hele componentvoorbeeld herhaald. We blijven hier nog wat voorbeeldkopieën toevoegen om het scrollen en markeren te benadrukken.

Houd er rekening mee dat de JavaScript-plug-in probeert het juiste element te kiezen uit alles wat zichtbaar is. Meerdere zichtbare scrollspy-doelen tegelijkertijd kunnen problemen veroorzaken.

Artikel 1-2

Dit is wat tijdelijke inhoud voor de scrollspy-pagina. Houd er rekening mee dat wanneer u door de pagina bladert, de juiste navigatielink wordt gemarkeerd. Het wordt in het hele componentvoorbeeld herhaald. We blijven hier nog wat voorbeeldkopieën toevoegen om het scrollen en markeren te benadrukken.

Houd er rekening mee dat de JavaScript-plug-in probeert het juiste element te kiezen uit alles wat zichtbaar is. Meerdere zichtbare scrollspy-doelen tegelijkertijd kunnen problemen veroorzaken.

Artikel 2

Dit is wat tijdelijke inhoud voor de scrollspy-pagina. Houd er rekening mee dat wanneer u door de pagina bladert, de juiste navigatielink wordt gemarkeerd. Het wordt in het hele componentvoorbeeld herhaald. We blijven hier nog wat voorbeeldkopieën toevoegen om het scrollen en markeren te benadrukken.

Houd er rekening mee dat de JavaScript-plug-in probeert het juiste element te kiezen uit alles wat zichtbaar is. Meerdere zichtbare scrollspy-doelen tegelijkertijd kunnen problemen veroorzaken.

Artikel 3

Dit is wat tijdelijke inhoud voor de scrollspy-pagina. Houd er rekening mee dat wanneer u door de pagina bladert, de juiste navigatielink wordt gemarkeerd. Het wordt in het hele componentvoorbeeld herhaald. We blijven hier nog wat voorbeeldkopieën toevoegen om het scrollen en markeren te benadrukken.

Houd er rekening mee dat de JavaScript-plug-in probeert het juiste element te kiezen uit alles wat zichtbaar is. Meerdere zichtbare scrollspy-doelen tegelijkertijd kunnen problemen veroorzaken.

Punt 3-1

Dit is wat tijdelijke inhoud voor de scrollspy-pagina. Houd er rekening mee dat wanneer u door de pagina bladert, de juiste navigatielink wordt gemarkeerd. Het wordt in het hele componentvoorbeeld herhaald. We blijven hier nog wat voorbeeldkopieën toevoegen om het scrollen en markeren te benadrukken.

Houd er rekening mee dat de JavaScript-plug-in probeert het juiste element te kiezen uit alles wat zichtbaar is. Meerdere zichtbare scrollspy-doelen tegelijkertijd kunnen problemen veroorzaken.

Punt 3-2

Dit is wat tijdelijke inhoud voor de scrollspy-pagina. Houd er rekening mee dat wanneer u door de pagina bladert, de juiste navigatielink wordt gemarkeerd. Het wordt in het hele componentvoorbeeld herhaald. We blijven hier nog wat voorbeeldkopieën toevoegen om het scrollen en markeren te benadrukken.

Houd er rekening mee dat de JavaScript-plug-in probeert het juiste element te kiezen uit alles wat zichtbaar is. Meerdere zichtbare scrollspy-doelen tegelijkertijd kunnen problemen veroorzaken.

<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>

Lijst groep

Scrollspy werkt ook met .list-groups. Blader door het gebied naast de lijstgroep en kijk hoe de actieve klas verandert.

Item 1

Dit is wat tijdelijke inhoud voor de scrollspy-pagina. Houd er rekening mee dat wanneer u door de pagina bladert, de juiste navigatielink wordt gemarkeerd. Het wordt in het hele componentvoorbeeld herhaald. We blijven hier nog wat voorbeeldkopieën toevoegen om het scrollen en markeren te benadrukken.

Artikel 2

Dit is wat tijdelijke inhoud voor de scrollspy-pagina. Houd er rekening mee dat wanneer u door de pagina bladert, de juiste navigatielink wordt gemarkeerd. Het wordt in het hele componentvoorbeeld herhaald. We blijven hier nog wat voorbeeldkopieën toevoegen om het scrollen en markeren te benadrukken.

Artikel 3

Dit is wat tijdelijke inhoud voor de scrollspy-pagina. Houd er rekening mee dat wanneer u door de pagina bladert, de juiste navigatielink wordt gemarkeerd. Het wordt in het hele componentvoorbeeld herhaald. We blijven hier nog wat voorbeeldkopieën toevoegen om het scrollen en markeren te benadrukken.

Artikel 4

Dit is wat tijdelijke inhoud voor de scrollspy-pagina. Houd er rekening mee dat wanneer u door de pagina bladert, de juiste navigatielink wordt gemarkeerd. Het wordt in het hele componentvoorbeeld herhaald. We blijven hier nog wat voorbeeldkopieën toevoegen om het scrollen en markeren te benadrukken.

<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>

Eenvoudige ankers

Scrollspy is niet beperkt tot navigatiecomponenten en lijstgroepen, dus het werkt op alle ankerelementen <a>in het huidige document. Blader door het gebied en zie hoe de .activeklas verandert.

Item 1

Dit is wat tijdelijke inhoud voor de scrollspy-pagina. Houd er rekening mee dat wanneer u door de pagina bladert, de juiste navigatielink wordt gemarkeerd. Het wordt in het hele componentvoorbeeld herhaald. We blijven hier nog wat voorbeeldkopieën toevoegen om het scrollen en markeren te benadrukken.

Artikel 2

Dit is wat tijdelijke inhoud voor de scrollspy-pagina. Houd er rekening mee dat wanneer u door de pagina bladert, de juiste navigatielink wordt gemarkeerd. Het wordt in het hele componentvoorbeeld herhaald. We blijven hier nog wat voorbeeldkopieën toevoegen om het scrollen en markeren te benadrukken.

Artikel 3

Dit is wat tijdelijke inhoud voor de scrollspy-pagina. Houd er rekening mee dat wanneer u door de pagina bladert, de juiste navigatielink wordt gemarkeerd. Het wordt in het hele componentvoorbeeld herhaald. We blijven hier nog wat voorbeeldkopieën toevoegen om het scrollen en markeren te benadrukken.

Artikel 4

Dit is wat tijdelijke inhoud voor de scrollspy-pagina. Houd er rekening mee dat wanneer u door de pagina bladert, de juiste navigatielink wordt gemarkeerd. Het wordt in het hele componentvoorbeeld herhaald. We blijven hier nog wat voorbeeldkopieën toevoegen om het scrollen en markeren te benadrukken.

Artikel 5

Dit is wat tijdelijke inhoud voor de scrollspy-pagina. Houd er rekening mee dat wanneer u door de pagina bladert, de juiste navigatielink wordt gemarkeerd. Het wordt in het hele componentvoorbeeld herhaald. We blijven hier nog wat voorbeeldkopieën toevoegen om het scrollen en markeren te benadrukken.

<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>

Niet-zichtbare elementen

Doelelementen die niet zichtbaar zijn, worden genegeerd en de bijbehorende navigatie-items krijgen geen .activeklasse. Scrollspy-instanties die zijn geïnitialiseerd in een niet-zichtbare wrapper, negeren alle doelelementen. Gebruik de refreshmethode om te controleren op waarneembare elementen zodra de wrapper zichtbaar wordt.

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()
  })
})

Gebruik

Via gegevensattributen

Om eenvoudig scrollspy-gedrag toe te voegen aan uw navigatie op de bovenste balk, voegt u toe data-bs-spy="scroll"aan het element dat u wilt bespioneren (meestal is dit de <body>). Voeg vervolgens het data-bs-targetattribuut toe met de idof klassenaam van het bovenliggende element van een Bootstrap- .navcomponent.

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

Via JavaScript

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

Opties

Omdat opties kunnen worden doorgegeven via gegevensattributen of JavaScript, kunt u een optienaam toevoegen aan data-bs-, zoals in data-bs-animation="{value}". Zorg ervoor dat u het kasttype van de optienaam wijzigt van " camelCase " in " kebab-case " wanneer u de opties doorgeeft via gegevensattributen. Gebruik bijvoorbeeld in data-bs-custom-class="beautifier"plaats van data-bs-customClass="beautifier".

Vanaf Bootstrap 5.2.0 ondersteunen alle componenten een experimenteel gereserveerd gegevenskenmerk data-bs-configdat een eenvoudige componentconfiguratie als een JSON-tekenreeks kan bevatten. Wanneer een element attributen heeft data-bs-config='{"delay":0, "title":123}', zal data-bs-title="456"de uiteindelijke titlewaarde zijn 456en zullen de afzonderlijke gegevensattributen de waarden overschrijven die op data-bs-config. Bovendien kunnen bestaande gegevensattributen JSON-waarden zoals data-bs-delay='{"show":0,"hide":150}'.

Naam Type Standaard Beschrijving
rootMargin snaar 0px 0px -25% Intersection Observer rootMargin geldige eenheden, bij het berekenen van de scrollpositie.
smoothScroll booleaans false Maakt soepel scrollen mogelijk wanneer een gebruiker op een link klikt die verwijst naar waarneembare ScrollSpy-waarnemingen.
target string, DOM-element null Specificeert het element om de Scrollspy-plug-in toe te passen.
threshold reeks [0.1, 0.5, 1] IntersectionObserver drempel geldige invoer, bij het berekenen van de scrollpositie.

Verouderde opties

Tot v5.1.3 gebruikten we offset& methodopties, die nu verouderd zijn en vervangen zijn door rootMargin. Om achterwaartse compatibiliteit te behouden, zullen we doorgaan met het ontleden van een gegeven offsetnaar rootMargin, maar deze functie wordt verwijderd in v6 .

Methoden:

Methode Beschrijving
dispose Vernietigt de scrollspy van een element. (Verwijdert opgeslagen gegevens op het DOM-element)
getInstance Statische methode om de scrollspy-instantie te krijgen die is gekoppeld aan een DOM-element.
getOrCreateInstance Statische methode om de scrollspy-instantie te koppelen aan een DOM-element, of om een ​​nieuwe te maken voor het geval deze niet is geïnitialiseerd.
refresh Wanneer u elementen in de DOM toevoegt of verwijdert, moet u de vernieuwingsmethode aanroepen.

Hier is een voorbeeld met de verversingsmethode:

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

Evenementen

Evenement Beschrijving
activate.bs.scrollspy Deze gebeurtenis wordt geactiveerd op het scroll-element wanneer een anker wordt geactiveerd door de scrollspy.
const firstScrollSpyEl = document.querySelector('[data-bs-spy="scroll"]')
firstScrollSpyEl.addEventListener('activate.bs.scrollspy', () => {
  // do something...
})