Compare commits
2 Commits
84a5e319cb
...
dev
| Author | SHA1 | Date | |
|---|---|---|---|
| b75a159d70 | |||
| 40d4a41461 |
@@ -350,7 +350,6 @@
|
|||||||
if (mhk && mhk.style.display !== 'block') {
|
if (mhk && mhk.style.display !== 'block') {
|
||||||
// 保存当前滚动位置
|
// 保存当前滚动位置
|
||||||
scrollTopPosition = window.pageYOffset || document.documentElement.scrollTop;
|
scrollTopPosition = window.pageYOffset || document.documentElement.scrollTop;
|
||||||
|
|
||||||
mhk.style.display = 'block';
|
mhk.style.display = 'block';
|
||||||
|
|
||||||
// 禁止滚动,保持位置
|
// 禁止滚动,保持位置
|
||||||
@@ -377,76 +376,18 @@
|
|||||||
hasNavOpen = true;
|
hasNavOpen = true;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
if (!isBuyOpen && !isSearchOpen && !isLangOpen && !hasNavOpen) {
|
|
||||||
mhk.style.display = 'none';
|
mhk.style.display = 'none';
|
||||||
|
|
||||||
// 恢复滚动
|
// 恢复滚动
|
||||||
body.style.position = '';
|
body.style.position = '';
|
||||||
body.style.top = '';
|
body.style.top = '';
|
||||||
body.style.left = '';
|
body.style.left = '';
|
||||||
body.style.right = '';
|
body.style.right = '';
|
||||||
body.style.width = '';
|
body.style.width = '';
|
||||||
|
|
||||||
// 恢复滚动位置
|
// 恢复滚动位置
|
||||||
window.scrollTo(0, scrollTopPosition);
|
window.scrollTo(0, scrollTopPosition);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// ========== header-dropdown 导航下拉菜单打开时显示蒙版 ==========
|
|
||||||
function initNavDropdownOverlay() {
|
|
||||||
const navItems = document.querySelectorAll('.header-nav-item');
|
|
||||||
let hideTimer = null;
|
|
||||||
|
|
||||||
navItems.forEach(item => {
|
|
||||||
const dropdown = item.querySelector('.header-dropdown');
|
|
||||||
if (!dropdown) return;
|
|
||||||
|
|
||||||
// 鼠标移入导航项
|
|
||||||
item.addEventListener('mouseenter', () => {
|
|
||||||
if (hideTimer) clearTimeout(hideTimer);
|
|
||||||
openOverlay();
|
|
||||||
});
|
|
||||||
|
|
||||||
// 鼠标移出导航项
|
|
||||||
item.addEventListener('mouseleave', () => {
|
|
||||||
hideTimer = setTimeout(() => {
|
|
||||||
const isHoveringDropdown = dropdown && dropdown.matches(':hover');
|
|
||||||
if (!isHoveringDropdown) {
|
|
||||||
const isBuyOpen = buyDropdown && buyDropdown.classList.contains('show');
|
|
||||||
const isSearchOpen = searchDropdown && searchDropdown.classList.contains('show');
|
|
||||||
const isLangOpen = langDropdown && langDropdown.classList.contains('show');
|
|
||||||
if (!isBuyOpen && !isSearchOpen && !isLangOpen) {
|
|
||||||
closeOverlay();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}, 100);
|
|
||||||
});
|
|
||||||
|
|
||||||
// 鼠标移入下拉菜单
|
|
||||||
dropdown.addEventListener('mouseenter', () => {
|
|
||||||
if (hideTimer) clearTimeout(hideTimer);
|
|
||||||
openOverlay();
|
|
||||||
});
|
|
||||||
|
|
||||||
// 鼠标移出下拉菜单
|
|
||||||
dropdown.addEventListener('mouseleave', () => {
|
|
||||||
hideTimer = setTimeout(() => {
|
|
||||||
const isHoveringNav = item && item.matches(':hover');
|
|
||||||
if (!isHoveringNav) {
|
|
||||||
const isBuyOpen = buyDropdown && buyDropdown.classList.contains('show');
|
|
||||||
const isSearchOpen = searchDropdown && searchDropdown.classList.contains('show');
|
|
||||||
const isLangOpen = langDropdown && langDropdown.classList.contains('show');
|
|
||||||
if (!isBuyOpen && !isSearchOpen && !isLangOpen) {
|
|
||||||
closeOverlay();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}, 100);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
// 关闭所有导航下拉菜单
|
// 关闭所有导航下拉菜单
|
||||||
function closeAllNavDropdowns() {
|
function closeAllNavDropdowns() {
|
||||||
document.querySelectorAll('.header-dropdown').forEach(dropdown => {
|
document.querySelectorAll('.header-dropdown').forEach(dropdown => {
|
||||||
@@ -604,15 +545,13 @@
|
|||||||
setupDropdownObserver(searchDropdown);
|
setupDropdownObserver(searchDropdown);
|
||||||
setupDropdownObserver(langDropdown);
|
setupDropdownObserver(langDropdown);
|
||||||
|
|
||||||
// ========== header-dropdown JS 控制版本(带防抖) ==========
|
// ========== 监听下拉菜单打开状态,自动控制蒙版 ==========
|
||||||
|
|
||||||
function initHeaderDropdown() {
|
function initHeaderDropdown() {
|
||||||
const navItems = document.querySelectorAll('.header-nav-item');
|
// 获取所有下拉菜单
|
||||||
let hoverTimer = null;
|
|
||||||
let leaveTimer = null;
|
|
||||||
let currentOpenDropdown = null;
|
|
||||||
|
|
||||||
// 获取所有下拉菜单并设置初始状态
|
|
||||||
const allDropdowns = document.querySelectorAll('.header-dropdown');
|
const allDropdowns = document.querySelectorAll('.header-dropdown');
|
||||||
|
|
||||||
|
// 设置初始样式
|
||||||
allDropdowns.forEach(dropdown => {
|
allDropdowns.forEach(dropdown => {
|
||||||
dropdown.style.opacity = '0';
|
dropdown.style.opacity = '0';
|
||||||
dropdown.style.transform = 'translateY(-1.25em)';
|
dropdown.style.transform = 'translateY(-1.25em)';
|
||||||
@@ -620,115 +559,110 @@
|
|||||||
dropdown.style.transition = 'opacity 0.3s ease, transform 0.3s ease';
|
dropdown.style.transition = 'opacity 0.3s ease, transform 0.3s ease';
|
||||||
});
|
});
|
||||||
|
|
||||||
// 显示下拉菜单
|
// 监听单个下拉菜单的样式变化
|
||||||
function showDropdown(dropdown) {
|
function observeDropdown(dropdown) {
|
||||||
if (!dropdown) return;
|
const observer = new MutationObserver(() => {
|
||||||
// 关闭当前打开的
|
const isOpen = dropdown.style.opacity === '1';
|
||||||
if (currentOpenDropdown && currentOpenDropdown !== dropdown) {
|
if (isOpen) {
|
||||||
hideDropdown(currentOpenDropdown);
|
openOverlay();
|
||||||
}
|
} else {
|
||||||
dropdown.style.opacity = '1';
|
let anyOpen = false;
|
||||||
dropdown.style.transform = 'translateY(0)';
|
allDropdowns.forEach(d => {
|
||||||
dropdown.style.pointerEvents = 'auto';
|
if (d.style.opacity === '1') anyOpen = true;
|
||||||
currentOpenDropdown = dropdown;
|
});
|
||||||
}
|
if (!anyOpen) {
|
||||||
|
closeOverlay();
|
||||||
// 隐藏下拉菜单
|
}
|
||||||
function hideDropdown(dropdown) {
|
}
|
||||||
if (!dropdown) return;
|
});
|
||||||
dropdown.style.opacity = '0';
|
|
||||||
dropdown.style.transform = 'translateY(-1.25em)';
|
observer.observe(dropdown, {
|
||||||
dropdown.style.pointerEvents = 'none';
|
attributes: true,
|
||||||
if (currentOpenDropdown === dropdown) {
|
attributeFilter: ['style']
|
||||||
currentOpenDropdown = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 隐藏所有下拉菜单
|
|
||||||
function hideAllDropdowns() {
|
|
||||||
allDropdowns.forEach(dropdown => {
|
|
||||||
dropdown.style.opacity = '0';
|
|
||||||
dropdown.style.transform = 'translateY(-1.25em)';
|
|
||||||
dropdown.style.pointerEvents = 'none';
|
|
||||||
});
|
});
|
||||||
currentOpenDropdown = null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 为每个下拉菜单添加监听
|
||||||
|
allDropdowns.forEach(dropdown => {
|
||||||
|
observeDropdown(dropdown);
|
||||||
|
});
|
||||||
|
|
||||||
|
// 鼠标悬停控制下拉菜单显示/隐藏
|
||||||
|
const navItems = document.querySelectorAll('.header-nav-item');
|
||||||
|
|
||||||
navItems.forEach(item => {
|
navItems.forEach(item => {
|
||||||
const dropdown = item.querySelector('.header-dropdown');
|
const dropdown = item.querySelector('.header-dropdown');
|
||||||
if (!dropdown) return;
|
if (!dropdown) return;
|
||||||
|
|
||||||
// 鼠标移入导航项
|
let timer = null;
|
||||||
|
let isHovering = false; // 增加悬停状态标记
|
||||||
|
|
||||||
|
// 显示下拉菜单的函数
|
||||||
|
const showDropdown = () => {
|
||||||
|
if (timer) clearTimeout(timer);
|
||||||
|
if (dropdown.style.opacity === '1') return;
|
||||||
|
dropdown.style.opacity = '1';
|
||||||
|
dropdown.style.transform = 'translateY(0)';
|
||||||
|
dropdown.style.pointerEvents = 'auto';
|
||||||
|
};
|
||||||
|
|
||||||
|
// 隐藏下拉菜单的函数
|
||||||
|
const hideDropdown = () => {
|
||||||
|
if (timer) clearTimeout(timer);
|
||||||
|
if (dropdown.style.opacity === '0') return;
|
||||||
|
dropdown.style.opacity = '0';
|
||||||
|
dropdown.style.transform = 'translateY(-1.25em)';
|
||||||
|
dropdown.style.pointerEvents = 'none';
|
||||||
|
};
|
||||||
|
|
||||||
item.addEventListener('mouseenter', () => {
|
item.addEventListener('mouseenter', () => {
|
||||||
// 清除离开定时器
|
isHovering = true;
|
||||||
if (leaveTimer) clearTimeout(leaveTimer);
|
clearTimeout(timer);
|
||||||
if (hoverTimer) clearTimeout(hoverTimer);
|
showDropdown();
|
||||||
|
});
|
||||||
|
|
||||||
|
item.addEventListener('mouseleave', (e) => {
|
||||||
|
isHovering = false;
|
||||||
|
// 检查鼠标是否移到了下拉菜单上
|
||||||
|
const relatedTarget = e.relatedTarget;
|
||||||
|
const isMovingToDropdown = dropdown.contains(relatedTarget);
|
||||||
|
|
||||||
// 防抖:延迟100ms再显示,避免频繁触发
|
if (isMovingToDropdown) {
|
||||||
hoverTimer = setTimeout(() => {
|
// 如果移向下拉菜单,不清除,等待下拉菜单的 mouseenter
|
||||||
// 关闭其他弹窗(搜索、语言、购买)
|
return;
|
||||||
if (searchDropdown) searchDropdown.classList.remove('show');
|
}
|
||||||
if (langDropdown) langDropdown.classList.remove('show');
|
|
||||||
if (buyDropdown) buyDropdown.classList.remove('show');
|
timer = setTimeout(() => {
|
||||||
|
if (!isHovering && !dropdown.matches(':hover')) {
|
||||||
showDropdown(dropdown);
|
hideDropdown();
|
||||||
// 打开蒙版层
|
}
|
||||||
if (typeof openOverlay === 'function') openOverlay();
|
|
||||||
}, 100);
|
}, 100);
|
||||||
});
|
});
|
||||||
|
|
||||||
// 鼠标移出导航项
|
|
||||||
item.addEventListener('mouseleave', () => {
|
|
||||||
// 清除移入定时器
|
|
||||||
if (hoverTimer) clearTimeout(hoverTimer);
|
|
||||||
|
|
||||||
// 延迟300ms再隐藏,给用户移动到下拉菜单的时间
|
|
||||||
leaveTimer = setTimeout(() => {
|
|
||||||
// 检查鼠标是否在下拉菜单上
|
|
||||||
const isHoveringDropdown = dropdown.matches(':hover');
|
|
||||||
if (!isHoveringDropdown) {
|
|
||||||
hideDropdown(dropdown);
|
|
||||||
// 关闭蒙版层
|
|
||||||
if (typeof closeOverlay === 'function') closeOverlay();
|
|
||||||
}
|
|
||||||
}, 300);
|
|
||||||
});
|
|
||||||
|
|
||||||
// 鼠标移入下拉菜单
|
|
||||||
dropdown.addEventListener('mouseenter', () => {
|
dropdown.addEventListener('mouseenter', () => {
|
||||||
if (leaveTimer) clearTimeout(leaveTimer);
|
isHovering = true;
|
||||||
showDropdown(dropdown);
|
clearTimeout(timer);
|
||||||
|
showDropdown();
|
||||||
});
|
});
|
||||||
|
|
||||||
// 鼠标移出下拉菜单
|
dropdown.addEventListener('mouseleave', (e) => {
|
||||||
dropdown.addEventListener('mouseleave', () => {
|
isHovering = false;
|
||||||
leaveTimer = setTimeout(() => {
|
// 检查鼠标是否移回了导航项
|
||||||
const isHoveringNav = item.matches(':hover');
|
const relatedTarget = e.relatedTarget;
|
||||||
if (!isHoveringNav) {
|
const isMovingToNavItem = item.contains(relatedTarget);
|
||||||
hideDropdown(dropdown);
|
|
||||||
// 关闭蒙版层
|
if (isMovingToNavItem) {
|
||||||
if (typeof closeOverlay === 'function') closeOverlay();
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
timer = setTimeout(() => {
|
||||||
|
if (!isHovering && !item.matches(':hover')) {
|
||||||
|
hideDropdown();
|
||||||
}
|
}
|
||||||
}, 200);
|
}, 100);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
// 点击其他地方关闭所有下拉菜单
|
|
||||||
document.addEventListener('click', (e) => {
|
|
||||||
if (!e.target.closest('.header-nav-item')) {
|
|
||||||
hideAllDropdowns();
|
|
||||||
if (typeof closeOverlay === 'function') closeOverlay();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// 暴露方法供外部调用
|
|
||||||
window.headerDropdown = {
|
|
||||||
hideAll: hideAllDropdowns,
|
|
||||||
show: showDropdown,
|
|
||||||
hide: hideDropdown
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 初始化(在 DOM 加载完成后执行)
|
// 初始化(在 DOM 加载完成后执行)
|
||||||
if (document.readyState === 'loading') {
|
if (document.readyState === 'loading') {
|
||||||
document.addEventListener('DOMContentLoaded', initHeaderDropdown);
|
document.addEventListener('DOMContentLoaded', initHeaderDropdown);
|
||||||
@@ -750,8 +684,8 @@
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
// 初始化导航下拉菜单蒙版层
|
// // 初始化导航下拉菜单蒙版层
|
||||||
initNavDropdownOverlay();
|
// initNavDropdownOverlay();
|
||||||
|
|
||||||
// 初始化渲染
|
// 初始化渲染
|
||||||
renderHistory();
|
renderHistory();
|
||||||
|
|||||||
@@ -97,10 +97,11 @@ a {
|
|||||||
bottom: 0;
|
bottom: 0;
|
||||||
left: 0;
|
left: 0;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: 0.125em;
|
height: 2px;
|
||||||
background-color: #004bfa;
|
background-color: #004bfa;
|
||||||
transform: scaleX(0);
|
transform: scaleX(0);
|
||||||
transition: transform 0.2s ease;
|
transition: transform 0.2s ease;
|
||||||
|
z-index: 999;
|
||||||
}
|
}
|
||||||
|
|
||||||
.header-nav-title:hover::after,
|
.header-nav-title:hover::after,
|
||||||
@@ -147,12 +148,7 @@ a {
|
|||||||
transition: color 0.2s;
|
transition: color 0.2s;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* .header-nav-btn img {
|
|
||||||
width: 1.5em;
|
|
||||||
max-width: 17px;
|
|
||||||
max-height: 17px;
|
|
||||||
height: 1.5em;
|
|
||||||
} */
|
|
||||||
|
|
||||||
.header-nav-btn:hover {
|
.header-nav-btn:hover {
|
||||||
color: #004bfa;
|
color: #004bfa;
|
||||||
@@ -269,7 +265,7 @@ a {
|
|||||||
left: 0;
|
left: 0;
|
||||||
right: 0;
|
right: 0;
|
||||||
background-color: #fff;
|
background-color: #fff;
|
||||||
z-index: 999;
|
z-index: 99;
|
||||||
border-top: none;
|
border-top: none;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
padding-bottom: 2.375em;
|
padding-bottom: 2.375em;
|
||||||
@@ -339,7 +335,7 @@ a {
|
|||||||
display: flex;
|
display: flex;
|
||||||
flex: 1;
|
flex: 1;
|
||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
max-width: 48%;
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -354,10 +350,7 @@ a {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 单个分类区块 */
|
|
||||||
.header-category-block {
|
|
||||||
/* flex: 1; */
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
.header-category-title {
|
.header-category-title {
|
||||||
@@ -400,6 +393,7 @@ a {
|
|||||||
flex: 1;
|
flex: 1;
|
||||||
min-width: 0;
|
min-width: 0;
|
||||||
font-size: 16px;
|
font-size: 16px;
|
||||||
|
max-width: 748px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -429,12 +423,12 @@ a {
|
|||||||
transform: translateY(-2px)
|
transform: translateY(-2px)
|
||||||
}
|
}
|
||||||
|
|
||||||
.header-product-card:nth-child(1) {
|
/* .header-product-card:nth-child(1) {
|
||||||
/* margin-right: 1.5em; */
|
|
||||||
}
|
} */
|
||||||
|
|
||||||
.header-product-card:nth-child(3) {
|
.header-product-card:nth-child(3) {
|
||||||
/* margin-right: 1.5em; */
|
|
||||||
margin-top: 1.5em;
|
margin-top: 1.5em;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -442,20 +436,7 @@ a {
|
|||||||
margin-top: 1.5em;
|
margin-top: 1.5em;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*.header-product-img {*/
|
|
||||||
/* width: 22.625em;*/
|
|
||||||
/* height: 12.25em;*/
|
|
||||||
/* background-color: #f5f5f5;*/
|
|
||||||
/* display: flex;*/
|
|
||||||
/* align-items: center;*/
|
|
||||||
/* justify-content: center;*/
|
|
||||||
/* color: #999;*/
|
|
||||||
/*}*/
|
|
||||||
|
|
||||||
/*.header-product-img img {*/
|
|
||||||
/* width: 22.625em;*/
|
|
||||||
/* height: 12.25em;*/
|
|
||||||
/*}*/
|
|
||||||
.header-product-img {
|
.header-product-img {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
aspect-ratio: 22.625 / 12.25;
|
aspect-ratio: 22.625 / 12.25;
|
||||||
@@ -465,7 +446,6 @@ a {
|
|||||||
justify-content: center;
|
justify-content: center;
|
||||||
color: #999;
|
color: #999;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
/* border-radius: 0.5em; */
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.header-product-img img {
|
.header-product-img img {
|
||||||
|
|||||||
Reference in New Issue
Block a user