2016-03-02 15 views
7

Znalazłem ten wykres, aby wyświetlić drzewo genealogiczne. Wszystko, czego można się spodziewać po mężu i żonie. Złącze między mężem i żoną nie jest proste. Chcę, żeby linia łącząca męża i żonę była linią prostą. ywo widać w poniższym linku: live demo jsFiddleSchemat organizacyjny

/*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>

podziękowania

+0

nie jestem w stanie podać kompletne rozwiązanie, co należy zrobić, to aby obliczyć prawidłową lewo z prawego wartości dla każdego li item. Ta wartość musi się zmieniać za każdym razem, gdy pokażesz lub ukryjesz ul – silviagreen

Odpowiedz

1

piszę kolejną odpowiedź, bo być może pierwszy mogą być przydatne dla innych. Oto rozwiązanie problemu połączenia mąż-żona

$(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

Mam możliwe rozwiązanie, niestety nie zawsze ma charakter ogólny, ale jest lepiej niż nic, co myślę.

Oto soliution:

jsfiddle

Tutaj można zobaczyć rozwiązanie w 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); 
    } 

}); 


}); 

}); 

Niestety nie zawsze ten rodzaj kalkulacji zrobić wykres dobrze uformowane, dlatego dodałam klasa:

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

W tym przykładzie użyłem tego w

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

, to nie jest to, czego szukałem. Jeśli uruchomisz fragment kodu, zobaczysz, że mąż i współmałżonek łączą się nawzajem od góry. Ale chcę, żeby łączyła się bezpośrednio w lewo od męża do żony. Jakieś sugestie. ?? – whoknows

+0

Napisałem kolejną odpowiedź, ponieważ być może pierwsza z nich może być przydatna dla innych. Jeśli dobrze zrozumiałem twój problem, spójrz na moją drugą odpowiedź – silviagreen