用html,scc,js写,怎样使顶部菜单栏随着滚动条动,就是有一个菜单栏,然后,混动鼠标到下一个小标题界面会随着一起动
position:fixed
我可以回答这个问题。
答: 实现顶部菜单栏随滚动条动态变化的关键是:监听页面的滚动事件,获取当前页面的滚动高度,判断当前滚动位置在页面哪个小标题所在区域,然后根据区域找到对应的菜单元素并加上高亮样式。
具体的实现流程如下:
首先需要在 HTML 中创建需要同步的小标题(例如 h2)和导航元素(例如 ul),并对它们设置对应的 CSS 样式,包括固定和绝对定位,宽高,字体大小等属性。
然后需要监听 window 对象的 scroll 事件,以便在页面滚动时动态更新当前滚动位置,并根据其确定当前所处的区域。
接下来,需要使用 getBoundingClientRect() 方法获取每个小标题所处的位置信息,因为 scroll 事件中通过 window.pageYOffset 得到的是相对窗口的滚动高度,所以需要减去文档顶部的偏移值。
接着,通过遍历小标题和菜单元素判断当前滚动位置所处的区域,并根据条件加上高亮样式。
为了说明具体的实现细节,这里给出一些参考代码:
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');
});
});