<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<style>
/* 树形结构样式 */
ul {
list-style-type: none;
padding-left: 20px;
}
/* 父节点样式 */
li.parent {
cursor: pointer;
}
/* 子节点默认隐藏 */
li.child {
opacity: 0;
height: 0;
overflow: hidden;
transition: opacity 0.3s ease, height 0.3s ease;
}
/* 子节点显示时的样式 */
li.child.show {
opacity: 1;
height: auto;
}
</style>
<title>树形菜单动画</title>
</head>
<body>
<ul id="tree-menu">
<li class="parent">父节点1
<ul>
<li class="child">子节点1-1</li>
<li class="child">子节点1-2</li>
</ul>
</li>
<li class="parent">父节点2
<ul>
<li class="child">子节点2-1</li>
<li class="child">子节点2-2</li>
</ul>
</li>
</ul>
<script>
// 获取树形菜单元素
const treeMenu = document.getElementById('tree-menu');
// 事件委托,在父级元素上绑定点击事件
treeMenu.addEventListener('click', function (event) {
const target = event.target;
// 判断点击的是否是父节点
if (target.classList.contains('parent')) {
const childrenUl = target.querySelector('ul');
if (childrenUl) {
const childNodes = childrenUl.querySelectorAll('.child');
childNodes.forEach((child) => {
// 切换子节点的显示/隐藏状态
if (child.classList.contains('show')) {
child.classList.remove('show');
} else {
child.classList.add('show');
}
});
}
}
});
</script>
</body>
</html>
- HTML部分:
- 创建了一个无序列表
ul
作为树形菜单,每个父节点li
添加parent
类,每个子节点li
添加child
类。
- CSS部分:
- 定义了树形结构的基本样式,包括列表样式和缩进。
- 父节点设置
cursor: pointer
以显示可点击的指针样式。
- 子节点默认设置
opacity: 0
和height: 0
以及overflow: hidden
来隐藏,同时定义了transition
过渡效果。
- 当子节点添加
show
类时,opacity
变为1,height
变为auto
,实现淡入效果。
- JavaScript部分:
- 通过
getElementById
获取树形菜单元素。
- 使用事件委托,在树形菜单的父级元素上绑定
click
事件。
- 当点击的元素包含
parent
类时,找到其对应的子节点ul
,并切换子节点的show
类,从而控制子节点的显示和隐藏动画。这种方式在不同浏览器下有较好的兼容性,并且代码结构清晰,易于维护。