整体滚动
All checks were successful
Gitea Actions Official-website / deploy-dev (push) Successful in 4s

This commit is contained in:
2026-04-16 14:42:13 +08:00
parent 53a317c8cf
commit 4447aa4a39
4 changed files with 96 additions and 114 deletions

View File

@@ -15,7 +15,7 @@
</div>
</div>
<div class="nav-dropdown-menu">
<div class="nav-dropdown-menu" style="height: 100vh; overflow-y: scroll;-webkit-overflow-scrolling: touch;padding-bottom:4rem;">
<!-- 产品列表 - 有子菜单 -->
<div class="menu-item has-child">
<div class="menu-item-box">
@@ -131,6 +131,7 @@
</div>
</header>
<script>
document.addEventListener('DOMContentLoaded', function ()
{
const navBtn = document.querySelector('.nav-img');
@@ -579,104 +580,6 @@
}
});
// ====================== 动态计算子菜单高度并添加滚动功能(产品列表除外) ======================
// 判断是否为产品列表(第一个菜单项)
function isProductList(menuItem) {
const firstMenuItem = document.querySelector('.menu-item');
return menuItem === firstMenuItem;
}
// 设置子菜单的最大高度
function setSubMenuHeight(subMenu, menuItem) {
if (!subMenu || !menuItem) return;
// 产品列表不处理
if (isProductList(menuItem)) {
subMenu.style.maxHeight = '';
subMenu.style.overflowY = '';
return;
}
// 获取菜单位置信息
const rect = menuItem.getBoundingClientRect();
const bottomSpace = 50; // 底部留白空间
// 计算可用高度 = 视口高度 - 菜单顶部距离 - 底部留白
let availableHeight = window.innerHeight - rect.top - bottomSpace;
// 限制最小高度
if (availableHeight < 200) {
availableHeight = 200;
}
// 设置子菜单的最大高度和滚动
subMenu.style.maxHeight = availableHeight + 'px';
subMenu.style.overflowY = 'auto';
subMenu.style.overflowX = 'hidden';
subMenu.style.WebkitOverflowScrolling = 'touch';
}
// 为所有有子菜单的导航项(产品列表除外)绑定事件
const allMenuItems = document.querySelectorAll('.has-child');
allMenuItems.forEach(function(menuItem) {
const subMenu = menuItem.querySelector('.sub-menu');
const box = menuItem.querySelector('.menu-item-box');
if (!subMenu || !box) return;
// 产品列表不处理滚动功能
if (isProductList(menuItem)) {
return;
}
// 添加点击事件处理高度
box.addEventListener('click', function(e) {
// 如果子菜单即将打开,计算高度
if (!subMenu.classList.contains('show')) {
// 延迟一帧确保DOM已更新
setTimeout(function() {
setSubMenuHeight(subMenu, menuItem);
// 确保滚动位置在顶部
subMenu.scrollTop = 0;
}, 0);
}
});
});
// 窗口大小改变时,重新计算已打开的子菜单高度
window.addEventListener('resize', function() {
const openSubMenus = document.querySelectorAll('.has-child .sub-menu.show');
openSubMenus.forEach(function(subMenu) {
const menuItem = subMenu.closest('.has-child');
if (menuItem && !isProductList(menuItem)) {
setSubMenuHeight(subMenu, menuItem);
}
});
});
// 监听菜单打开状态变化(使用 MutationObserver 确保高度正确设置)
const observer = new MutationObserver(function(mutations) {
mutations.forEach(function(mutation) {
if (mutation.attributeName === 'class') {
const target = mutation.target;
if (target.classList && target.classList.contains('sub-menu') && target.classList.contains('show')) {
const menuItem = target.closest('.has-child');
if (menuItem && !isProductList(menuItem)) {
setSubMenuHeight(target, menuItem);
// 确保滚动位置在顶部
target.scrollTop = 0;
}
}
}
});
});
// 观察所有子菜单的class变化
document.querySelectorAll('.has-child .sub-menu').forEach(function(subMenu) {
observer.observe(subMenu, { attributes: true });
});
// ====================== 购物车弹窗悬浮图功能 ======================
// 处理购物车弹窗中的图片悬浮效果
function initCartModalHover() {
@@ -756,3 +659,4 @@
}
});
</script>