最近工作中有个UE设计是横向树的展示,查找了网上的一些资料并没有发现横向树的代码,于是自己根据实际需求利用::before和::after伪元素加上jq去简单实现,以后有机会争取再进行优化。
代码:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>横向树demo</title>
<style>
* {
margin: 0;
padding: 0;
}
.tree{
padding: 0 50px;
}
.tree ul {
width: 210px;
position: absolute;
}
.tree ul ul{
left: 226px;
top: 0;
}
.tree li {
float: left;
list-style-type: none;
position: relative;
padding: 16px 5px 0 5px;
}
.tree li span {
position: relative;
display: inline-block;
width: 200px;
height: 36px;
background: #F0F0F5;
border-radius: 4px;
text-decoration: none;
color: #2D2D2D;
font-size: 14px;
line-height: 36px;
text-align: center;
}
.tree li::before{
box-sizing:inherit;
content: '';
position: absolute;
top: 33px;
left: -7px;
border-top: 2px solid #D2D2D7;
width: 12px;
}
.tree li::after {
box-sizing:inherit;
content: '';
position: absolute;
top: 8px;
left: -9px;
height: 100%;
border-left: 2px solid #D2D2D7;
}
.tree li:first-child::after{
height: 50%;
border-left: 2px solid #D2D2D7;
border-top: 2px solid #D2D2D7;
top: 33px;
width: 1px;
border-top-left-radius: 4px;
}
.tree li:last-child::after{
height: 25px;
border-left: 2px solid #D2D2D7;
border-bottom: 2px solid #D2D2D7;
top: 8px;
width: 1px;
border-bottom-left-radius: 4px;
}
.tree li:only-child::after,
.tree li:only-child::before {
display: none;
}
.tree ul ul li:only-child::before{
display: inline-block;
}
.tree ul ul li:only-child span::before{
display: inline-block;
}
.tree li:only-child span.root::before,.tree li:only-child span.hasChild::before{
content: '';
position: absolute;
top: 17px;
right: -14px;
border-top: 2px solid #D2D2D7;
width: 14px;
}
.tree ul ul ul li:only-child span::before{
content: '';
position: absolute;
top: 17px;
left: -26px;
border-top: 2px solid #D2D2D7;
width: 26px;
}
</style>
</head>
<body>
<div class="tree">
<ul>
<li>
<span class="root">报表名称</span>
<ul>
<li>
<span>功能名称1</span>
<ul>
<li>
<span>磁贴名称1</span>
</li>
<li>
<span>磁贴名称2</span>
</li>
<li>
<span>磁贴名称3</span>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</div>
</body>
<script type="text/javascript" src="jquery-1.11.2.min.js"></script>
<script>
if($('.root').siblings('ul').children('li').length==1){
var num = 26*($('.root').siblings('ul').children('li').find('li').length-1);
$('.root').css({ 'top': num });
$('.root').siblings('ul').children('li').css({ 'top': num });
$('.root').siblings('ul').find('ul').css({ 'top': -num });
if($('.root').siblings('ul').find('li').length > 1){
$('.root').siblings('ul').children('li').children('span').addClass('hasChild');
}
}else{
$('.root').css({ 'top': 26 * ($('.root').siblings('ul').children('li').length - 1) });
}
</script>
</html>
实现效果:
ps:需要特别说明的是,我目前的代码暂时只支持这两种样式,即:
1父节点-1子节点-1/多孙节点,或是1父节点-多子节点-1孙节点,样式是通过jq去判断修改的,以后有时间的话再去研究优化争取可复用性强一些。希望对大家能有所帮助。
欢迎交流讨论。