You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Chrome浏览器点击汉堡菜单时顶部导航栏颜色偶发未变更问题求解

问题成因
  • 样式值提前获取错误:脚本初始化阶段就一次性读取移动端导航栏背景色存入navColor,若此时CSS未加载完成、DOM未完成样式渲染,拿到的颜色值就是错误初始值,后续所有点击事件都会复用该错误值,导致颜色变更不生效。
  • 菜单状态判断逻辑脆弱:使用mobNav.className === "on"全等判断识别菜单展开状态,只要该元素新增任何其他类名,该判断就会直接失效,无法触发颜色修改逻辑。
  • 脚本执行时机风险:若脚本在DOM加载完成前执行,querySelector可能偶尔获取不到对应导航栏元素,后续逻辑直接报错中断。
修复代码

将重复逻辑抽为公共函数,优化类名判断逻辑和样式取值时机,增加DOM加载监听避免元素获取失败,修复后的代码如下:

// ham.js
// 等待DOM完全加载后再执行逻辑
document.addEventListener('DOMContentLoaded', () => {
  // For mobile hamburger
  const mobNav = document.querySelector("nav#mobile");
  const deskNav = document.querySelector("nav.desktop");
  const hamBtn = document.getElementsByClassName("ham")[0];
  const line2 = document.getElementById("line2");

  // 抽离公共的导航状态切换逻辑
  function toggleNavState() {
    hamBtn.classList.toggle("cross");
    line2.classList.toggle("none");
    mobNav.classList.toggle("on");
    mobNav.classList.toggle("off");
    // 实时获取最新的移动端导航背景色,避免提前取值错误
    const navColor = window.getComputedStyle(mobNav).getPropertyValue("background-color");
    // 用contains判断类名,兼容后续新增其他类的场景
    if(mobNav.classList.contains("on")){
      deskNav.style.backgroundColor = navColor;
    } else {
      deskNav.style.backgroundColor = "";
    }
  }

  hamBtn.addEventListener("click", (event) => {
    toggleNavState();
    event.stopPropagation();
  });

  // To close the navbar on clicking a link. 
  const mobileLis = document.querySelectorAll("nav#mobile a");
  Array.from(mobileLis).forEach(link => {
    link.addEventListener("click", event => {
      toggleNavState();
      event.stopPropagation();
    })
  })
})

内容的提问来源于stack exchange,提问作者Anon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 04:45:03