2017-02-20 74 views
2

我想按以下方式创建组织树。列表图表HTML CSS

enter image description here

我无法生成树图所示。

如图所示,在生成树时需要帮助,因为我有多个级别,其中一些数据必须显示为像Level21这样的扩展名。

下面是我用来生成树的代码。

/*Now the CSS*/ 
 

 
* { 
 
    margin: 0; 
 
    padding: 0; 
 
} 
 

 
.tree ul { 
 
    padding-top: 20px; 
 
    position: relative; 
 
    transition: all 0.5s; 
 
    -webkit-transition: all 0.5s; 
 
    -moz-transition: all 0.5s; 
 
} 
 

 
.tree li { 
 
    float: left; 
 
    text-align: center; 
 
    list-style-type: none; 
 
    position: relative; 
 
    padding: 20px 5px 0 5px; 
 
    transition: all 0.5s; 
 
    -webkit-transition: all 0.5s; 
 
    -moz-transition: all 0.5s; 
 
} 
 

 

 
/*We will use ::before and ::after to draw the connectors*/ 
 

 
.tree li::before, 
 
.tree li::after { 
 
    content: ''; 
 
    position: absolute; 
 
    top: 0; 
 
    right: 50%; 
 
    border-top: 1px solid #ccc; 
 
    width: 50%; 
 
    height: 20px; 
 
} 
 

 
.tree li::after { 
 
    right: auto; 
 
    left: 50%; 
 
    border-left: 1px solid #ccc; 
 
} 
 

 

 
/*We need to remove left-right connectors from elements without 
 
any siblings*/ 
 

 
.tree li:only-child::after, 
 
.tree li:only-child::before { 
 
    display: none; 
 
} 
 

 

 
/*Remove space from the top of single children*/ 
 

 
.tree li:only-child { 
 
    padding-top: 0; 
 
} 
 

 

 
/*Remove left connector from first child and 
 
right connector from last child*/ 
 

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

 

 
/*Adding back the vertical connector to the last nodes*/ 
 

 
.tree li:last-child::before { 
 
    border-right: 1px solid #ccc; 
 
    border-radius: 0 5px 0 0; 
 
    -webkit-border-radius: 0 5px 0 0; 
 
    -moz-border-radius: 0 5px 0 0; 
 
} 
 

 
.tree li:first-child::after { 
 
    border-radius: 5px 0 0 0; 
 
    -webkit-border-radius: 5px 0 0 0; 
 
    -moz-border-radius: 5px 0 0 0; 
 
} 
 

 

 
/*Time to add downward connectors from parents*/ 
 

 
.tree ul ul::before { 
 
    content: ''; 
 
    position: absolute; 
 
    top: 0; 
 
    left: 50%; 
 
    border-left: 1px solid #ccc; 
 
    width: 0; 
 
    height: 20px; 
 
} 
 

 
.tree li a { 
 
    border: 1px solid #ccc; 
 
    padding: 5px 10px; 
 
    text-decoration: none; 
 
    color: #666; 
 
    font-family: arial, verdana, tahoma; 
 
    font-size: 11px; 
 
    display: inline-block; 
 
    border-radius: 5px; 
 
    -webkit-border-radius: 5px; 
 
    -moz-border-radius: 5px; 
 
    transition: all 0.5s; 
 
    -webkit-transition: all 0.5s; 
 
    -moz-transition: all 0.5s; 
 
} 
 

 

 
/*Time for some hover effects*/ 
 

 

 
/*We will apply the hover effect the the lineage of the element also*/ 
 

 
.tree li a:hover, 
 
.tree li a:hover+ul li a { 
 
    background: #c8e4f8; 
 
    color: #000; 
 
    border: 1px solid #94a0b4; 
 
} 
 

 

 
/*Connector styles on hover*/ 
 

 
.tree li a:hover+ul li::after, 
 
.tree li a:hover+ul li::before, 
 
.tree li a:hover+ul::before, 
 
.tree li a:hover+ul ul::before { 
 
    border-color: #94a0b4; 
 
} 
 

 

 
/*Thats all. I hope you enjoyed it. 
 
Thanks :)*/
<div class="tree"> 
 
    <ul class="level1"> 
 
    <li class="level11"> 
 
     <a href="#">Level 1</a> 
 
     <ul class="level2"> 
 
     <li class="level21"> 
 
      <a href="#">Level 21</a> 
 
     </li> 
 
     <li class="level22"> 
 
      <a href="#">Level 22</a> 
 
     </li> 
 
     </ul> 
 
    </li> 
 
    </ul> 
 
</div>

+1

你似乎已经产生了树,你的意思是把它定位像你的屏幕截图? –

+0

@CassidyWilliams是的。 – MM0959

回答

1

我对你的代码做了一些调整。这将帮助你开始。

我补充:

li.levelSide::before { 
    height: 0px; 
    border: none; 
} 

li.levelSide { 
    position: absolute; 
    left: 100%; 
    padding-top: 0; 
    top: 0; 
    padding-left: 0; 
} 

/*Now the CSS*/ 
 

 
* { 
 
    margin: 0; 
 
    padding: 0; 
 
} 
 

 
.tree ul { 
 
    padding-top: 20px; 
 
    position: relative; 
 
    transition: all 0.5s; 
 
    -webkit-transition: all 0.5s; 
 
    -moz-transition: all 0.5s; 
 
} 
 

 
.tree li { 
 
    float: left; 
 
    text-align: center; 
 
    list-style-type: none; 
 
    position: relative; 
 
    padding: 20px 5px 0 5px; 
 
    transition: all 0.5s; 
 
    -webkit-transition: all 0.5s; 
 
    -moz-transition: all 0.5s; 
 
} 
 

 

 
/*We will use ::before and ::after to draw the connectors*/ 
 

 
.tree li::before, 
 
.tree li::after { 
 
    content: ''; 
 
    position: absolute; 
 
    top: 0; 
 
    right: 50%; 
 
    border-top: 1px solid #ccc; 
 
    width: 50%; 
 
    height: 20px; 
 
} 
 

 
.tree li::after { 
 
    right: auto; 
 
    left: 50%; 
 
    border-left: 1px solid #ccc; 
 
} 
 

 

 
/*We need to remove left-right connectors from elements without 
 
any siblings*/ 
 

 
.tree li:only-child::after, 
 
.tree li:only-child::before { 
 
    display: none; 
 
} 
 

 

 
/*Remove space from the top of single children*/ 
 

 
.tree li:only-child { 
 
    padding-top: 0; 
 
} 
 

 

 
/*Remove left connector from first child and 
 
right connector from last child*/ 
 

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

 

 
/*Adding back the vertical connector to the last nodes*/ 
 

 
.tree li:last-child::before { 
 
    border-right: 1px solid #ccc; 
 
    border-radius: 0 5px 0 0; 
 
    -webkit-border-radius: 0 5px 0 0; 
 
    -moz-border-radius: 0 5px 0 0; 
 
} 
 

 
.tree li:first-child::after { 
 
    border-radius: 5px 0 0 0; 
 
    -webkit-border-radius: 5px 0 0 0; 
 
    -moz-border-radius: 5px 0 0 0; 
 
} 
 

 

 
/*Time to add downward connectors from parents*/ 
 

 
.tree ul ul::before { 
 
    content: ''; 
 
    position: absolute; 
 
    top: 0; 
 
    left: 50%; 
 
    border-left: 1px solid #ccc; 
 
    width: 0; 
 
    height: 20px; 
 
} 
 

 
.tree li a { 
 
    border: 1px solid #ccc; 
 
    padding: 5px 10px; 
 
    text-decoration: none; 
 
    color: #666; 
 
    font-family: arial, verdana, tahoma; 
 
    font-size: 11px; 
 
    display: inline-block; 
 
    border-radius: 5px; 
 
    -webkit-border-radius: 5px; 
 
    -moz-border-radius: 5px; 
 
    transition: all 0.5s; 
 
    -webkit-transition: all 0.5s; 
 
    -moz-transition: all 0.5s; 
 
} 
 

 

 
/*Time for some hover effects*/ 
 

 

 
/*We will apply the hover effect the the lineage of the element also*/ 
 

 
.tree li a:hover, 
 
.tree li a:hover+ul li a { 
 
    background: #c8e4f8; 
 
    color: #000; 
 
    border: 1px solid #94a0b4; 
 
} 
 

 

 
/*Connector styles on hover*/ 
 

 
.tree li a:hover+ul li::after, 
 
.tree li a:hover+ul li::before, 
 
.tree li a:hover+ul::before, 
 
.tree li a:hover+ul ul::before { 
 
    border-color: #94a0b4; 
 
} 
 

 

 
/*Thats all. I hope you enjoyed it. 
 
Thanks :)*/ 
 

 
li.levelSide::before { 
 
    height: 0px; 
 
    border: none; 
 
} 
 

 
li.levelSide { 
 
    position: absolute; 
 
    left: 100%; 
 
    padding-top: 0; 
 
    top: 0; 
 
    padding-left: 0; 
 
}
<div class="tree"> 
 
    <ul class="level1"> 
 
    <li class="level11"> 
 
     <a href="#">Level 1</a> 
 
     <ul class="level2"> 
 
     <li class="level21"> 
 
      <a href="#">Level 21</a> 
 
      <ul class="level2"> 
 
      <li class="level31"> 
 
       <a href="#">Level 31</a> 
 
      </li> 
 
      <li class="levelSide"> 
 
       <a href="#">Side Level</a> 
 
      </li> 
 
      </ul> 
 

 
     </li> 
 

 
     <li class="levelSide"> 
 
      <a href="#">Side Level</a> 
 
     </li> 
 
     </ul> 
 
    </li> 
 

 
    </ul> 
 
</div>

+0

我尝试了你所说的,树看起来像在这个小提琴https://jsfiddle.net/Mamu/8pd5b0tp/2/,但我希望sidelevel之间的部门和部分 – MM0959

2

你要一个类添加到<ul>元素(如 “方”)认为:

  1. 延长了向下连接器(可能height: 40px
  2. 将第一个孩子定位在父母的正下方
  3. 将第二个孩子在父母的右侧
  4. 删除现有的子连接器
  5. 向第二个孩子添加侧连接器。
+0

如果你可以提供和例子,它将是非常有益的基础上,我可以将其转换为我的客户需要。 – MM0959

+0

@ MM0959编写所有这一切都是一个相当大的CSS的答案,你在寻找什么样的具体例子?如何正确定位? –

+0

我尝试过这个例子(https://jsfiddle.net/Mamu/8pd5b0tp/2/),正如用户所说的那样。如果我有超过2个项目在同一级别,我希望侧面水平位于level1和level2之间。 – MM0959