汉堡菜单二次切换时无法恢复初始旋转状态的问题求助
汉堡菜单二次切换时无法恢复初始旋转状态的问题求助
嘿,我来帮你搞定这个问题!你的核心问题在于切换旋转状态的逻辑写错了,而且尝试的那行代码完全不符合语法规范,所以根本没法生效。
先给你指出代码里的两个关键错误:
- 你每次点击都直接给
bento_box_wrapper.style.transform赋值为rotate(315deg),不管当前是展开还是收起状态,所以第二次点击时还是会强制设置成315度,完全没机会转回初始角度。 - 你尝试的
bento_box_wrapper.classList.toggle = 'rotate(45 deg)'是完全错误的写法——classList.toggle是一个方法,不是属性,而且旋转效果是通过transform样式实现的,不能直接给类名赋值旋转值。
接下来给你两种简单可行的解决方案,推荐用第一种,更符合前端开发的最佳实践:
方案一:用CSS类控制旋转状态(推荐)
这种方法把样式逻辑放到CSS里,JS只负责切换类名,代码更清晰,也更容易维护,还能加过渡动画让效果更丝滑。
- 先在你的CSS里添加状态类(假设汉堡初始角度是45度):
/* 汉堡菜单初始状态 */ .bento_box_wrapper { transform: rotate(45deg); transition: transform 0.3s ease; /* 加上过渡动画,旋转更平滑 */ } /* 菜单展开时的旋转状态 */ .bento_box_wrapper.menu-open { transform: rotate(315deg); }
- 修改JS代码,把旋转逻辑改成切换类名,同时把模糊效果也改成
toggleClass(你之前用addClass会导致模糊效果只加不减,也是个小问题):
const bento_box_wrapper = document.querySelector('.bento_box_wrapper'); const overlayWrapper = document.querySelector('.overlayWrapper'); const mainNavLinksWrapper = document.querySelector('.mainNavLinksWrapper'); bento_box_wrapper.onclick = function() { // 切换遮罩和菜单的显示状态 overlayWrapper.classList.toggle('overlayWrapperSlideDown'); mainNavLinksWrapper.classList.toggle('mainNavLinksWrapperSlideUp'); // 切换模糊效果(用toggleClass点击两次会自动移除) $('.bento_box_wrapper').toggleClass('blur'); $('div#toggle').toggleClass('blur'); // 切换汉堡菜单的旋转状态 bento_box_wrapper.classList.toggle('menu-open'); }
方案二:在JS里动态判断并修改transform
如果不想新增CSS类,也可以在JS里判断当前的旋转状态,然后手动切换角度:
const bento_box_wrapper = document.querySelector('.bento_box_wrapper'); const overlayWrapper = document.querySelector('.overlayWrapper'); const mainNavLinksWrapper = document.querySelector('.mainNavLinksWrapper'); bento_box_wrapper.onclick = function() { // 切换遮罩和菜单的显示状态 overlayWrapper.classList.toggle('overlayWrapperSlideDown'); mainNavLinksWrapper.classList.toggle('mainNavLinksWrapperSlideUp'); // 切换模糊效果 $('.bento_box_wrapper').toggleClass('blur'); $('div#toggle').toggleClass('blur'); // 获取当前生效的旋转样式,判断后切换角度 const currentStyle = window.getComputedStyle(bento_box_wrapper); const isRotated = currentStyle.transform.includes('315'); if (isRotated) { bento_box_wrapper.style.transform = 'rotate(45deg)'; } else { bento_box_wrapper.style.transform = 'rotate(315deg)'; } }
不过这种方法需要获取计算后的样式,逻辑稍微复杂一点,还是方案一更简洁可靠。
试试上面的方法,应该就能解决你的问题啦!
备注:内容来源于stack exchange,提问作者REELHERO
相关产品推荐
相关产品推荐

