移动菜单动画切换是指在移动端网页或应用中,通过JavaScript和CSS实现菜单的平滑展开/收起动画效果。这种技术是现代响应式网页设计的核心组成部分,能够提升用户体验和界面交互性。
.mobile-menu {
transform: translateX(-100%);
transition: transform 0.3s ease-out;
}
.mobile-menu.active {
transform: translateX(0);
}
@keyframes slideIn {
from { transform: translateX(-100%); }
to { transform: translateX(0); }
}
@keyframes slideOut {
from { transform: translateX(0); }
to { transform: translateX(-100%); }
}
.mobile-menu.active {
animation: slideIn 0.3s forwards;
}
.mobile-menu:not(.active) {
animation: slideOut 0.3s forwards;
}
const menuButton = document.querySelector('.menu-button');
const mobileMenu = document.querySelector('.mobile-menu');
menuButton.addEventListener('click', () => {
mobileMenu.classList.toggle('active');
});
原因:重排和重绘操作过多,或使用了性能不佳的CSS属性
解决方案:
transform
和opacity
代替left/top/width/height
transform: translateZ(0)
原因:初始状态未正确设置
解决方案:
.mobile-menu {
/* 初始状态 */
transform: translateX(-100%);
/* 防止初始渲染闪烁 */
will-change: transform;
}
原因:菜单关闭后,底层元素仍可被点击
解决方案:
menuButton.addEventListener('click', (e) => {
mobileMenu.classList.toggle('active');
if (mobileMenu.classList.contains('active')) {
e.stopPropagation();
}
});
<div class="menu-container">
<button class="menu-toggle">☰</button>
<nav class="mobile-menu">
<ul>
<li><a href="#">首页</a></li>
<li><a href="#">产品</a></li>
<li><a href="#">关于我们</a></li>
<li><a href="#">联系我们</a></li>
</ul>
</nav>
<div class="menu-overlay"></div>
</div>
<style>
.mobile-menu {
position: fixed;
top: 0;
left: 0;
width: 250px;
height: 100%;
background: #fff;
box-shadow: 2px 0 10px rgba(0,0,0,0.1);
transform: translateX(-100%);
transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);
z-index: 1000;
}
.menu-overlay {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: rgba(0,0,0,0.5);
opacity: 0;
visibility: hidden;
transition: opacity 0.3s, visibility 0.3s;
z-index: 999;
}
.mobile-menu.active {
transform: translateX(0);
}
.mobile-menu.active + .menu-overlay {
opacity: 1;
visibility: visible;
}
</style>
<script>
document.querySelector('.menu-toggle').addEventListener('click', function() {
document.querySelector('.mobile-menu').classList.toggle('active');
});
document.querySelector('.menu-overlay').addEventListener('click', function() {
document.querySelector('.mobile-menu').classList.remove('active');
});
</script>
will-change
属性提前告知浏览器哪些属性会变化box-shadow
等高消耗属性requestAnimationFrame
进行JS动画