如何为家谱树独生子节点设置更长竖线并与其他子节点对齐?
家谱树独生子节点对齐与竖线长度问题解决方案
当前家谱树布局中,独生子节点无法与其他子节点水平对齐。排查发现问题源于一段移除独生子节点顶部间距的CSS代码,但删除这段代码后,独生子节点的竖线又会出现过短的情况。
问题示意图
- 独生子节点未对齐状态:

- 移除相关CSS后竖线过短状态:

现有代码
CSS代码
.genealogy-body{ white-space: nowrap; overflow-y: hidden; padding: 50px; min-height: 500px; padding-top: 10px; text-align: center; } .genealogy-tree{ display: inline-block; } .genealogy-tree ul { padding-top: 20px; position: relative; padding-left: 0px; display: flex; justify-content: center; } .genealogy-tree li { float: left; text-align: center; list-style-type: none; position: relative; padding: 20px 5px 0 5px; } .genealogy-tree li::before, .genealogy-tree li::after{ content: ''; position: absolute; top: 0; right: 50%; border-top: 2px solid #ccc; width: 50%; height: 18px; } .genealogy-tree li::after{ right: auto; left: 50%; border-left: 2px solid #ccc; } /* 移除无兄弟节点的左右连接线 */ *.genealogy-tree li:only-child::after, .genealogy-tree li:only-child::before { display: none; } /* 移除独生子节点顶部间距,但会导致对齐问题 */ .genealogy-tree li:only-child{ padding-top: 0; } /* 移除第一个子节点的左连接线、最后一个子节点的右连接线 */ .genealogy-tree li:first-child::before, .genealogy-tree li:last-child::after{ border: 0 none; } /* 给最后一个节点添加垂直连接线 */ .genealogy-tree li:last-child::before{ border-right: 2px solid #ccc; border-radius: 0 5px 0 0; -webkit-border-radius: 0 5px 0 0; -moz-border-radius: 0 5px 0 0; } .genealogy-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; } /* 添加父节点向下的连接线 */ .genealogy-tree ul ul::before{ content: ''; position: absolute; top: 0; left: 50%; border-left: 2px solid #ccc; width: 0; height: 20px; } .genealogy-tree li a{ text-decoration: none; color: black; font-family: "Lora", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; font-size: 11px; text-align: center; display: inline-block; border-radius: 5px; -webkit-border-radius: 5px; -moz-border-radius: 5px; }
HTML代码
<body> <div class="body genealogy-body genealogy-scroll"> <div class="genealogy-tree"> <ul> <li> <a> <div class="member-view-box"> <div class="member-image"> <img src="../images/trees/_tree_blank.jpg" alt="refresh your browser..."> <div class="member-details"> <span><strong>Top<br>Line</strong></span> </div> </div> </div> </a> <ul> <li> <a> <div class="member-view-box"> <div class="member-image"> <div class="member-details"> <span><strong>PARENT<br>WITH<br>ONE CHILD</strong></span> </div> </div> </div> </a> <ul> <li> <a> <div class="member-view-box"> <div class="member-image"> <div class="member-details"> <span><strong>ONLY<br>CHILD</strong><br>* line short *</span> </div> </div> </div> </a> </li> </ul> </li> <li> <a> <div class="member-view-box"> <div class="member-image"> <div class="member-details"> <span><strong>PARENT<br>WITH<br>TWO CHILDS</strong></span> </div> </div> </div> </a> <ul> <li> <a> <div class="member-view-box"> <div class="member-image"> <div class="member-details"> <span><strong>Child 1<br>of 2</strong></span> </div> </div> </div> </a> </li> <li> <a> <div class="member-view-box"> <div class="member-image"> <div class="member-details"> <span><strong>Child 2<br>of 2</strong></span> </div> </div> </div> </a> </li> </ul> </li> </ul> </li> </ul> </div> </div> </body>
解决方案
问题核心是:给独生子节点设置padding-top: 0破坏了与其他节点的垂直间距平衡,同时父节点竖线高度固定,导致衔接断裂。修改步骤如下:
- 删除导致对齐问题的代码:
移除这段让独生子节点顶部间距归零的CSS规则:
.genealogy-tree li:only-child{ padding-top: 0; }
- 调整独生子节点父级的竖线高度:
添加以下CSS规则,让父节点的竖线延长,适配独生子节点的默认顶部间距:
/* 给包含独生子节点的父ul增加竖线高度 */ .genealogy-tree ul:has(> li:only-child)::before { height: 40px; }
如果浏览器不支持:has()选择器(如旧版Firefox),可以给对应父ul手动添加类名(比如single-child-parent),再设置:
.genealogy-tree ul.single-child-parent::before { height: 40px; }
对应的HTML修改:
<ul class="single-child-parent"> <li> <a> <div class="member-view-box"> <div class="member-image"> <div class="member-details"> <span><strong>ONLY<br>CHILD</strong><br>* line fixed *</span> </div> </div> </div> </a> </li> </ul>
修改后,独生子节点将与其他子节点保持水平对齐,同时竖线长度也能正常衔接父节点。
内容的提问来源于stack exchange,提问作者BeachNut
相关产品推荐
相关产品推荐

