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

如何为侧边抽屉菜单添加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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 01:24:30