CSS Animations求助:实现菜单与搜索栏的ease-in-out显隐动画
解决汉堡菜单与搜索栏的滑入/滑出动画问题
问题说明
已完成汉堡菜单组件,点击汉堡菜单显示链接列表,需实现:
- 菜单显示时以
ease-in/slide-in动画呈现 - 菜单隐藏时以
ease-out/slide-out动画消失 - 点击「DISCOVER」链接弹出的搜索栏实现相同的显隐动画效果
以下是修改后的完整代码:
HTML(结构无需调整)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Trying Animations out</title> <link rel="stylesheet" href="style.css"> </head> <body> <div class="menu-btn"> <div class="menu-btn__burger"></div> </div> <ul class="menu"> <div class="menu-links"> <li class="menu__item"><a href="#about">NIKE</a></li> <li class="menu__item"><a href="#services">NEW BALLANCE</a></li> <li class="menu__item"><a href="#contact">REEBOK</a></li> <li class="menu__item"><a href="#contact">ADIDAS</a></li> <li class="menu__item"><a href="#contact">ASICS</a></li> </div> </ul> <div class="navShowed"> <h3 class="menuItem discover-link">DISCOVER</h3> </div> <div class="searchbar"> <input type="text" placeholder="Search..."> </div> <script src="main.js"></script> </body> </html>
CSS(核心动画逻辑修改)
@font-face { font-family: 'Montserrat-Light'; src: url(fonts\Montserrat-Light.ttf) format(ttf); } body { background: #272727; display: flex; justify-content: center; align-items: center; min-height: 10vh; } ul { list-style: none; } .menu-btn { position: absolute; left: 20px; display: flex; justify-content: center; align-items: center; width: 40px; height: 40px; cursor: pointer; transition: all .5s ease-in-out; } .menu-btn__burger { width: 30px; height: 4px; background: #fff; border-radius: 5px; box-shadow: 0 2px 5px rgba(255, 101, 47, .2); transition: all .5s ease-in-out; } .menu-btn__burger::before, .menu-btn__burger::after { content: ''; position: absolute; width: 30px; height: 4px; background: #fff; border-radius: 5px; box-shadow: 0 2px 5px rgba(255, 101, 47, .2); transition: all .5s ease-in-out; } .menu-btn__burger::before { transform: translateY(-6px); } .menu-btn__burger::after { transform: translateY(6px); } /* 汉堡按钮动画 */ .menu-btn.open .menu-btn__burger { transform: translateX(-32px); background: transparent; box-shadow: none; } .menu-btn.open .menu-btn__burger::before { transform: rotate(45deg) translate(35px, -35px); } .menu-btn.open .menu-btn__burger::after { transform: rotate(-45deg) translate(35px, 35px); } /* 汉堡菜单动画修改 */ .menu { /* 替换display:none,用transform+opacity实现可过渡的隐藏 */ transform: translateX(-100%); opacity: 0; visibility: hidden; transition: all 0.5s ease-in-out; position: absolute; left: 60px; top: 10px; } .menu-btn.open+.menu { transform: translateX(0); opacity: 1; visibility: visible; } .menu-links { position: relative; left: 0; top: 3px; } .menu-links a { text-decoration: none; font: 12px Montserrat-Light, sans-serif; color: lightgray; } .menu__item { display: inline-block; margin-right: 10px; } .navShowed { position: absolute; display: flex; width: 280px; right: 10px; margin-top: auto; } .menuItem { font: 12px Montserrat-Light, sans-serif; display: inline-block; margin-right: 20px; cursor: pointer; color: lightgray; } .discover-link { position: relative; } /* 搜索栏动画修改 */ .searchbar { /* 替换display:none,用transform+opacity实现可过渡的隐藏 */ transform: translateY(-100%); opacity: 0; visibility: hidden; position: relative; right: 300px; top: 38%; width: 200px; height: 15px; transition: all 0.5s ease-in-out; } .searchbar input[type="text"] { width: 100%; height: 100%; padding: 0 20px; font-size: 10px; color: #333; } .searchbar.open { transform: translateY(0); opacity: 1; visibility: visible; }
JavaScript(简化逻辑)
const menuBtn = document.querySelector('.menu-btn'); const menu = document.querySelector('.menu'); let menuOpen = false; menuBtn.addEventListener('click', () => { menuBtn.classList.toggle('open'); menu.classList.toggle('open'); menuOpen = !menuOpen; }); const discoverLink = document.querySelector('.menuItem:first-child'); const searchbar = document.querySelector('.searchbar'); let searchOpen = false; discoverLink.addEventListener('click', () => { searchbar.classList.toggle('open'); searchOpen = !searchOpen; });
关键修改点
- 移除
display: none/block切换:该属性无法触发CSS过渡动画,改用transform(位移)+opacity(透明度)+visibility(可见性)组合实现显隐 - 统一动画配置:使用0.5s时长的
ease-in-out过渡函数,实现自然的缓动效果 - 方向自定义:汉堡菜单采用横向滑入(
translateX),搜索栏采用纵向滑入(translateY),可根据需求调整位移方向
内容的提问来源于stack exchange,提问作者user20823821
相关产品推荐
相关产品推荐

