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

响应式导航栏Dark mode按钮仅移动端生效问题求助

响应式导航栏Dark Mode按钮仅移动端生效问题

问题描述

我已将导航栏设置为响应式,但当前Dark mode按钮仅在移动端屏幕上生效。尝试在JS代码中将btn替换为hideOnMobile但未解决问题,推测问题源于hideOnMobile类的媒体查询设置,因为该类在移动端隐藏时功能正常。

相关代码

HTML

<nav>
  <ul class="sidebar">
    <li onclick=hideSidebar()><a href="#"><svg xmlns="http://www.w3.org/2000/svg" height="26" viewBox="0 96 960 960" width="26"><path d="m249 849-42-42 231-231-231-231 42-42 231 231 231-231 42 42-231 231 231 231-42 42-231-231-231 231Z"/></svg></a></li>
    <li class="active"><a href="#">Home</a></li>
    <li><a href="#">Contact</a></li>
    <li><a href="#">Sign In</a></li>
    <li class='important'><a href="#">Get Started</a></li>
    <li><div class="btn">
      <div class="btn__indicator">
        <div class="btn__icon-container">
          <i class="btn__icon fa-solid fa-sun fa-moon"></i>
        </div>
      </div>
    </div></li>
  </ul>
  <ul>
    <li class="active hideOneMobile"><a href="">Home</a></li>
    <li class="hideOnMobile"><a href="#">Contact</a></li>
    <li class="hideOnMobile"><a href="#">Sign In</a></li>
    <li class='important hideOnMobile'><a href="#">Get Started</a></li>
    <li class="hideOnMobile"><div class="btn">
      <div class="btn__indicator">
        <div class="btn__icon-container">
          <i class="btn__icon fa-solid fa-sun fa-moon"></i>
        </div>
      </div>
    </div></li>
    <li class="menu-button" onclick=showSidebar()><a href="#"><svg xmlns="http://www.w3.org/2000/svg" height="26" viewBox="0 96 960 960" width="26"><path d="M120 816v-60h720v60H120Zm0-210v-60h720v60H120Zm0-210v-60h720v60H120Z"/></svg></a></li>
  </ul>
</nav>

CSS

ul {
  list-style: none;
  padding: 0;
  margin: 0;
}
nav ul {
  visibility: unset;
  opacity: 1;
  background: none;
  display: flex;
  margin: 0;
  padding: 0;
  position: unset;
  height: auto;
  align-items: center;
  transform: translateX(0);
  width:100%;
  transition: all .3s;
} 
nav ul li a {
  color: var(--primary-color);
  font-size: 1.1em;
  font-weight: 700;
  padding: 0 1em;
  display: block;
  text-decoration: none;
}
.sidebar{
  position: fixed;
  top: 0; 
  right: 0;
  height: 100vh;
  width: 250px;
  background-color: rgba(255, 255, 255, 0.15);
  backdrop-filter: blur(12px);
  box-shadow: -10px 0 10px rgba(0, 0, 0, 0.1);
  list-style: none;
  display: none;
  flex-direction: column;
  align-items: flex-start;
  justify-content: flex-start;
  z-index: 1000;
  
}
.sidebar li{
  width: 100%;
  margin: 1rem;
}
.sidebar .important{
  width: 8rem;
  margin-left: 1.8rem;
}
.sidebar .btn {
  margin-left: 0.8rem;
}
.sidebar a{
  width: 100%;
}
.menu-button{
  display: none;
}
@media(max-width: 800px){
  .hideOnMobile {
    display: none;
  }
  .active {
    display: none;
  }
  .sidebar .active{
    display: block;
  }
  .menu-button{
    display: block;
  }
}
@media(max-width: 400px){
  .sidebar{
    width: 100%;
  }
}

原JavaScript

btn.addEventListener('click', () => {
  body.classList.toggle('dark-mode');
  const isDarkMode = body.classList.contains('dark-mode');
  localStorage.setItem('dark-mode', JSON.stringify(isDarkMode));
  console.log(isDarkMode);
  // Toggle the spin animation class
  icon.classList.add('animated');
  setTimeout(() => {
    icon.classList.remove('animated');
  }, 500);
  if (isDarkMode) {
    icon.classList.remove('fa-sun');
    icon.classList.add('fa-moon');
    articleTitles.forEach(title => {
      title.classList.add('dark-mode');
    });
    articleAuthor.classList.add('dark-mode');
  } else {
    icon.classList.remove('fa-moon');
    icon.classList.add('fa-sun');
    articleTitles.forEach(title => {
      title.classList.remove('dark-mode');
    });
    articleAuthor.classList.remove('dark-mode');
  }
});

问题原因

页面里存在两个.btn元素:一个在移动端sidebar中,另一个在桌面端导航的hideOnMobile列表项里。但原JS代码只给其中一个按钮绑定了点击事件(大概率是sidebar里的那个),桌面端的按钮没有事件绑定,所以点击无反应。

解决方案

修改JavaScript代码,给所有.btn元素绑定点击事件,同时同步两个按钮的图标状态,确保dark mode切换时所有按钮的显示一致:

// 获取所有dark mode按钮和图标
const btns = document.querySelectorAll('.btn');
const body = document.body;
const icons = document.querySelectorAll('.btn__icon');
// 假设你已定义这两个选择器,若未定义需根据实际DOM调整
const articleTitles = document.querySelectorAll('.article-title');
const articleAuthor = document.querySelector('.article-author');

// 初始化dark mode状态,从localStorage读取并同步到所有元素
const savedDarkMode = JSON.parse(localStorage.getItem('dark-mode'));
if (savedDarkMode) {
  body.classList.add('dark-mode');
  icons.forEach(icon => {
    icon.classList.remove('fa-sun');
    icon.classList.add('fa-moon');
  });
  articleTitles.forEach(title => title.classList.add('dark-mode'));
  articleAuthor?.classList.add('dark-mode');
}

// 给每个按钮绑定点击事件
btns.forEach(btn => {
  btn.addEventListener('click', () => {
    body.classList.toggle('dark-mode');
    const isDarkMode = body.classList.contains('dark-mode');
    localStorage.setItem('dark-mode', JSON.stringify(isDarkMode));
    
    // 更新所有按钮的图标动画和状态
    icons.forEach(icon => {
      icon.classList.add('animated');
      setTimeout(() => icon.classList.remove('animated'), 500);
      
      if (isDarkMode) {
        icon.classList.remove('fa-sun');
        icon.classList.add('fa-moon');
      } else {
        icon.classList.remove('fa-moon');
        icon.classList.add('fa-sun');
      }
    });
    
    // 同步文章标题和作者的dark mode样式
    articleTitles.forEach(title => {
      isDarkMode ? title.classList.add('dark-mode') : title.classList.remove('dark-mode');
    });
    if (articleAuthor) {
      isDarkMode ? articleAuthor.classList.add('dark-mode') : articleAuthor.classList.remove('dark-mode');
    }
  });
});

额外检查

  • 确保桌面端的.btn元素没有被其他元素遮挡,或者设置了pointer-events: none导致无法点击
  • 确认.animated类的CSS动画已正确定义,保证图标切换时的动画效果正常

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 02:53:15