如何使用纯CSS技术实现一个可折叠树形菜单

html-css09

如何使用纯CSS技术实现一个可折叠树形菜单,第1张

利用伪类可以实现点击打开折叠菜单,但是再次点击收起貌似就没法实现了。跟楼下说的一样,利用:hover、:active 可以设置二级菜单的样式(如height、visibility、display)以达到展开的效果。

用z-tree插件

①带有父子关系的标准

zTreeNodes

举例:

Js代码

1.var zTreeNodes = [

2.{"id":1, "name":"test1", "nodes":[

3.{"id":11, "name":"test11", "nodes":[

4.{"id":111, "name":"test111"}

5."id":12, "name":"test12"}

②带有父子关系的简单

Array

格式

(isSimpleData)的zTreeNodes

举例:

Js代码

1.var treeNodes = [

2. {"id":1, "pId":0, "name":"test1"},

3.{"id":11, "pId":1, "name":"test11"},

4. {"id":12, "pId":1, "name":"test12"},

5. {"id":111, "pId":11, "name":"test111"},

例子:

(Java代码)

①在页面引用

zTree的js和css:

Html代码

1.

<!-- ZTree树形插件 -->

2.<link

rel="stylesheet"

href="<%=root%>/Web/common/css/zTreeStyle/zTreeStyle.css"type

="text/css">

3.<!-- <link rel="stylesheet" href="<%=root%>/Web/common/css/zTreeStyle/zTreeIcons.css" type="text/css"> -->

4.<script ype="text/javascript"src="<%=root%>/Web/common/js/jquery-ztree-2.5.min.js"

></script>

自实现树形菜单

使用html+css+js实现了树形菜单,具体的实现思路如下:

html中定义包含树形菜单的容器节点

规划好树形菜单的样式以及图标

使用js构建html结构以及绑定事件,实现树形菜单的点击折叠

实现效果图如下:

核心的实现是构建html结构,组织树状结构的数据,使用递归构建树,在本次实现中html的组织有两种形式,具体如下所述:

- 子菜单和父菜单逻辑上形成父子关系,结构上是分离的

- 子菜单和父菜单逻辑以及机构上都是父子关系

在刚一开始,我实际上是实现的第一种形式的,该形式的html结构体现如下:

<ul>

<li>菜单1</li>

<ul>

<li>子菜单1</li>

<li>子菜单2</li>

</ul>

</ul>1234567

后来又补充了下一种形式的(这种更常见),该形式的html结构体现如下:

<ul>

<li>

<span>菜单1</span>

<ul>

<li>子菜单1</li>

<li>子菜单2</li>

</ul>

</li>

</ul>123456789

递归形成树形菜单结构的代码如下(第二种形式):

tool.menuView = function(parentNode, menu) {

if (!parentNode || parentNode.nodeType !== 1 || !Array.isArray(menu)) return

for (let i = 0i <menu.lengthi++) {

let option = menu[i], name = option.name,

children = option.children,

liNode = tool.createElement('li')

tool.append(parentNode, liNode)

if (children &&children.length >0) {

let ulNode = tool.createElement('ul')

tool.menuView(ulNode, children)

let [iNode, spanNode] = tool.createElement(['i', 'span'])

spanNode.innerText = name

iNode.className = 'fa fa-play'

tool.append([liNode, parentNode, liNode], [[iNode, spanNode], [liNode], [ulNode]])

} else {

liNode.innerText = name

}

}

}12345678910111213141516171819

需要传入的数据形式如下:

data = [

{

name: '菜单1',

children: [

{

name: '子菜单1'

},

{

name: '子菜单2

}

]

}

]12345678910111213

构建树形结构是关键的一步,之后就是对交互的处理,