怎样使顶部菜单栏随着滚动条动

用html,scc,js写,怎样使顶部菜单栏随着滚动条动,就是有一个菜单栏,然后,混动鼠标到下一个小标题界面会随着一起动

position:fixed

  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/654552
  • 以下回答由chatgpt基于相关博客总结生成:

    我可以回答这个问题。

    答: 实现顶部菜单栏随滚动条动态变化的关键是:监听页面的滚动事件,获取当前页面的滚动高度,判断当前滚动位置在页面哪个小标题所在区域,然后根据区域找到对应的菜单元素并加上高亮样式。

    具体的实现流程如下:

    1. 首先需要在 HTML 中创建需要同步的小标题(例如 h2)和导航元素(例如 ul),并对它们设置对应的 CSS 样式,包括固定和绝对定位,宽高,字体大小等属性。

    2. 然后需要监听 window 对象的 scroll 事件,以便在页面滚动时动态更新当前滚动位置,并根据其确定当前所处的区域。

    3. 接下来,需要使用 getBoundingClientRect() 方法获取每个小标题所处的位置信息,因为 scroll 事件中通过 window.pageYOffset 得到的是相对窗口的滚动高度,所以需要减去文档顶部的偏移值。

    4. 接着,通过遍历小标题和菜单元素判断当前滚动位置所处的区域,并根据条件加上高亮样式。

    为了说明具体的实现细节,这里给出一些参考代码:

    HTML 部分代码:

    <body>
      <header>
        <nav>
          <ul class="menu">
            <li><a href="#">Section 1</a></li>
            <li><a href="#">Section 2</a></li>
            <li><a href="#">Section 3</a></li>
            <li><a href="#">Section 4</a></li>
            <li><a href="#">Section 5</a></li>
          </ul>
        </nav>
      </header>
      <main>
        <h2>Section 1</h2>
        <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit...</p>
    
        <h2>Section 2</h2>
        <p>Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat...</p>
    
        <h2>Section 3</h2>
        <p>Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur...</p>
    
        <h2>Section 4</h2>
        <p>Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum...</p>
    
        <h2>Section 5</h2>
        <p>Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium...</p>
      </main>
    </body>
    

    CSS 部分代码:

    /* 固定顶部导航栏的定位和样式 */
    header {
      position: fixed;
      top: 0;
      left: 0;
      right: 0;
      height: 60px;
      background-color: #fff;
      z-index: 1000;
      border-bottom: 1px solid #ccc;
    }
    
    /* 导航元素的布局和样式 */
    nav {
      display: flex;
      justify-content: center;
      height: 60px;
      max-width: 960px;
      margin: 0 auto;
    }
    
    .menu {
      display: flex;
    }
    
    .menu li {
      margin-left: 20px;
    }
    
    .menu li a {
      font-size: 16px;
      color: #000;
    }
    
    /* 小标题的布局和样式 */
    main h2 {
      margin-top: 100px;
      position: relative;
    }
    
    /* 给当前菜单元素添加高亮样式 */
    .menu li.active a {
      color: #f00;
    }
    

    JavaScript 部分代码:

    // 获取所有的 h2 元素和菜单元素
    const sections = document.querySelectorAll('main h2');
    const menuItems = document.querySelectorAll('.menu li a');
    
    // 定义一个函数,判断当前滚动位置所处的区域
    function getSectionIndex() {
      let index = 0;
      const { top } = sections[0].getBoundingClientRect();
      for (let i = 1; i < sections.length; i++) {
        if (sections[i].getBoundingClientRect().top - top <= 0) {
          index = i;
        } else {
          break;
        }
      }
      return index;
    }
    
    // 在 scroll 事件中动态更新菜单项的高亮状态
    window.addEventListener('scroll', () => {
      const index = getSectionIndex();
      menuItems.forEach((menuItem, i) => {
        i === index ? menuItem.parentNode.classList.add('active') : menuItem.parentNode.classList.remove('active');
      });
    });
    

    参考链接:https://www.cnblogs.com/shadowland/p/11174435.html