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 .active
klasse op anker ( <a>
) -elementen wanneer het element met de id
waarnaar wordt verwezen door het anker in href
beeld 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 setheight
enoverflow-y: scroll
. -
Voeg op de schuifbare container toe
data-bs-spy="scroll"
endata-bs-target="#navId"
waarnavId
is het uniekeid
van de bijbehorende navigatie. Zorg ervoor dat u ook een atabindex="0"
toevoegt om toegang tot het toetsenbord te garanderen. -
Terwijl u door de "bespioneerde" container bladert, wordt een
.active
klasse toegevoegd aan en verwijderd uit ankerlinks binnen de bijbehorende navigatie. Links moeten oplosbareid
doelen 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
navigatiesysteem
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 .nav
s. Als een geneste .nav
is .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-group
s. 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 .active
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.
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 .active
klasse. Scrollspy-instanties die zijn geïnitialiseerd in een niet-zichtbare wrapper, negeren alle doelelementen. Gebruik de refresh
methode 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-target
attribuut toe met de id
of klassenaam van het bovenliggende element van een Bootstrap- .nav
component.
<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-config
dat 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 title
waarde zijn 456
en 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
& method
opties, die nu verouderd zijn en vervangen zijn door rootMargin
. Om achterwaartse compatibiliteit te behouden, zullen we doorgaan met het ontleden van een gegeven offset
naar 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...
})