You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

家谱树CSS布局偏移问题:子元素未居中于父元素下方

家谱树子节点偏移问题修复

问题描述

使用给定CSS绘制家谱树时,子节点(如示例中的"Uncle"区块)未居中显示在父节点正下方,出现向右偏移的布局问题。

现有CSS代码

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

.tree li {
  display: table-cell;
  text-align: center;
  vertical-align: top; /* added this */
  list-style-type: none;
  position: relative;
  /*the padding is 20px + border-top = 23px*/
  padding: 23px 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: 3px solid #ccc;
  width: 50%;
  height: 20px;
}

.tree li::after {
  right: auto;
  left: 50%;
  border-left: 3px 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: 3px 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: 3px solid #ccc;
  width: 0;
  height: 20px;
}

.tree li .family {
  position: relative;
}


/* Person */

.person {
  border: 3px solid black;
  padding: 10px;
  min-width: 150px;
  /* min-height: 100px ;
  to increase the min height of the boxes background-color: #FFFFFF; */
  display: inline-block;
}

.person.female {
  border-color: #F45B69;
  top: 0px
}

.person.male {
  top: 0px;
  border-color: #456990;
}

.person .content {
  position: relative;   
  font-size: 16px;
  text-align: center;
}

示例HTML代码

<html>

<HEAD>
<title> Family tree </title>
<link rel="stylesheet" href="styles.css">
<META http-equiv="content-type" CONTENT="text/html; charset=UTF-8" />
</HEAD>

<body bgcolor="white" background="" vlink="peru" alink="peru" link="peru">

<b>

<div class="tree" align=center>
    <ul>
        <li>
            <div class="person child male">
                <div class="content">
                    some very very big familly name
                </div>
            </div>
            <ul >
                <li>
                    <div class="person child male">
                        <div class="content">Uncle</div>
                    </div>              
                </li>                   
            </ul>       
        </li>
    </ul>
</div>

</body>

</html>

修复方案

问题根源是父级<li>使用display: table-cell后,内部子<ul>继承了表格单元的布局特性,导致子节点偏移。添加以下CSS规则即可修复:

/* 让子ul占满父li宽度,确保内部节点居中 */
.tree li ul {
  width: 100%;
  display: inline-block;
}

/* 微调垂直连接线的位置,让线条完全居中 */
.tree ul ul::before {
  left: calc(50% - 1.5px);
}

将上述代码追加到原有CSS中,子节点即可精准居中显示在父节点正下方。


内容的提问来源于stack exchange,提问作者MikeTeX

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 16:45:22