最稳妥方案是用li:not(:last-child)::after配合绝对定位实现分割线,既规避dom结构干扰,又支持自定义位置与高dpi适配;若:last-child失效,需检查末尾注释/空节点,或改用:nth-last-child(1)、js动态加类等替代方案。

用 ::after 加边框实现分割线,但末项不显示
直接给每个列表项加底部边框(border-bottom)最省事,但末项多出一条线,视觉上突兀。用 :not(:last-child) 选中除最后一项外的所有项,再加边框,是常见解法;但更稳妥的是用伪元素控制——尤其当列表项高度不一、或需自定义分割线位置(比如居中偏下)时。::after 可以完全脱离内容流,自由定位。
实操建议:
- 给列表项(如
<li>或<div class="item">)设置 <code>position: relative,为伪元素提供定位上下文 - 在
::after中设置content: ""、position: absolute、宽高和背景色(或border-bottom) - 垂直方向用
bottom: 0或top: 100%控制分割线位置,水平方向用left: 0和right: 0拉满 - 务必加
pointer-events: none,避免伪元素干扰点击区域
:last-child 失效?检查父容器和实际 DOM 结构
:last-child 匹配的是父元素的最后一个子节点,不是“最后一个列表项”。如果列表里混有注释、空文本节点、或意外插入的











