组织结构图

时间:2016-03-02 09:12:07

标签: javascript php css

我发现此图表显示了家谱。丈夫和妻子都期待着一切。丈夫和妻子之间的连接器不直。我希望丈夫和妻子之间的连接线是直线。 现场直播可以在以下链接中看到: 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>
&#13;
&#13;
&#13;

感谢您

2 个答案:

答案 0 :(得分:1)

我有一个可能的解决方案,不幸的是它并不总是一般,但它比我想的更好。

以下是解决方法:

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>

答案 1 :(得分:1)

我写了另一个答案,因为第一个可能对其他人有用。 这是夫妻关系问题的解决方案

&#13;
&#13;
$(document) .ready(function() {
	
$('.c1').hide();
$("a").click(function(){

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

});
  
  });
&#13;
/*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: 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;
}

.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 :)*/
&#13;
<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>
&#13;
&#13;
&#13;