:not(:last-child)可精准选中除最后一个子元素外的所有同级元素,基于 DOM 结构位置判断,动态增删元素时仍可靠,适用于列表、表单等需中间元素加间隔的场景。

用 :not(:last-child) 可以精准选中除最后一个子元素外的所有同级元素,这是最简洁、语义清晰的写法。
基础写法与原理
:not(:last-child) 是伪类组合:先匹配所有子元素,再排除掉满足 :last-child 条件的那个。它不依赖序号或计数,只看 DOM 结构中的实际位置,因此动态增删元素时依然可靠。
- 适用于任意容器内的直接子元素(如
div > p:not(:last-child)) - 必须是同级兄弟关系,不能跨层级匹配
- 对隐藏元素(
display: none)仍生效,因为它基于结构而非渲染状态
常见使用场景
常用于列表项、表单项、卡片等需要“中间元素加间隔”的设计:
- 给列表项加下边框,但最后一项不加:
ul li:not(:last-child) {border-bottom: 1px solid #eee;} - 按钮组中让按钮间有右间距,末尾按钮不额外留空:
.btn-group .btn:not(:last-child) {margin-right: 8px;} - 表单字段之间加分割线,提交按钮前停止:
form > *:not(:last-child) {border-bottom: 1px solid #ddd;}
注意兼容性与替代方案
:not(:last-child) 在所有现代 浏览器 中都支持(包括 IE9+),无需前缀。若需兼容 IE8 及更早版本,则无法使用 :not(),可改用 :first-child 配合相邻兄弟选择器(+)逐个处理,但代码冗长且不易维护。
立即学习 “ 前端免费学习笔记(深入)”;
- IE8 不支持
:not()和:last-child,只能靠 JS 或额外 class 控制 - 避免写成
:not(:last-of-type)—— 它按元素类型(如p、div)判断“最后”,可能不符合预期 - 慎用
*:not(:last-child),通配符性能较差,建议限定具体标签或类名
与其他伪类组合的灵活性
:not(:last-child) 可与其他伪类叠加,实现更精细控制:
- 仅作用于可见子元素(配合
:is()或 JS 过滤更稳妥,CSS 本身无原生“可见”伪类) - 和
:nth-child(odd)组合:选中奇数位中非最后一个的元素:li:nth-child(odd):not(:last-child) - 配合类名增强语义:
.nav-link:not(:last-child)比泛泛的a:not(:last-child)更安全