有一个具有无限嵌套级别的垂直菜单目录。我遇到了一个问题 - 我无法为其打开和关闭设置动画。该属性display也没有动画height。有另一种选择max-height,但这一切都太麻烦了。
这是一个示例,所有项目Sub都有一个嵌套的子菜单。
document.querySelector('.root-nav').onclick = function(event) {
if (event.target.nodeName !== 'SPAN') return
closeAllSubMenu(event.target.nextElementSibling)
event.target.classList.add('submenu-active-span')
event.target.nextElementSibling.classList.toggle('submenu-active')
}
function closeAllSubMenu(currentMenu = null) {
const parents = []
if (currentMenu) {
let currentParent = currentMenu.parentNode
while(currentParent) {
if (currentParent.classList.contains('root-nav')) break
if (currentParent.nodeName === 'UL') parents.push(currentParent)
currentParent = currentParent.parentNode
}
}
const allSubMenu = document.querySelectorAll('.root-nav ul')
Array.from(allSubMenu).forEach(item => {
if (item !== currentMenu && !parents.includes(item)) {
item.classList.remove('submenu-active')
if (item.previousElementSibling.nodeName === 'SPAN') {
item.previousElementSibling.classList.remove('submenu-active-span')
}
}
})
}
* {
padding: 0;
margin: 0;
box-sizing: border-box;
}
.root-nav {
width: 300px;
}
.root-nav li {
list-style-type: none;
background-color: coral;
padding-left: 0;
position: relative;
}
.root-nav a, .root-nav span {
text-decoration: none;
color: white;
display: block;
padding: 5px 10px;
cursor: pointer;
}
.root-nav ul {
display: none;
width: 100%;
}
ul.submenu-active {
display: block;
padding-left: 20px;
}
span.submenu-active-span {
background-color: crimson;
}
<ul class="root-nav">
<li><a href="#">Link 1</a></li>
<li>
<span>Sub 1</span>
<ul>
<li><a href="#">Link 10</a></li>
<li><a href="#">Link 20</a></li>
<li><a href="#">Link 30</a></li>
<li><a href="#">Link 40</a></li>
</ul>
</li>
<li><a href="#">Link 3</a></li>
<li><a href="#">Link 4</a></li>
<li>
<span>Sub 2</span>
<ul>
<li><a href="#">Link 50</a></li>
<li><a href="#">Link 60</a></li>
<li>
<span>Sub 20</span>
<ul>
<li><a href="#">Link 100</a></li>
<li><a href="#">Link 200</a></li>
<li>
<span>Sub 3</span>
<ul>
<li><a href="#">Link 1000</a></li>
<li><a href="#">Link 2000</a></li>
<li><a href="#">Link 3000</a></li>
<li><a href="#">Link 4000</a></li>
</ul>
</li>
</li>
<li><a href="#">Link 400</a></li>
</ul>
</li>
<li><a href="#">Link 80</a></li>
</ul>
</li>
</ul>
也许有人知道如何平滑地显示无限嵌套的垂直菜单?
可以使用 max-height + overflow: hidden 设置动画。
展开子菜单会非常好。