如何为响应式导航菜单添加上滑入/下滑收起的切换动画?
导航菜单动画实现方案
需求说明
为响应式导航菜单添加两个效果:
- 菜单展开时上滑入动画
- 点击切换按钮时页面滑回顶部
已实现菜单显示/隐藏的基础功能,需优化动画表现。
实现步骤
1. 替换display属性实现上滑入动画
原生display: none/block无法触发CSS过渡动画,改用max-height+opacity结合过渡属性,实现平滑滑入效果:
修改CSS中.lista-nav和.active的样式:
.lista-nav { list-style-type: none; width: 100%; text-align: center; padding-top: 15px; /* 替换display:none为以下属性 */ max-height: 0; opacity: 0; overflow: hidden; transition: max-height 0.3s ease-out, opacity 0.3s ease-out; } .active { /* 替换display:block为以下属性,max-height设为菜单实际高度的最大值即可 */ max-height: 300px; opacity: 1; }
2. 添加切换时滑回顶部功能
在JavaScript的点击事件中加入页面滚动逻辑:
const toggleButton = document.getElementById('toggleButton'); const naviList = document.getElementById('navi-lista'); toggleButton.addEventListener('click', () => { naviList.classList.toggle('active'); // 添加滑回顶部代码 window.scrollTo({ top: 0, behavior: 'smooth' // 平滑滚动,移除则为瞬间跳转 }); })
完整修改后代码
JavaScript
const toggleButton = document.getElementById('toggleButton'); const naviList = document.getElementById('navi-lista'); toggleButton.addEventListener('click', () => { naviList.classList.toggle('active'); window.scrollTo({ top: 0, behavior: 'smooth' }); })
CSS
* { font-family: 'Lato', sans-serif; box-sizing: border-box; margin: 0px; padding: 0px; } body { background-color: #856547; } .rodzicnav { position: fixed; top: 0; left: 0; margin: auto; width: 100%; } .navbar { background-color: rgb(31, 31, 31); align-items: center; color: white; display: flex; justify-content: space-around; font-size: 18px; } .primary-icon { height: 30px; } .lista-nav { list-style-type: none; } .lista-nav .elementlisty { display: inline-block; padding: 20px; } .navbar a { color: white; text-decoration: none; } .grow { transition: all .2s ease-in-out; } .grow:hover { transform: scale(1.1); } .menu { display: none; } .menu-line { width: 25px; height: 3px; background-color: white; margin-bottom: 4px; } @media all and (min-width: 480px) { .navbar { flex-direction: column; } .menu { display: block; position: absolute; right: 15px; top: 15px; cursor: pointer; } .lista-nav .elementlisty { display: block; padding: 10px; border-top: solid 1px white; } .lista-nav { list-style-type: none; width: 100%; text-align: center; padding-top: 15px; max-height: 0; opacity: 0; overflow: hidden; transition: max-height 0.3s ease-out, opacity 0.3s ease-out; } .logo-kontener { width: 100%; } .primary-icon { margin-left: 10px; margin-top: 10px; } .active { max-height: 300px; opacity: 1; } }
HTML
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <!-- FONT --> <link rel="preconnect" href="https://fonts.googleapis.com"> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> <link href="https://fonts.googleapis.com/css2?family=Lato:wght@300&display=swap" rel="stylesheet"> <!-- --> <link href="https://unpkg.com/aos@2.3.1/dist/aos.css" rel="stylesheet"> <link rel="stylesheet" href="style.css"> <title></title> <script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.11.3/gsap.min.js" defer></script> <script src="script.js" defer></script> </head> <body> <div class="rodzicnav"> <nav class="navbar"> <div class="logo-kontener"> <a href=""><img class="primary-icon" src="obrazy/logo.png" alt=""></a> </div> <ul class="lista-nav" id="navi-lista"> <li class="elementlisty grow"> <a href="">O nas</a> </li> <li class="elementlisty grow"> <a href="">Realizacje</a> </li> <li class="elementlisty grow"> <a href="">Kontakt</a> </li> </ul> <div class="menu" id="toggleButton"> <div class="menu-line"></div> <div class="menu-line"></div> <div class="menu-line"></div> </div> </nav> </div> </body> </html>
内容的提问来源于stack exchange,提问作者Kondzioo
相关产品推荐
相关产品推荐

