Scrollspy
Automatysk update Bootstrap-navigaasje of list groepkomponinten basearre op scrollposysje om oan te jaan hokker keppeling op it stuit aktyf is yn 'e viewport.
Hoe't it wurket
Scrollspy skeakelet de .active
klasse op anker ( <a>
) eleminten as it elemint mei de id
ferwiisde troch de anker's href
yn sicht rôle wurdt. Scrollspy wurdt bêste brûkt yn kombinaasje mei in Bootstrap nav komponint of list groep , mar it sil ek wurkje mei alle anker eleminten yn de hjoeddeiske side. Hjir is hoe't it wurket.
-
Om te begjinnen fereasket scrollspy twa dingen: in navigaasje, listgroep, of in ienfâldige set keppelings, plus in scrollbere kontener. De scrollbere kontener kin de
<body>
of in oanpast elemint wêze mei in setheight
enoverflow-y: scroll
. -
Op de scrollbere kontener, tafoegje
data-bs-spy="scroll"
endata-bs-target="#navId"
wêrnavId
is it unykid
fan 'e assosjearre navigaasje. Wês wis dat jo ek in befetsjetabindex="0"
om toetseboerd tagong te garandearjen. -
Wylst jo de "spioneare" kontener rôlje, wurdt in
.active
klasse tafoege en fuortsmiten fan ankerkeppelings binnen de assosjearre navigaasje. Keppelings moatte oplosbareid
doelen hawwe, oars wurde se negearre. Bygelyks, in<a href="#home">home</a>
moat oerienkomme mei wat yn 'e DOM lykas<div id="home"></div>
-
Doeleleminten dy't net sichtber binne, wurde negearre. Sjoch de seksje Net-sichtbere eleminten hjirûnder.
Foarbylden
Navbar
Rôlje it gebiet ûnder de navigaasjebalke en besjoch de aktive klasse feroarje. Iepenje it útklapmenu en sjoch ek hoe't de dropdown-items wurde markearre.
Earste kop
Dit is wat plakhâlder ynhâld foar de scrollspy side. Tink derom dat as jo de side nei ûnderen rôlje, wurdt de passende navigaasjekeppeling markearre. It wurdt werhelle troch it komponint foarbyld. Wy bliuwe hjir wat mear foarbyldkopie taheakje om it rôljen en markearjen te beklamjen.
Twadde kop
Dit is wat plakhâlder ynhâld foar de scrollspy side. Tink derom dat as jo de side nei ûnderen rôlje, wurdt de passende navigaasjekeppeling markearre. It wurdt werhelle troch it komponint foarbyld. Wy bliuwe hjir wat mear foarbyldkopie taheakje om it rôljen en markearjen te beklamjen.
Tredde kop
Dit is wat plakhâlder ynhâld foar de scrollspy side. Tink derom dat as jo de side nei ûnderen rôlje, wurdt de passende navigaasjekeppeling markearre. It wurdt werhelle troch it komponint foarbyld. Wy bliuwe hjir wat mear foarbyldkopie taheakje om it rôljen en markearjen te beklamjen.
Fjirde kop
Dit is wat plakhâlder ynhâld foar de scrollspy side. Tink derom dat as jo de side nei ûnderen rôlje, wurdt de passende navigaasjekeppeling markearre. It wurdt werhelle troch it komponint foarbyld. Wy bliuwe hjir wat mear foarbyldkopie taheakje om it rôljen en markearjen te beklamjen.
Fyfde kop
Dit is wat plakhâlder ynhâld foar de scrollspy side. Tink derom dat as jo de side nei ûnderen rôlje, wurdt de passende navigaasjekeppeling markearre. It wurdt werhelle troch it komponint foarbyld. Wy bliuwe hjir wat mear foarbyldkopie taheakje om it rôljen en markearjen te beklamjen.
<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>
Nested nav
Scrollspy wurket ek mei geneste .nav
s. As in nêst .nav
is .active
, sille syn âlden ek wêze .active
. Rôlje it gebiet neist de navigaasjebalke en besjoch de aktive klasse feroarje.
Artikel 1
Dit is wat plakhâlder ynhâld foar de scrollspy side. Tink derom dat as jo de side nei ûnderen rôlje, wurdt de passende navigaasjekeppeling markearre. It wurdt werhelle troch it komponint foarbyld. Wy bliuwe hjir wat mear foarbyldkopie taheakje om it rôljen en markearjen te beklamjen.
Hâld der rekken mei dat de JavaScript-plugin besiket it juste elemint te kiezen ûnder alles dat sichtber kin wêze. Meardere sichtbere scrollspy-doelen tagelyk kinne guon problemen feroarsaakje.
Item 1-1
Dit is wat plakhâlder ynhâld foar de scrollspy side. Tink derom dat as jo de side nei ûnderen rôlje, wurdt de passende navigaasjekeppeling markearre. It wurdt werhelle troch it komponint foarbyld. Wy bliuwe hjir wat mear foarbyldkopie taheakje om it rôljen en markearjen te beklamjen.
Hâld der rekken mei dat de JavaScript-plugin besiket it juste elemint te kiezen ûnder alles dat sichtber kin wêze. Meardere sichtbere scrollspy-doelen tagelyk kinne guon problemen feroarsaakje.
Item 1-2
Dit is wat plakhâlder ynhâld foar de scrollspy side. Tink derom dat as jo de side nei ûnderen rôlje, wurdt de passende navigaasjekeppeling markearre. It wurdt werhelle troch it komponint foarbyld. Wy bliuwe hjir wat mear foarbyldkopie taheakje om it rôljen en markearjen te beklamjen.
Hâld der rekken mei dat de JavaScript-plugin besiket it juste elemint te kiezen ûnder alles dat sichtber kin wêze. Meardere sichtbere scrollspy-doelen tagelyk kinne guon problemen feroarsaakje.
Artikel 2
Dit is wat plakhâlder ynhâld foar de scrollspy side. Tink derom dat as jo de side nei ûnderen rôlje, wurdt de passende navigaasjekeppeling markearre. It wurdt werhelle troch it komponint foarbyld. Wy bliuwe hjir wat mear foarbyldkopie taheakje om it rôljen en markearjen te beklamjen.
Hâld der rekken mei dat de JavaScript-plugin besiket it juste elemint te kiezen ûnder alles dat sichtber kin wêze. Meardere sichtbere scrollspy-doelen tagelyk kinne guon problemen feroarsaakje.
Artikel 3
Dit is wat plakhâlder ynhâld foar de scrollspy side. Tink derom dat as jo de side nei ûnderen rôlje, wurdt de passende navigaasjekeppeling markearre. It wurdt werhelle troch it komponint foarbyld. Wy bliuwe hjir wat mear foarbyldkopie taheakje om it rôljen en markearjen te beklamjen.
Hâld der rekken mei dat de JavaScript-plugin besiket it juste elemint te kiezen ûnder alles dat sichtber kin wêze. Meardere sichtbere scrollspy-doelen tagelyk kinne guon problemen feroarsaakje.
Artikel 3-1
Dit is wat plakhâlder ynhâld foar de scrollspy side. Tink derom dat as jo de side nei ûnderen rôlje, wurdt de passende navigaasjekeppeling markearre. It wurdt werhelle troch it komponint foarbyld. Wy bliuwe hjir wat mear foarbyldkopie taheakje om it rôljen en markearjen te beklamjen.
Hâld der rekken mei dat de JavaScript-plugin besiket it juste elemint te kiezen ûnder alles dat sichtber kin wêze. Meardere sichtbere scrollspy-doelen tagelyk kinne guon problemen feroarsaakje.
Item 3-2
Dit is wat plakhâlder ynhâld foar de scrollspy side. Tink derom dat as jo de side nei ûnderen rôlje, wurdt de passende navigaasjekeppeling markearre. It wurdt werhelle troch it komponint foarbyld. Wy bliuwe hjir wat mear foarbyldkopie taheakje om it rôljen en markearjen te beklamjen.
Hâld der rekken mei dat de JavaScript-plugin besiket it juste elemint te kiezen ûnder alles dat sichtber kin wêze. Meardere sichtbere scrollspy-doelen tagelyk kinne guon problemen feroarsaakje.
<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>
List groep
Scrollspy wurket ek mei .list-group
s. Rôlje it gebiet neist de listgroep en besjoch de aktive klasseferoaring.
Artikel 1
Dit is wat plakhâlder ynhâld foar de scrollspy side. Tink derom dat as jo de side nei ûnderen rôlje, wurdt de passende navigaasjekeppeling markearre. It wurdt werhelle troch it komponint foarbyld. Wy bliuwe hjir wat mear foarbyldkopie taheakje om it rôljen en markearjen te beklamjen.
Artikel 2
Dit is wat plakhâlder ynhâld foar de scrollspy side. Tink derom dat as jo de side nei ûnderen rôlje, wurdt de passende navigaasjekeppeling markearre. It wurdt werhelle troch it komponint foarbyld. Wy bliuwe hjir wat mear foarbyldkopie taheakje om it rôljen en markearjen te beklamjen.
Artikel 3
Dit is wat plakhâlder ynhâld foar de scrollspy side. Tink derom dat as jo de side nei ûnderen rôlje, wurdt de passende navigaasjekeppeling markearre. It wurdt werhelle troch it komponint foarbyld. Wy bliuwe hjir wat mear foarbyldkopie taheakje om it rôljen en markearjen te beklamjen.
Artikel 4
Dit is wat plakhâlder ynhâld foar de scrollspy side. Tink derom dat as jo de side nei ûnderen rôlje, wurdt de passende navigaasjekeppeling markearre. It wurdt werhelle troch it komponint foarbyld. Wy bliuwe hjir wat mear foarbyldkopie taheakje om it rôljen en markearjen te beklamjen.
<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>
Ienfâldige ankers
Scrollspy is net beheind ta nav komponinten en list groepen, dus it sil wurkje op alle <a>
anker eleminten yn de hjoeddeiske dokumint. Rôlje troch it gebiet en sjoch hoe't de .active
klasse feroaret.
Artikel 1
Dit is wat plakhâlder ynhâld foar de scrollspy side. Tink derom dat as jo de side nei ûnderen rôlje, wurdt de passende navigaasjekeppeling markearre. It wurdt werhelle troch it komponint foarbyld. Wy bliuwe hjir wat mear foarbyldkopie taheakje om it rôljen en markearjen te beklamjen.
Artikel 2
Dit is wat plakhâlder ynhâld foar de scrollspy side. Tink derom dat as jo de side nei ûnderen rôlje, wurdt de passende navigaasjekeppeling markearre. It wurdt werhelle troch it komponint foarbyld. Wy bliuwe hjir wat mear foarbyldkopie taheakje om it rôljen en markearjen te beklamjen.
Artikel 3
Dit is wat plakhâlder ynhâld foar de scrollspy side. Tink derom dat as jo de side nei ûnderen rôlje, wurdt de passende navigaasjekeppeling markearre. It wurdt werhelle troch it komponint foarbyld. Wy bliuwe hjir wat mear foarbyldkopie taheakje om it rôljen en markearjen te beklamjen.
Artikel 4
Dit is wat plakhâlder ynhâld foar de scrollspy side. Tink derom dat as jo de side nei ûnderen rôlje, wurdt de passende navigaasjekeppeling markearre. It wurdt werhelle troch it komponint foarbyld. Wy bliuwe hjir wat mear foarbyldkopie taheakje om it rôljen en markearjen te beklamjen.
Artikel 5
Dit is wat plakhâlder ynhâld foar de scrollspy side. Tink derom dat as jo de side nei ûnderen rôlje, wurdt de passende navigaasjekeppeling markearre. It wurdt werhelle troch it komponint foarbyld. Wy bliuwe hjir wat mear foarbyldkopie taheakje om it rôljen en markearjen te beklamjen.
<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>
Net-sichtbere eleminten
Doel-eleminten dy't net sichtber binne, wurde negearre en har korrespondearjende nav-items krije gjin .active
klasse. Scrollspy-ynstânsjes inisjalisearre yn in net-sichtbere wrapper sille alle doeleleminten negearje. Brûk de refresh
metoade om te kontrolearjen op waarneembare eleminten as de wrapper sichtber wurdt.
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()
})
})
Gebrûk
Fia data attributen
Om maklik scrollspy-gedrach ta te foegjen oan jo topbalke-navigaasje, foegje data-bs-spy="scroll"
jo ta oan it elemint wêrop jo wolle bispiede (meast typysk soe dit de <body>
). Foegje dan it data-bs-target
attribút ta mei de id
of klassenamme fan it âlderelemint fan elke Bootstrap .nav
-komponint.
<body data-bs-spy="scroll" data-bs-target="#navbar-example">
...
<div id="navbar-example">
<ul class="nav nav-tabs" role="tablist">
...
</ul>
</div>
...
</body>
Fia JavaScript
const scrollSpy = new bootstrap.ScrollSpy(document.body, {
target: '#navbar-example'
})
Opsjes
As opsjes kinne wurde trochjûn fia gegevensattributen of JavaScript, kinne jo in opsjenamme tafoegje oan data-bs-
, lykas yn data-bs-animation="{value}"
. Soargje derfoar dat jo it gefaltype fan 'e opsjenamme feroarje fan " camelCase " nei " kebab-case " as jo de opsjes trochjaan fia gegevensattributen. Brûk bygelyks data-bs-custom-class="beautifier"
ynstee fan data-bs-customClass="beautifier"
.
Fanôf Bootstrap 5.2.0 stypje alle komponinten in eksperiminteel reservearre data-attribút data-bs-config
dat ienfâldige komponintkonfiguraasje as in JSON-string kin herbergje. As in elemint hat data-bs-config='{"delay":0, "title":123}'
en data-bs-title="456"
attributen, de definitive title
wearde sil wêze 456
en de aparte gegevens attributen sille oerskriuwe wearden jûn op data-bs-config
. Derneist kinne besteande gegevensattributen JSON-wearden lykas data-bs-delay='{"show":0,"hide":150}'
.
Namme | Type | Standert | Beskriuwing |
---|---|---|---|
rootMargin |
string | 0px 0px -25% |
Krúspunt Observer rootMargin jildich ienheden, by it berekkenjen fan scroll posysje. |
smoothScroll |
boolean | false |
Aktivearret soepel rôljen as in brûker klikt op in keppeling dy't ferwiist nei ScrollSpy observables. |
target |
string, DOM-elemint | null |
Spesifiseart elemint om Scrollspy-plugin oan te passen. |
threshold |
array | [0.1, 0.5, 1] |
IntersectionObserver drompel jildich ynfier, by it berekkenjen fan scroll posysje. |
Ferâldere opsjes
Oant v5.1.3 brûkten wy offset
& method
opsjes, dy't no binne ôfret en ferfongen troch rootMargin
. Om te hâlden efterút komptabiliteit, wy sille trochgean te parse in jûn offset
oan rootMargin
, mar dizze funksje wurdt fuortsmiten yn v6 .
Metoaden
Metoade | Beskriuwing |
---|---|
dispose |
Ferneatiget in elemint syn scrollspy. (Ferwidert bewarre gegevens op it DOM-elemint) |
getInstance |
Statyske metoade om de scrollspy-eksimplaar te krijen ferbûn mei in DOM-elemint. |
getOrCreateInstance |
Statyske metoade om de scrollspy-eksimplaar te krijen dy't assosjeare is mei in DOM-elemint, of om in nij te meitsjen foar it gefal dat it net inisjalisearre is. |
refresh |
By it tafoegjen of ferwiderjen fan eleminten yn 'e DOM, moatte jo de ferfarsingsmetoade neame. |
Hjir is in foarbyld mei de refresh-metoade:
const dataSpyList = document.querySelectorAll('[data-bs-spy="scroll"]')
dataSpyList.forEach(dataSpyEl => {
bootstrap.ScrollSpy.getInstance(dataSpyEl).refresh()
})
Eveneminten
Barren | Beskriuwing |
---|---|
activate.bs.scrollspy |
Dit barren sjit op it scroll-elemint as in anker wurdt aktivearre troch de scrollspy. |
const firstScrollSpyEl = document.querySelector('[data-bs-spy="scroll"]')
firstScrollSpyEl.addEventListener('activate.bs.scrollspy', () => {
// do something...
})