纯CSS实现横向树组件

文章目录
  1. 1. CSS
  2. 2. 模板

CSS

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
//HorizontalTree.module.scss
$connect-line: 30px;
$child-padding-left: 10px;

.horizontal-tree ul {
display: flex;
flex-direction: column;
position: relative;
list-style-type: none;
margin: 0;
padding: 2px 0 2px $connect-line;
}

.horizontal-tree ul ul::before {
content: '';
border-top: 2px solid cyan;
position: absolute;
bottom: 0;
left: 0;
width: $connect-line;
height: 50%;
}

.horizontal-tree li {
display: flex;
padding: 2px 0 2px $connect-line+$child-padding-left;
position: relative;
align-items: center;
}

.horizontal-tree li::before {
content: '';
border-left: 2px solid cyan;
border-bottom: 2px solid cyan;
position: absolute;
left: 0;
bottom: 50%;
width: $connect-line;
height: 50%;
}

.horizontal-tree li::after {
content: '';
border-left: 2px solid cyan;
position: absolute;
left: 0;
bottom: 0;
width: $connect-line;
height: 50%;
}

.horizontal-tree li:first-child::before,
.horizontal-tree li:last-child::after {
border-left: none;
}

.horizontal-tree li:last-child::before {
border-bottom-left-radius: 4px;
}

.horizontal-tree li:first-child::before {
border-bottom: none;
}

.horizontal-tree li:not(.horizontal-tree-root):first-child::after {
border-top: 2px solid cyan;
border-top-left-radius: 4px;
}

模板

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<div>
<div class="horizontal-tree">
<ul>
<li class="horizontal-tree-root">
父节点
<ul>
<li>
123
</li>
<li>456
<ul>
<li>
114
</li>
<li>514</li>
</ul>
</li>
</ul>
</li>
</ul>
</div>
</div>