You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

106 lines
3.5 KiB

document.addEventListener('DOMContentLoaded', function () {
const sections = document.querySelectorAll('.section');
const navLinks = document.querySelectorAll('.nav-link');
const menuToggle = document.querySelector('.menu-toggle');
const navMenu = document.querySelector('.nav-menu');
const sectionContainer = document.querySelector('.section-container');
// 汉堡菜单点击事件
menuToggle.addEventListener('click', function () {
this.classList.toggle('active');
navMenu.classList.toggle('active');
});
// 导航链接点击事件
navLinks.forEach(link => {
link.addEventListener('click', function (e) {
e.preventDefault();
const targetId = this.getAttribute('href');
const targetSection = document.querySelector(targetId);
// 关闭移动端菜单
menuToggle.classList.remove('active');
navMenu.classList.remove('active');
// 滚动到对应模块
targetSection.scrollIntoView({
behavior: 'smooth'
});
});
});
// 模块化滚动检测
sectionContainer.addEventListener('scroll', function () {
const currentScroll = this.scrollTop;
const windowHeight = window.innerHeight;
sections.forEach((section, index) => {
const sectionTop = index * windowHeight;
const sectionBottom = (index + 1) * windowHeight;
if (currentScroll >= sectionTop && currentScroll < sectionBottom) {
const currentId = section.getAttribute('id');
navLinks.forEach(link => {
link.classList.remove('active');
if (link.getAttribute('href') === `#${currentId}`) {
link.classList.add('active');
}
});
}
});
});
// 阻止默认滚动行为
window.addEventListener('wheel', function (e) {
if (e.cancelable) {
e.preventDefault();
}
const delta = Math.sign(e.deltaY);
const currentIndex = Math.round(sectionContainer.scrollTop / window.innerHeight);
const maxIndex = sections.length - 1;
let targetIndex = currentIndex + delta;
targetIndex = Math.max(0, Math.min(targetIndex, maxIndex));
sectionContainer.scrollTo({
top: targetIndex * window.innerHeight,
behavior: 'smooth'
});
}, { passive: false });
// 触摸设备支持
let startY;
sectionContainer.addEventListener('touchstart', function (e) {
startY = e.touches[0].clientY;
}, { passive: true });
sectionContainer.addEventListener('touchmove', function (e) {
if (e.cancelable) {
e.preventDefault();
}
const currentY = e.touches[0].clientY;
const deltaY = startY - currentY;
if (Math.abs(deltaY) > 50) { // 滑动阈值
const direction = deltaY > 0 ? 1 : -1;
const currentIndex = Math.round(sectionContainer.scrollTop / window.innerHeight);
const maxIndex = sections.length - 1;
let targetIndex = currentIndex + direction;
targetIndex = Math.max(0, Math.min(targetIndex, maxIndex));
sectionContainer.scrollTo({
top: targetIndex * window.innerHeight,
behavior: 'smooth'
});
startY = currentY;
}
}, { passive: false });
// 初始化高亮
sectionContainer.dispatchEvent(new Event('scroll'));
});