家谱树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
相关产品推荐
相关产品推荐

