Bootstrap V5.3 中文手册

Scrollspy 滚动监听

根据滚动位置自动更新 Bootstrap 导航或列出组组件,以指示视口中当前处于活动状态的链接。

运作方式

当具有锚点引用的元素滚动到视图中时,Scrollspy 会切换锚点 () 元素上的类。Scrollspy 最好与 Bootstrap 导航组件或列表组结合使用,但它也可以与当前页面中的任何锚元素一起使用。这是它的工作原理。.active<a>idhref

  • 首先,scrollspy 需要两件事:导航、列表组或一组简单的链接,以及一个可滚动的容器。可滚动容器可以是带有集合和 的自定义元素 或 。<body>heightoverflow-y: scroll

  • 在可滚动容器上,添加 和 where 是关联导航的唯一值。如果元素内没有可聚焦的元素,请务必同时包含 以确保键盘访问。data-bs-spy="scroll"data-bs-target="#navId"navIdidtabindex="0"

  • 当您滚动“间谍”容器时,会在关联导航中的锚链接中添加和删除一个类。链接必须具有可解析的目标,否则将被忽略。例如,a 必须对应于 DOM 中的内容,例如.activeid<a href="#home">home</a><div id="home"></div>

  • 不可见的目标元素将被忽略。请参阅下面的不可见元素部分。

例子

滚动导航栏下方的区域并观察活动类的变化。打开下拉菜单并观察下拉项目也被突出显示。

第一个标题

这是 scrollspy 页面的一些占位符内容。请注意,当您向下滚动页面时,相应的导航链接将突出显示。在整个组件示例中重复此作。我们在这里不断添加更多示例副本,以强调滚动和突出显示。

第二标题

这是 scrollspy 页面的一些占位符内容。请注意,当您向下滚动页面时,相应的导航链接将突出显示。在整个组件示例中重复此作。我们在这里不断添加更多示例副本,以强调滚动和突出显示。

第三个标题

这是 scrollspy 页面的一些占位符内容。请注意,当您向下滚动页面时,相应的导航链接将突出显示。在整个组件示例中重复此作。我们在这里不断添加更多示例副本,以强调滚动和突出显示。

第四个标题

这是 scrollspy 页面的一些占位符内容。请注意,当您向下滚动页面时,相应的导航链接将突出显示。在整个组件示例中重复此作。我们在这里不断添加更多示例副本,以强调滚动和突出显示。

第五个标题

这是 scrollspy 页面的一些占位符内容。请注意,当您向下滚动页面时,相应的导航链接将突出显示。在整个组件示例中重复此作。我们在这里不断添加更多示例副本,以强调滚动和突出显示。

<nav id="navbar-example2" class="navbar bg-body-tertiary 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-body-tertiary 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>

嵌套导航

Scrollspy 也适用于嵌套的 s。如果嵌套的 是 ,它的父级也将是 。滚动导航栏旁边的区域并观察活动类的变化。.nav.nav.active.active

项目1

这是 scrollspy 页面的一些占位符内容。请注意,当您向下滚动页面时,相应的导航链接将突出显示。在整个组件示例中重复此作。我们在这里不断添加更多示例副本,以强调滚动和突出显示。

请记住,JavaScript 插件会尝试从所有可见的元素中选择正确的元素。同时出现多个可见的 scrollspy 目标可能会导致一些问题。

项目1-1

这是 scrollspy 页面的一些占位符内容。请注意,当您向下滚动页面时,相应的导航链接将突出显示。在整个组件示例中重复此作。我们在这里不断添加更多示例副本,以强调滚动和突出显示。

请记住,JavaScript 插件会尝试从所有可见的元素中选择正确的元素。同时出现多个可见的 scrollspy 目标可能会导致一些问题。

项目1-2

这是 scrollspy 页面的一些占位符内容。请注意,当您向下滚动页面时,相应的导航链接将突出显示。在整个组件示例中重复此作。我们在这里不断添加更多示例副本,以强调滚动和突出显示。

请记住,JavaScript 插件会尝试从所有可见的元素中选择正确的元素。同时出现多个可见的 scrollspy 目标可能会导致一些问题。

项目2

这是 scrollspy 页面的一些占位符内容。请注意,当您向下滚动页面时,相应的导航链接将突出显示。在整个组件示例中重复此作。我们在这里不断添加更多示例副本,以强调滚动和突出显示。

请记住,JavaScript 插件会尝试从所有可见的元素中选择正确的元素。同时出现多个可见的 scrollspy 目标可能会导致一些问题。

项目3

这是 scrollspy 页面的一些占位符内容。请注意,当您向下滚动页面时,相应的导航链接将突出显示。在整个组件示例中重复此作。我们在这里不断添加更多示例副本,以强调滚动和突出显示。

请记住,JavaScript 插件会尝试从所有可见的元素中选择正确的元素。同时出现多个可见的 scrollspy 目标可能会导致一些问题。

项目3-1

这是 scrollspy 页面的一些占位符内容。请注意,当您向下滚动页面时,相应的导航链接将突出显示。在整个组件示例中重复此作。我们在这里不断添加更多示例副本,以强调滚动和突出显示。

请记住,JavaScript 插件会尝试从所有可见的元素中选择正确的元素。同时出现多个可见的 scrollspy 目标可能会导致一些问题。

项目3-2

这是 scrollspy 页面的一些占位符内容。请注意,当您向下滚动页面时,相应的导航链接将突出显示。在整个组件示例中重复此作。我们在这里不断添加更多示例副本,以强调滚动和突出显示。

请记住,JavaScript 插件会尝试从所有可见的元素中选择正确的元素。同时出现多个可见的 scrollspy 目标可能会导致一些问题。

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

列表组

Scrollspy 也适用于 s。滚动列表组旁边的区域并观察活动类的变化。.list-group

项目1

这是 scrollspy 页面的一些占位符内容。请注意,当您向下滚动页面时,相应的导航链接将突出显示。在整个组件示例中重复此作。我们在这里不断添加更多示例副本,以强调滚动和突出显示。

项目2

这是 scrollspy 页面的一些占位符内容。请注意,当您向下滚动页面时,相应的导航链接将突出显示。在整个组件示例中重复此作。我们在这里不断添加更多示例副本,以强调滚动和突出显示。

项目3

这是 scrollspy 页面的一些占位符内容。请注意,当您向下滚动页面时,相应的导航链接将突出显示。在整个组件示例中重复此作。我们在这里不断添加更多示例副本,以强调滚动和突出显示。

项目4

这是 scrollspy 页面的一些占位符内容。请注意,当您向下滚动页面时,相应的导航链接将突出显示。在整个组件示例中重复此作。我们在这里不断添加更多示例副本,以强调滚动和突出显示。

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

简单锚点

Scrollspy 不限于导航组件和列表组,因此它适用于当前文档中的任何锚元素。滚动该区域并观察班级变化。<a>.active

项目1

这是 scrollspy 页面的一些占位符内容。请注意,当您向下滚动页面时,相应的导航链接将突出显示。在整个组件示例中重复此作。我们在这里不断添加更多示例副本,以强调滚动和突出显示。

项目2

这是 scrollspy 页面的一些占位符内容。请注意,当您向下滚动页面时,相应的导航链接将突出显示。在整个组件示例中重复此作。我们在这里不断添加更多示例副本,以强调滚动和突出显示。

项目3

这是 scrollspy 页面的一些占位符内容。请注意,当您向下滚动页面时,相应的导航链接将突出显示。在整个组件示例中重复此作。我们在这里不断添加更多示例副本,以强调滚动和突出显示。

项目4

这是 scrollspy 页面的一些占位符内容。请注意,当您向下滚动页面时,相应的导航链接将突出显示。在整个组件示例中重复此作。我们在这里不断添加更多示例副本,以强调滚动和突出显示。

项目5

这是 scrollspy 页面的一些占位符内容。请注意,当您向下滚动页面时,相应的导航链接将突出显示。在整个组件示例中重复此作。我们在这里不断添加更多示例副本,以强调滚动和突出显示。

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

不可见元素

不可见的目标元素将被忽略,其相应的导航项将不会接收类。在不可见包装器中初始化的 Scrollspy 实例将忽略所有目标元素。一旦包装器可见,使用该方法检查可观察元素。.activerefresh

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

用法

通过数据属性

要轻松地将 scrollspy 行为添加到顶部栏导航中,请添加到要监视的元素(最常见的是 )。然后添加具有任何 Bootstrap 组件父元素的 or 类名称的属性。data-bs-spy="scroll"<body>data-bs-targetid.nav

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

通过 JavaScript

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

选项

由于选项可以通过数据属性或 JavaScript 传递,因此您可以将选项名称附加到 ,如 。通过数据属性传递选项时,请确保将选项名称的大小写类型从“camelCase”更改为“kebab-case”。例如,使用 代替 .data-bs-data-bs-animation="{value}"data-bs-custom-class="beautifier"data-bs-customClass="beautifier"

从 Bootstrap 5.2.0 开始,所有组件都支持实验性保留数据属性,该属性可以将简单的组件配置作为 JSON 字符串容纳。当元素具有 和 属性时,最终值将是,并且单独的数据属性将覆盖 上给出的值。此外,现有数据属性能够容纳 JSON 值,例如 .data-bs-configdata-bs-config='{"delay":0, "title":123}'data-bs-title="456"title456data-bs-configdata-bs-delay='{"show":0,"hide":150}'

最终配置对象是 、 的合并结果,其中最新给定的键值覆盖其他键值。data-bs-configdata-bs-js object

名字类型违约描述
rootMargin字符串0px 0px -25%交点观察者 rootMargin 有效单位,计算滚动位置时。
smoothScroll布尔false当用户单击引用 ScrollSpy 可观察对象的链接时,启用平滑滚动。
targetstring, DOM 元素null指定要应用 Scrollspy 插件的元素。
threshold数组[0.1, 0.5, 1]IntersectionObserver 阈值有效输入,计算滚动位置时。

已弃用的选项

在 v5.1.3 之前,我们一直在使用 & 选项,现在已被弃用并被 取代。 为了保持向后兼容性,我们将继续解析给定的 ,但此功能将在 v6 中删除。offsetmethodrootMarginoffsetrootMargin

方法

方法描述
dispose销毁元素的 scrollspy。(删除 DOM 元素上存储的数据)
getInstanceStatic 方法,用于获取与 DOM 元素关联的 scrollspy 实例。
getOrCreateInstanceStatic 方法来获取与 DOM 元素关联的 scrollspy 实例,或创建一个新实例以防它未初始化。
refresh在 DOM 中添加或删除元素时,需要调用 refresh 方法。

下面是使用 refresh 方法的示例:

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

事件

事件描述
activate.bs.scrollspy每当 scrollspy 激活锚点时,此事件都会在 scroll 元素上触发。
const firstScrollSpyEl = document.querySelector('[data-bs-spy="scroll"]')
firstScrollSpyEl.addEventListener('activate.bs.scrollspy', () => {
  // do something...
})