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

如何为Bootstrap水平导航栏添加滚动按钮实现内容滚动?

问题:为Bootstrap水平导航栏添加左右按钮滚动效果

我用Bootstrap搭建的网站中有一个包含大量分类的水平导航栏,当前仅支持默认横向滚动效果。为让网站更具现代感,我希望将默认滚动替换为带左右按钮的滚动效果,但在Bootstrap官网未找到相关方案。请问能否通过Bootstrap结合JavaScript实现该需求?

原HTML代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Annchan4 Tasty Shop</title>
    <link rel="stylesheet" type="text/css" href="css/index.css">
    <!--bootstrap-->
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-GLhlTQ8iRABdZLl6O3oVMWSktQOp6b7In1Zl3/Jr59b6EGGoI1aFkw7cmDA6j6gD" crossorigin="anonymous">
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.10.3/font/bootstrap-icons.css">
</head>
<body>
<div class="w-75 mx-auto">
    <nav class="navbar navbar-expand-lg"> <!--isso eh um flex-->
        <div class="container-fluid">
            <div class="collapse navbar-collapse" id="navbarNav">
                <ul class="navbar-nav">
                    <li class="nav-item me-2">
                        <a class="nav-link link-light btn btn-secondary" aria-current="page" href="#">
                            Promos
                        </a>
                    </li>
                    <li class="nav-item me-2">
                        <a class="nav-link link-light btn btn-secondary" href="#">
                            Cakes
                        </a>
                    </li>
                    <li class="nav-item me-2">
                        <a class="nav-link link-light btn btn-secondary" href="#">
                            Cookies
                        </a>
                    </li>
                    <li class="nav-item me-2">
                        <a class="nav-link link-light btn btn-secondary" href="#">
                            Brownies
                        </a>
                    </li>
                    <li class="nav-item me-2">
                        <a class="nav-link link-light btn btn-secondary" href="#">
                            Ice-cream
                        </a>
                    </li>
                    <li class="nav-item me-2">
                        <a class="nav-link link-light btn btn-secondary" href="#">
                            Fudges
                        </a>
                    </li>
                    <li class="nav-item me-2">
                        <a class="nav-link link-light btn btn-secondary" href="#">
                            Savory Crackers
                        </a>
                    </li>
                    <li class="nav-item me-2">
                        <a class="nav-link link-light btn btn-secondary" href="#">
                            Savory Cakes
                        </a>
                    </li>
                    <li class="nav-item me-2">
                        <a class="nav-link link-light btn btn-secondary" href="#">
                            Savory Breads
                        </a>
                    </li>
                    <li class="nav-item me-2">
                        <a class="nav-link link-light btn btn-secondary" href="#">
                            Savory Muffins
                        </a>
                    </li>
                    <li class="nav-item me-2">
                        <a class="nav-link link-light btn btn-secondary" href="#">
                            Pizzas
                        </a>
                    </li>
                    <li class="nav-item me-2">
                        <a class="nav-link link-light btn btn-secondary" href="#">
                            Lunch
                        </a>
                    </li>
                    <li class="nav-item me-2">
                        <a class="nav-link link-light btn btn-secondary" href="#">
                            Dinner
                        </a>
                    </li>
                    <li class="nav-item me-2">
                        <a class="nav-link link-light btn btn-secondary" href="#">
                            Fit
                        </a>
                    </li>
                    <li class="nav-item me-2">
                        <a class="nav-link link-light btn btn-secondary" href="#">
                            Smoothies
                        </a>
                    </li>
                    <li class="nav-item me-2">
                        <a class="nav-link link-light btn btn-secondary" href="#">
                            Market
                        </a>
                    </li>
                </ul>
            </div>
        </div>
    </nav>
</div>
</body>
</html>

原CSS代码

#navbarNav {
    white-space: nowrap;
    overflow-x: auto;
}

.nav-item {
    display: inline-block;
    float: none;
}

.btn-secondary
{
    color:white;
}

解决方案

完全可以通过Bootstrap组件结合JavaScript实现该需求,具体实现步骤如下:

1. 修改HTML结构,添加滚动控制按钮

在导航栏容器内插入左右滚动按钮,使用Bootstrap自带的按钮样式和图标组件:

<div class="w-75 mx-auto">
    <nav class="navbar navbar-expand-lg position-relative"> <!-- 添加相对定位,用于按钮绝对定位 -->
        <div class="container-fluid">
            <!-- 左滚动按钮 -->
            <button class="scroll-btn scroll-left btn btn-secondary position-absolute start-0 top-50 translate-middle-y d-none d-lg-block">
                <i class="bi bi-chevron-left"></i>
            </button>
            <div class="collapse navbar-collapse" id="navbarNav">
                <ul class="navbar-nav">
                    <!-- 原有导航项保持不变 -->
                </ul>
            </div>
            <!-- 右滚动按钮 -->
            <button class="scroll-btn scroll-right btn btn-secondary position-absolute end-0 top-50 translate-middle-y d-none d-lg-block">
                <i class="bi bi-chevron-right"></i>
            </button>
        </div>
    </nav>
</div>

2. 更新CSS样式

调整导航栏容器样式,隐藏原生滚动条,优化按钮显示效果:

#navbarNav {
    white-space: nowrap;
    overflow-x: auto;
    /* 隐藏各浏览器原生滚动条 */
    scrollbar-width: none; /* Firefox */
    -ms-overflow-style: none; /* IE/Edge */
}

#navbarNav::-webkit-scrollbar {
    display: none; /* Chrome/Safari/Opera */
}

.nav-item {
    display: inline-block;
    float: none;
}

.btn-secondary {
    color:white;
}

/* 导航栏容器隐藏溢出内容,避免按钮超出范围 */
.navbar.position-relative {
    overflow: hidden;
}

.scroll-btn {
    z-index: 10;
    width: 40px;
    height: 40px;
    border-radius: 50%;
}

3. 编写JavaScript滚动逻辑

实现按钮滚动控制、按钮自动显示/隐藏逻辑:

document.addEventListener('DOMContentLoaded', function() {
    const navbarNav = document.getElementById('navbarNav');
    const scrollLeftBtn = document.querySelector('.scroll-left');
    const scrollRightBtn = document.querySelector('.scroll-right');
    const scrollStep = 300; // 每次滚动的距离,可根据需求调整

    // 更新按钮显示状态:滚动到两端时隐藏对应按钮
    function updateButtonVisibility() {
        scrollLeftBtn.classList.toggle('d-none', navbarNav.scrollLeft <= 10);
        scrollRightBtn.classList.toggle('d-none', navbarNav.scrollLeft >= navbarNav.scrollWidth - navbarNav.clientWidth - 10);
    }

    // 左滚动逻辑
    scrollLeftBtn.addEventListener('click', function() {
        navbarNav.scrollBy({ left: -scrollStep, behavior: 'smooth' });
    });

    // 右滚动逻辑
    scrollRightBtn.addEventListener('click', function() {
        navbarNav.scrollBy({ left: scrollStep, behavior: 'smooth' });
    });

    // 滚动时实时更新按钮状态
    navbarNav.addEventListener('scroll', updateButtonVisibility);

    // 初始化页面时检查按钮状态
    updateButtonVisibility();

    // 窗口大小变化时重新检查按钮状态
    window.addEventListener('resize', updateButtonVisibility);
});

效果说明

  • 大屏幕下自动显示左右滚动按钮,点击可平滑滚动导航栏
  • 滚动到导航栏两端时,对应方向的按钮会自动隐藏
  • 保留原生横向滚动功能,兼容鼠标滚轮、触摸滑动操作
  • 移动端保持Bootstrap默认的折叠导航逻辑,滚动按钮仅在大屏幕显示

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 20:11:57