基于动画Logo实现汉堡菜单技术求助(尽量不用JavaScript)
用自定义Logo实现无JS(或极简JS)的折叠侧边栏汉堡菜单
这里给你两种方案:纯CSS实现(无JavaScript)和极简JS实现,都能结合自定义Logo完成折叠侧边栏的效果,先看纯CSS方案,符合你优先避免JS的需求:
纯CSS方案(无JavaScript)
核心思路是用隐藏的checkbox作为状态开关,配合CSS兄弟选择器控制侧边栏和Logo的动画,完全不需要JS。
完整代码(结合你现有的汉堡图标动画)
如果你想保留原来的三条杠变叉的动画作为自定义交互Logo,可以用这个版本:
HTML
<!-- 隐藏的复选框,作为菜单开关 --> <input type="checkbox" id="menu-toggle" class="menu-toggle"> <!-- 汉堡图标(自定义Logo触发器) --> <label for="menu-toggle" class="logo-container"> <div class="bar1"></div> <div class="bar2"></div> <div class="bar3"></div> </label> <!-- 侧边栏菜单 --> <aside class="sidebar"> <ul> <li><a href="#">首页</a></li> <li><a href="#">课程</a></li> <li><a href="#">作业</a></li> <li><a href="#">关于</a></li> </ul> </aside>
CSS
/* 隐藏复选框 */ .menu-toggle { display: none; } /* 汉堡图标容器 */ .logo-container { position: fixed; top: 1rem; left: 1rem; cursor: pointer; z-index: 100; /* 确保在侧边栏上方 */ } /* 汉堡图标默认样式 */ .bar1, .bar2, .bar3 { width: 35px; height: 5px; background-color: #000; margin: 6px 0; transition: 0.4s; } /* 复选框选中时的汉堡图标动画 */ .menu-toggle:checked ~ .logo-container .bar1 { transform: translate(0, 11px) rotate(-45deg); } .menu-toggle:checked ~ .logo-container .bar2 { opacity: 0; } .menu-toggle:checked ~ .logo-container .bar3 { transform: translate(0, -11px) rotate(45deg); } /* 侧边栏默认状态(隐藏) */ .sidebar { position: fixed; top: 0; left: -250px; /* 隐藏在屏幕左侧 */ width: 250px; height: 100vh; background-color: #2c3e50; padding-top: 5rem; transition: left 0.4s ease; z-index: 99; } /* 复选框选中时,侧边栏滑入 */ .menu-toggle:checked ~ .sidebar { left: 0; } /* 菜单列表样式 */ .sidebar ul { list-style: none; padding: 0; } .sidebar ul li { margin: 1rem 0; } .sidebar ul li a { color: #fff; text-decoration: none; font-size: 1.2rem; padding: 0.5rem 1.5rem; display: block; transition: background-color 0.2s; } .sidebar ul li a:hover { background-color: #34495e; }
替换为自定义图片/文字Logo
如果要换成自己设计的图片或文字Logo,只需要修改HTML和对应的CSS:
HTML示例
<label for="menu-toggle" class="logo-container"> <img src="logo-normal.png" alt="默认Logo" class="logo"> <img src="logo-active.png" alt="激活状态Logo" class="logo-active"> </label>
CSS示例
.logo-container .logo { width: 40px; height: 40px; transition: 0.4s; display: block; } .logo-container .logo-active { width: 40px; height: 40px; transition: 0.4s; display: none; } /* 选中时切换Logo显示 */ .menu-toggle:checked ~ .logo-container .logo { display: none; } .menu-toggle:checked ~ .logo-container .logo-active { display: block; }
极简JS方案(保留少量JS)
如果你觉得纯CSS的checkbox逻辑不够直观,可以基于你现有的JS代码扩展,只增加几行逻辑:
完整代码
HTML
<div class="logo-container" onclick="toggleMenu(this)"> <div class="bar1"></div> <div class="bar2"></div> <div class="bar3"></div> </div> <aside class="sidebar"> <ul> <li><a href="#">首页</a></li> <li><a href="#">课程</a></li> <li><a href="#">作业</a></li> <li><a href="#">关于</a></li> </ul> </aside>
CSS
.logo-container { position: fixed; top: 1rem; left: 1rem; cursor: pointer; z-index: 100; } .bar1, .bar2, .bar3 { width: 35px; height: 5px; background-color: #000; margin: 6px 0; transition: 0.4s; } /* 汉堡图标激活样式 */ .logo-container.change .bar1 { transform: translate(0, 11px) rotate(-45deg); } .logo-container.change .bar2 { opacity: 0; } .logo-container.change .bar3 { transform: translate(0, -11px) rotate(45deg); } /* 侧边栏默认状态 */ .sidebar { position: fixed; top: 0; left: -250px; width: 250px; height: 100vh; background-color: #2c3e50; padding-top: 5rem; transition: left 0.4s ease; z-index: 99; } /* 侧边栏激活状态 */ .sidebar.active { left: 0; } /* 菜单列表样式同纯CSS方案 */ .sidebar ul { list-style: none; padding: 0; } .sidebar ul li { margin: 1rem 0; } .sidebar ul li a { color: #fff; text-decoration: none; font-size: 1.2rem; padding: 0.5rem 1.5rem; display: block; transition: background-color 0.2s; } .sidebar ul li a:hover { background-color: #34495e; }
JS
function toggleMenu(x) { x.classList.toggle("change"); // 切换侧边栏的激活状态 document.querySelector('.sidebar').classList.toggle("active"); }
内容的提问来源于stack exchange,提问作者Edward Bruer
相关产品推荐
相关产品推荐

