如何为侧边抽屉菜单添加hover与点击事件的CSS滑动动画?
侧边抽屉菜单平滑展开收起实现方案
问题
希望侧边抽屉菜单在鼠标移入或点击时展开/收起,但当前为瞬间切换,无平滑滑动动画,需通过CSS添加该效果。
解决方案
核心是利用CSS transition 属性为宽度、透明度等可过渡属性添加动画,同时调整文字元素的隐藏逻辑(避免使用无法过渡的display: none),并优化JavaScript事件绑定提升交互体验。
关键修改点
- 给侧边栏添加宽度过渡动画,实现平滑伸缩
- 调整菜单文字的显示/隐藏方式,用
opacity和width替代display: none,配合过渡实现渐隐渐显 - 将鼠标离开事件绑定到整个侧边栏,避免鼠标在侧边栏内移动时频繁触发收起
完整代码
CSS
@import url('https://fonts.googleapis.com/css2?family=Baloo+Paaji+2:wght@400;600&display=swap'); * { font-family: 'Baloo Paaji 2', cursive; margin: 0; padding: 0; box-sizing: border-box; list-style: none; text-decoration: none; } body { background: #f5f5f5; } .top_navbar { position: fixed; top: 0; left: 0; width: 100%; height: 60px; background: #323233; box-shadow: 1px 0 2px rgba(0, 0, 0, 0.125); display: flex; align-items: center; } .top_navbar .logo { width: 250px; font-size: 25px; font-weight: 700; padding: 0 25px; color: white; letter-spacing: 2px; text-transform: uppercase; border-right: 1px solid #f5f5f5; transition: width 0.3s ease, padding 0.3s ease; } .top_navbar .menu { width: calc(100% - 250px); padding: 0 25px; display: flex; justify-content: space-between; align-items: center; transition: width 0.3s ease; } .top_navbar .hamburger { font-size: 25px; cursor: pointer; color: white; } .top_navbar .hamburger:hover { color: #007dc3; } /* 侧边栏收起状态样式 */ .hover_collapse .sidebar { width: 70px; } .hover_collapse .sidebar ul li a .text { opacity: 0; width: 0; } .hover_collapse .top_navbar .logo { width: 70px; padding: 0; text-align: center; } .hover_collapse .top_navbar .menu { width: calc(100% - 70px); } .sidebar { position: fixed; top: 60px; left: 0; width: 220px; height: 100%; background: #042331; transition: width 0.3s ease; } .sidebar ul li a { display: flex; align-items: center; padding: 16px 25px; border-bottom: 1px solid #03374e; color: #0e94d4; } .sidebar ul li a .icon { font-size: 18px; color: white; min-width: 20px; } .sidebar ul li a .text { margin-left: 19px; color: #fff; font-family: sans-serif; font-size: 18px; letter-spacing: 2px; transition: opacity 0.3s ease, width 0.3s ease; opacity: 1; width: auto; overflow: hidden; } .sidebar ul li a:hover { background: #0e94d4; color: #fff; }
HTML
<div class="wrapper hover_collapse"> <div class="top_navbar"> <div class="logo">Foolish Dev</div> <div class="menu"> <div class="hamburger"> <i class="fas fa-bars"></i> </div> </div> </div> <div class="sidebar"> <div class="sidebar_inner"> <ul> <li> <a href="#"> <span class="icon"><i class="fa fa-qrcode"></i></span> <span class="text">Dashboard</span> </a> </li> <li> <a href="#"> <span class="icon"><i class="fa fa-link"></i></span> <span class="text">Shortcuts</span> </a> </li> <li> <a href="#"> <span class="icon"><i class="fa fa-eye"></i></span> <span class="text">Overview</span> </a> </li> <li> <a href="#"> <span class="icon"><i class="fa fa-book"></i></span> <span class="text">Event</span> </a> </li> <li> <a href="#"> <span class="icon"><i class="fa fa-question-circle"></i></span> <span class="text">About</span> </a> </li> <li> <a href="#"> <span class="icon"><i class="fa fa-pen"></i></span> <span class="text">Service</span> </a> </li> <li> <a href="#"> <span class="icon"><i class="fa fa-id-card"></i></span> <span class="text">Contact</span> </a> </li> </ul> </div> </div> </div>
JavaScript
const hamburger = document.querySelector(".hamburger"); const wrapper = document.querySelector(".wrapper"); const sidebar = document.querySelector(".sidebar"); // 鼠标移入侧边栏展开 sidebar.addEventListener("mouseenter", () => { wrapper.classList.remove("hover_collapse"); }); // 鼠标离开侧边栏收起 sidebar.addEventListener("mouseleave", () => { wrapper.classList.add("hover_collapse"); }); // 点击汉堡按钮切换展开/收起状态 hamburger.addEventListener("click", () => { wrapper.classList.toggle("hover_collapse"); });
内容的提问来源于stack exchange,提问作者Miomir Dancevic
相关产品推荐
相关产品推荐

