如何在Bootstrap 5的下拉菜单中设置a 标签的target属性?

前端开发 2026-07-09

在这个简单的例子中,我设置了三个导航标签,以切换三个内容窗格:

<ul class="nav nav-tabs" id="myTabSimple" role="tablist">
    <li class="nav-item" role="presentation">
        <button class="nav-link active" id="tabA-0" data-bs-toggle="tab" data-bs-target="#tabA-pane-0" type="button" role="tab" aria-controls="tabA-pane-0" aria-selected="true">TabA 0</button>
    </li>
    <li class="nav-item" role="presentation">
        <button class="nav-link" id="tabA-1" data-bs-toggle="tab" data-bs-target="#tabA-pane-1" type="button" role="tab" aria-controls="tabA-pane-1" aria-selected="true">TabA 1</button>
    </li>
    <li class="nav-item" role="presentation">
        <button class="nav-link" id="tabA-2" data-bs-toggle="tab" data-bs-target="#tabA-pane-2" type="button" role="tab" aria-controls="tabA-pane-2" aria-selected="true">TabA 2</button>
    </li>
</ul>
<div class="tab-content" id="myTabContentSimple">
    <div class="tab-pane fade show active" id="tabA-pane-0" role="tabpanel" aria-labelledby="tabA-0" tabindex="0">
    This is tabA pane 0.
    </div>
    <div class="tab-pane fade" id="tabA-pane-1" role="tabpanel" aria-labelledby="tabA-1" tabindex="0">
    <div id="first-part">
        This is tabA pane 1 - first part.
    </div>
    <div id="second-part">
        This is tabA pane 1 - second part.
    </div>
    <div id="third-part">
        This is tabA pane 1 - third part.
    </div>
    </div>
    <div class="tab-pane fade" id="tabA-pane-2" role="tabpanel" aria-labelledby="tabA-2" tabindex="0">
    This is tabA pane 2.
    </div>  
</div>

我现在想在中间的标签上使用一个下拉菜单,方便用户选择要跳转到该内容窗格中的哪个锚点:#first-part#second-part#third-part

我该如何在这段新代码中包含这三个锚点,以实现所需的功能?

<ul class="nav nav-tabs" role="tablist">
    <li class="nav-item" role="presentation">
    <button class="nav-link active" id="tabB-0" data-bs-toggle="tab" data-bs-target="#tabB-pane-0" type="button" role="tab" aria-controls="tabB-pane-0" aria-selected="true">TabB 0</button>
    </li>

    <li class="nav-item dropdown" role="presentation">
    <button class="nav-link dropdown-toggle" id="tabB-1" type="button" data-bs-toggle="dropdown" aria-expanded="false">TabB 1</button>
    <ul class="dropdown-menu">
        <li><button class="dropdown-item" data-bs-toggle="tab" data-bs-target="#tabB-pane-1" type="button" role="tab" aria-controls="tabB-pane-1" aria-selected="false">Part 1</button></li>
        <li><button class="dropdown-item" data-bs-toggle="tab" data-bs-target="#tabB-pane-1" type="button" role="tab" aria-controls="tabB-pane-1" aria-selected="false">Part 2</button></li>
        <li><button class="dropdown-item" data-bs-toggle="tab" data-bs-target="#tabB-pane-1" type="button" role="tab" aria-controls="tabB-pane-1" aria-selected="false">part 3</button></li>
    </ul>
    </li>

    <li class="nav-item" role="presentation">
    <button class="nav-link" id="tabB-2" data-bs-toggle="tab" data-bs-target="#tabB-pane-2" type="button" role="tab" aria-controls="tabB-pane-2" aria-selected="true">TabB 2</button>
    </li>
</ul>
<div class="tab-content">
    <div class="tab-pane fade show active" id="tabB-pane-0" role="tabpanel" aria-labelledby="tabB-0" tabindex="0">
    This is tabB pane 0.
    </div>
    <div class="tab-pane fade" id="tabB-pane-1" role="tabpanel" aria-labelledby="tabB-1" tabindex="0">
    <div id="first-part">
        This is tabB pane 1 - first part.
    </div>
    <div id="second-part">
        This is tabB pane 1 - second part.
    </div>
    <div id="third-part">
        This is tabB pane 1 - third part.
    </div>
    </div>
    <div class="tab-pane fade" id="tabB-pane-2" role="tabpanel" aria-labelledby="tabB-2" tabindex="0">
    This is tabB pane 2.
    </div>  
</div>

解决方案

由于下拉项在显示标签时(带有 data-bs-toggle="tab")会导致锚点行为丢失(即使你使用了 a 标签,而不是 button)。

因此,你需要使用JavaScript手动滚动到锚点。

不过,你需要等待Bootstrap实际显示标签,因此可以使用tab show.bs.tab 事件监听器,并在下拉项上存储锚点目标,然后滚动到它:

存储锚点目标:

<li><button class="dropdown-item" data-bs-toggle="tab" data-bs-target="#tabB-pane-1" type="button" role="tab" aria-controls="tabB-pane-1" aria-selected="false" data-anchor="#first-part">Part 1</button></li>

为滚动到触发项的锚点添加标签事件监听器:

document.querySelectorAll('.parts-menu .dropdown-item[data-bs-toggle="tab"]').forEach(item => {

  item.addEventListener('shown.bs.tab', function() {

    const anchor = this.dataset.anchor;

    document.querySelector(anchor).scrollIntoView({
      behavior: 'smooth'
    });

  });

});

演示:

<!doctype html>
<html lang="en">

<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet">
  <title>Bootstrap Example</title>
  <script defer src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js"></script>
  <style>
    .parts div {
      height: 300px;
    }
  </style>
  <script>
    addEventListener("DOMContentLoaded", ()=>{

      document.querySelectorAll('.parts-menu .dropdown-item[data-bs-toggle="tab"]').forEach(item => {

        item.addEventListener('shown.bs.tab', function() {

          const anchor = this.dataset.anchor;

          document.querySelector(anchor).scrollIntoView({
            behavior: 'smooth'
          });

        });

      });

    });
  </script>
</head>

<body>


  <ul class="nav nav-tabs" role="tablist">
    <li class="nav-item" role="presentation">
      <button class="nav-link active" id="tabB-0" data-bs-toggle="tab" data-bs-target="#tabB-pane-0" type="button" role="tab" aria-controls="tabB-pane-0" aria-selected="true">TabB 0</button>
    </li>

    <li class="nav-item dropdown" role="presentation">
      <button class="nav-link dropdown-toggle" id="tabB-1" type="button" data-bs-toggle="dropdown" aria-expanded="false">TabB 1</button>
      <ul class="dropdown-menu parts-menu">
        <li><button class="dropdown-item" data-bs-toggle="tab" data-bs-target="#tabB-pane-1" type="button" role="tab" aria-controls="tabB-pane-1" aria-selected="false" data-anchor="#first-part">Part 1</button></li>
        <li><button class="dropdown-item" data-bs-toggle="tab" data-bs-target="#tabB-pane-1" type="button" role="tab" aria-controls="tabB-pane-1" aria-selected="false" data-anchor="#second-part">Part 2</button></li>
        <li><button class="dropdown-item" data-bs-toggle="tab" data-bs-target="#tabB-pane-1" type="button" role="tab" aria-controls="tabB-pane-1" aria-selected="false" data-anchor="#third-part">part 3</button>
        </li>
      </ul>
    </li>

    <li class="nav-item" role="presentation">
      <button class="nav-link" id="tabB-2" data-bs-toggle="tab" data-bs-target="#tabB-pane-2" type="button" role="tab" aria-controls="tabB-pane-2" aria-selected="true">TabB 2</button>
    </li>
  </ul>
  <div class="tab-content">
    <div class="tab-pane fade show active" id="tabB-pane-0" role="tabpanel" aria-labelledby="tabB-0" tabindex="0">
      This is tabB pane 0.
    </div>
    <div class="tab-pane fade parts" id="tabB-pane-1" role="tabpanel" aria-labelledby="tabB-1" tabindex="0">
      <div id="first-part">
        This is tabB pane 1 - first part.
      </div>
      <div id="second-part">
        This is tabB pane 1 - second part.
      </div>
      <div id="third-part">
        This is tabB pane 1 - third part.
      </div>
    </div>
    <div class="tab-pane fade" id="tabB-pane-2" role="tabpanel" aria-labelledby="tabB-2" tabindex="0">
      This is tabB pane 2.
    </div>
  </div>



</body>

</html>
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章