You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用JS/jQuery实现Bootstrap4.6水平滚动导航栏li元素居中与自动激活

移动端滚动导航改造方案

核心改造点

  • 移除原有硬编码的宽度判断逻辑,改为动态计算所有导航项的位置,适配不同宽度的导航项和不同屏幕尺寸
  • 新增点击导航项的自动居中逻辑,通过计算元素中点和导航可视区中点的差值实现平滑滚动
  • 新增滚动时的自动激活逻辑,加入防抖处理避免频繁计算导致的性能问题,通过判断元素中点与导航中点的位置关系确定当前激活项
  • 支持任意数量的导航项,不需要手动修改代码适配

完整修改代码

JS代码(替换原有JS即可)

$(function() {
  const $nav = $('#navegacion');
  const $navItems = $nav.find('li');
  const navWidth = $nav.width();
  // 导航可视区域中点的X坐标
  const navCenterX = navWidth / 2;

  // 功能1:点击导航项自动滚动到居中位置
  $navItems.on('click', function(e) {
    const $item = $(this);
    // 计算当前元素相对于导航容器的左偏移
    const itemLeft = $item.offset().left - $nav.offset().left + $nav.scrollLeft();
    const itemWidth = $item.outerWidth();
    // 计算目标滚动位置:让元素中点与导航中点对齐
    const targetScroll = itemLeft + itemWidth / 2 - navCenterX;
    // 平滑滚动到目标位置
    $nav.animate({
      scrollLeft: targetScroll
    }, 200);
  });

  // 功能2:滚动时自动激活处于居中位置的导航项
  let scrollTimer = null;
  $nav.on('scroll', function() {
    // 防抖处理,减少不必要的计算
    if (scrollTimer) clearTimeout(scrollTimer);
    scrollTimer = setTimeout(() => {
      const scrollLeft = $nav.scrollLeft();
      // 遍历所有导航项,找到当前处于居中位置的项
      $navItems.each(function() {
        const $item = $(this);
        const itemLeft = $item.offset().left - $nav.offset().left + scrollLeft;
        const itemWidth = $item.outerWidth();
        const itemCenterX = itemLeft + itemWidth / 2;
        // 允许半格元素宽度的误差范围
        if (Math.abs(itemCenterX - (scrollLeft + navCenterX)) < itemWidth / 2) {
          $navItems.removeClass('active');
          $item.addClass('active');
          return false;
        }
      });
    }, 50);
  });
});

CSS可选调整

如果希望导航项不要每个占满全屏宽度,改为紧凑排列的可滚动tab样式,可将原有CSS中#segunda-nav li的min-width: 100%修改为min-width: 120px,数值可根据实际设计需求调整。

HTML代码(无需修改,原有代码可直接复用)

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.0/dist/css/bootstrap.min.css" integrity="sha384-B0vP5xmATw1+K9KRQjQERJvTumQW0nPEzvF6L/Z6nronJ3oUOFUFpCjEUQouq2+l" crossorigin="anonymous">

<section id="segunda-nav">
    <div class="container">
        <div class="row">
            <div class="col">
                <ul id="navegacion" class="nav nav-tabs" role="tablist">
                    <li id="description" role="presentation" class="active"><a data-target="" aria-controls="home" role="tab" data-toggle="tab">DESCRIPTION</a></li>
                    <li id="what" role="presentation"><a data-target="#informacion-programa" data-slide-to="1" aria-controls="profile" role="tab" data-toggle="tab" class="active">WHAT?</a></li>
                    <li id="where" role="presentation"><a data-target="#informacion-programa" data-slide-to="2" aria-controls="messages" role="tab" data-toggle="tab">WHERE?</a></li>
                    <li id="when" role="presentation"><a data-target="#informacion-programa" data-slide-to="3" aria-controls="settings" role="tab" data-toggle="tab">WHEN?</a></li>
                </ul>
            </div>
        </div>
    </div>
</section>

内容的提问来源于stack exchange,提问作者Alexandro Giles

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 12:27:02