如何为响应式导航栏添加展开过渡效果并将菜单图标切换为X
问题1:导航展开过渡失效原因&修复
过渡不生效是因为你用display: none / display: flex切换元素显隐,CSS transition不支持display属性的过渡。你不需要单独控制每个nav-item的显隐,改为控制父级ul.nav-ul的高度实现整体过渡即可:
CSS修改部分:
/* 新增/替换原有对应样式 */ .nav-ul{ display: flex; flex-wrap: wrap; list-style: none; /* 新增过渡属性 */ transition: max-height 300ms ease; overflow: hidden; max-height: 1000px; /* 桌面端设置为足够容纳内容的高度 */ } /* 删掉原来.nav-item的display:none和.responsive-li相关样式 */ @media screen and (max-width: 890px) { .nav-ul { max-height: 0; /* 移动端默认收起 */ width: 100%; } /* 新增展开状态类 */ .nav-ul.nav-open { max-height: 500px; /* 设置为足够容纳所有导航项的高度即可 */ } /* 剩下的原有移动端样式保留,删掉.nav-item的display:none规则 */ .nav-item { width: 100%; flex-direction: column; margin: 8px 0; /* 调整适配移动端的间距 */ } }
问题2:菜单图标切换失效原因&修复
你之前的代码把切换SVG的逻辑注释了,同时X图标尺寸设为1616太小,和原有4045的汉堡图标尺寸不匹配,所以看不见效果。
JS修改部分:
const menu = document.querySelector('.menu') const navUl = document.querySelector('.nav-ul') // 提前存储两个图标内容避免重复拼接字符串 const menuSvg = `<svg xmlns="http://www.w3.org/2000/svg" width="40" height="45" fill="currentColor" class="bi bi-list" viewBox="0 0 16 16"> <path fill-rule="evenodd" d="M2.5 12a.5.5 0 0 1 .5-.5h10a.5.5 0 0 1 0 1H3a.5.5 0 0 1-.5-.5zm0-4a.5.5 0 0 1 .5-.5h10a.5.5 0 0 1 0 1H3a.5.5 0 0 1-.5-.5zm0-4a.5.5 0 0 1 .5-.5h10a.5.5 0 0 1 0 1H3a.5.5 0 0 1-.5-.5z" /> </svg>` const closeSvg = `<svg xmlns="http://www.w3.org/2000/svg" width="40" height="45" fill="currentColor" class="bi bi-x" viewBox="0 0 16 16"> <path d="M4.646 4.646a.5.5 0 0 1 .708 0L8 7.293l2.646-2.647a.5.5 0 0 1 .708.708L8.707 8l2.647 2.646a.5.5 0 0 1-.708.708L8 8.707l-2.646 2.647a.5.5 0 0 1-.708-.708L7.293 8 4.646 5.354a.5.5 0 0 1 0-.708z"/> </svg>` menu.addEventListener('click', () => { const isOpen = navUl.classList.toggle('nav-open') // 按状态切换图标 menu.innerHTML = isOpen ? closeSvg : menuSvg })
额外HTML修正
你原有HTML里搜索框的<form>标签没有闭合,会导致布局异常,补上闭合标签即可:
<li class="nav-item"> <form action=""> <input type="text"> <button class="btn btn-primary">Search</button> </form> <!-- 补上这个闭合标签 --> </li>
内容的提问来源于stack exchange,提问作者Vansh
相关产品推荐
相关产品推荐

