【问题标题】:Organizational Chart组织结构图
【发布时间】:2016-06-15 01:04:02
【问题描述】:

我发现这张图表可以显示家谱。一切都对丈夫和妻子充满期待。夫妻之间的连接不直。我希望夫妻之间的连接线是直线。 实时提要可以在下面的链接中看到: 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>

谢谢

【问题讨论】:

  • 我无法给你一个完整的解决方案,你应该做的是为每个 li 项目计算正确的左右值。每次显示或隐藏 ul 时,此值都必须更改

标签: javascript php css


【解决方案1】:

我写了另一个答案,因为也许第一个答案对其他人有用。 下面是解决夫妻关系问题的办法

$(document) .ready(function() {
	
$('.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 {
	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 :)*/
<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>

【讨论】:

    【解决方案2】:

    我有一个可能的解决方案,不幸的是它并不总是通用的,但我认为它总比没有好。

    解决办法如下:

    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>
    

    【讨论】:

    • 这不是我想要的。如果您运行代码 sn-p,您将看到丈夫和配偶从顶部相互连接。但我希望它直接连接到从丈夫到妻子的左侧。任何建议。 ??
    • 我写了另一个答案,因为也许第一个答案对其他人有用。如果我对您的问题的理解正确,请查看我的第二个答案
    猜你喜欢
    • 2018-12-30
    • 2011-04-16
    • 2023-04-01
    • 2016-12-22
    • 2021-10-15
    • 2010-09-16
    • 1970-01-01
    • 2019-06-28
    相关资源
    最近更新 更多