Gean nei haadynhâld Gean nei dokumintnavigaasje
Check
in English

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 .activeklasse op anker ( <a>) eleminten as it elemint mei de idferwiisde troch de anker's hrefyn 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 set heighten overflow-y: scroll.

  • Op de scrollbere kontener, tafoegje data-bs-spy="scroll"en data-bs-target="#navId"wêr navIdis it unyk idfan 'e assosjearre navigaasje. Wês wis dat jo ek in befetsje tabindex="0"om toetseboerd tagong te garandearjen.

  • Wylst jo de "spioneare" kontener rôlje, wurdt in .activeklasse tafoege en fuortsmiten fan ankerkeppelings binnen de assosjearre navigaasje. Keppelings moatte oplosbare iddoelen 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

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 .navs. As in nêst .navis .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-groups. 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 .activeklasse 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 .activeklasse. Scrollspy-ynstânsjes inisjalisearre yn in net-sichtbere wrapper sille alle doeleleminten negearje. Brûk de refreshmetoade 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-targetattribút ta mei de idof 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-configdat 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 titlewearde sil wêze 456en 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& methodopsjes, dy't no binne ôfret en ferfongen troch rootMargin. Om te hâlden efterút komptabiliteit, wy sille trochgean te parse in jûn offsetoan 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...
})