2016-03-02 112 views
7

我发现此图表显示家谱。一切都是对夫妻的美好期待。夫妻之间的连接不直。我希望夫妻之间的连线是直线。 活饲料中可以看到下面的链接: live demo jsFiddle组织结构图

/*Now the CSS*/ 
 

 
* { 
 
    margin: 0; 
 
    padding: 0; 
 
} 
 
.yellow { 
 
    background: #FFEC94; 
 
} 
 
.orange { 
 
    background: #FFF7EF; 
 
} 
 
.green { 
 
    background: #B0E57C; 
 
} 
 
.royal-blue { 
 
    background: #56BAEC; 
 
} 
 
.brown { 
 
    background: #FFAEAE; 
 
} 
 
.green-one { 
 
    background: #D6E3B5; 
 
} 
 
.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: 1px 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" style="width:2860px"> 
 
    <ul> 
 
    <li> 
 
     <a href="#" class="first yellow">Husband Name</a> 
 
     <ul> 
 
     <li><a href='#'>Child One</a> 
 
     </li> 
 
     <li> 
 
      <a href='#'>Child Two</a> 
 
      <ul> 
 
      <li><a href='#'>Grand Child One</a> 
 
      </li> 
 
      </ul> 
 
     </li> 
 
     </ul> 
 
    </li> 
 
    <li> 
 
     <a href="#" class="first yellow">Spouse Name</a> 
 
    </li> 
 

 
    </ul> 
 
</div>

感谢信

+0

的解决方案我无法给你一个完整的解决方案,你应该做的是计算每个权值的正确左李项目。每当您显示或隐藏我不在寻找的ul – silviagreen

回答

1

我写的另一个答案用这个,因为也许是第一个能够对别人有用。 下面是夫妻连接问题

$(document) .ready(function() { 
 
\t 
 
$('.c1').hide(); 
 
$("a").click(function(){ 
 

 
    $(this).parent().children("ul").toggle(); 
 

 
}); 
 
    
 
    });
/*Now the CSS*/ 
 
* {margin: 0; padding: 0;} 
 
.yellow{background:#FFEC94;} 
 
.orange{background:#FFF7EF;} 
 
.green{background:#B0E57C;} 
 
.royal-blue{background:#56BAEC;} 
 
.brown{background:#FFAEAE;} 
 
.green-one{background:#D6E3B5;} 
 

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

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

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

 
.tree li::before, .tree li::after{ 
 
\t content: ''; 
 
\t position: absolute; top: 0; right: 50%; 
 
\t border-top: 1px solid #ccc; 
 
\t width: 50%; height: 20px; 
 
} 
 
.tree li::after{ 
 
\t right: auto; left: 50%; 
 
\t 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 { 
 
\t 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{ 
 
\t border: 0 none; 
 
} 
 
/*Adding back the vertical connector to the last nodes*/ 
 
.tree li:last-child::before{ 
 
\t border-right: 1px solid #ccc; 
 
\t border-radius: 0 5px 0 0; 
 
\t -webkit-border-radius: 0 5px 0 0; 
 
\t -moz-border-radius: 0 5px 0 0; 
 
} 
 
.tree li:first-child::after{ 
 
\t border-radius: 5px 0 0 0; 
 
\t -webkit-border-radius: 5px 0 0 0; 
 
\t -moz-border-radius: 5px 0 0 0; 
 
} 
 

 
/*Time to add downward connectors from parents*/ 
 
.tree ul ul::before{ 
 
\t content: ''; 
 
\t position: absolute; top: 0; left: 50%; 
 
\t border-left: 1px solid #ccc; 
 
\t width: 0; height: 20px; 
 
} 
 

 
.tree li a{ 
 
\t border: 1px solid #ccc; 
 
\t padding: 5px 10px; 
 
\t text-decoration: none; 
 
\t color: #666; 
 
\t font-family: arial, verdana, tahoma; 
 
\t font-size: 11px; 
 
\t display: inline-block; 
 
\t 
 
\t border-radius: 5px; 
 
\t -webkit-border-radius: 5px; 
 
\t -moz-border-radius: 5px; 
 
\t 
 
\t transition: all 0.5s; 
 
\t -webkit-transition: all 0.5s; 
 
\t -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 { 
 
\t 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{ 
 
\t border-color: #94a0b4; 
 
} 
 

 
.tree .spouse::before, .tree .spouse::after, .tree .husband::before, .tree .husband::after{ 
 
    top: 30px; 
 
    height: 0; 
 
    z-index: -1; 
 
} 
 

 
tree .husband::before, .tree .husband::after{ 
 
    
 
} 
 

 
.tree .spouse::before, .tree .spouse::after{ 
 
} 
 

 
/*Thats all. I hope you enjoyed it. 
 
Thanks :)*/
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.1/jquery.min.js"></script> 
 
<div class="tree" style="width:2860px"> 
 
    <ul> 
 
    <li class="husband"> 
 
     <a href="#" class="first yellow">Husband Name</a> 
 
     <ul> 
 
     <li><a href='#'>Child One</a> 
 
     </li> 
 
     <li> 
 
      <a href='#'>Child Two</a> 
 
      <ul> 
 
      <li><a href='#'>Grand Child One</a> 
 
      </li> 
 
      </ul> 
 
     </li> 
 
     </ul> 
 
    </li> 
 
    <li class="spouse"> 
 
     <a href="#" class=" first yellow">Spouse Name</a> 
 
    </li> 
 

 
    </ul> 
 
</div>

1

我有一个可能的解决方案,遗憾的是它并不总是一般,但它比好没什么我想的。

这里是soliution:

jsfiddle

在这里,您可以看到full screen

$(document).ready(function() { 

    $('.c1').hide(); 
    $("a").click(function() { 

    $(this).parent().children("ul").toggle(); //make ul visible 

    //foreach visible ul 
    $($('ul').filter(':visible')).each(function() { 
     var ul = $(this); 
     var ulL = (ul.outerWidth()/2); 

     var lenght = 0; 
    //calculate the left rule accordingly to the length of the li 
     if(ul.children("li").length > 2){ 
     var middle = Math.ceil(ul.children("li").length/2); 

     for (var i = 1; i < middle; i++) { 
      lenght = lenght + ul.children("li:nth-child(" + i + ")").outerWidth(); 
      } 

     if ((ul.children("li").length)%2 == 0){ 
      lenght = lenght + (ul.children("li:nth-child(" + middle + ")").outerWidth()); 

     }else{ 
      lenght = lenght + (ul.children("li:nth-child(" + middle + ")").outerWidth()/2); 


     } 

     ul.find("li").css("left", (ulL - lenght)); 

    } 
    else if(ul.children("li").length === 2){ // base case, only two li 
    var ulL = (ul.outerWidth()/4); 
    var half = ul.children("li:first-child").outerWidth()/2; 

    ul.find("li").css("left", (ulL - half)); 

    } else if(ul.children("li").length === 1){ // base case, only 1 li 
    ul.find("li").css("left", 0); 
    } 

}); 


}); 

}); 

解决可惜并不总是这种计算使图表以及形成的,这就是为什么我添加一类:

.no-left > li{ 
    left: 0 !important; 
} 

在这个例子中,我在

<a href="#" class="yellow">Director <br />Oprn</a> 
    <ul class="c1 no-left"> .... </ul> 
+0

时,此值都必须更改。如果你运行代码片段,你会看到丈夫和配偶从顶端连接起来。但我想要它直接从丈夫到妻子左转。任何建议。 ?? – whoknows

+0

我写了另一个答案,因为也许第一个对别人有用。如果我理解你的问题,请看我的第二个答案 – silviagreen