信息发布→ 登录 注册 退出

css选择器中的:first-of-type与:last-of-type用法

发布时间:2026-01-08

点击量:
:first-of-type匹配父元素中同类型标签的第一个,而非DOM首个子元素;如父元素内有p、div、p,则首p匹配,次p不匹配,且忽略文本/注释节点。

为什么 :first-of-type 并不等于「第一个子元素」

它匹配的是其父元素中**同类型标签的第一个出现**,不是按 DOM 顺序排的第一项。比如父元素里先有

、再有 、又一个

,那么第二个

不会匹配 :first-of-type,但第一个

会——即使它前面还有别的标签。

常见误用场景:想给列表第一个

  • 加样式,却在父
      下写 li:first-of-type,结果发现没生效。原因可能是
        开头有注释、空格文本节点(虽然不影响渲染,但仍是子节点),或者混入了其他标签如 。此时 :first-of-type 仍有效,但你得确认目标
      • 确实是所有
      • 中的第一个。

        • 只看标签名,忽略 class、id、属性等其他条件
        • 文本节点、注释节点、 等不影响 :first-of-type 的计算
        • 若父元素下没有该类型标签,选择器自然不匹配任何元素

        :last-of-type 的行为与陷阱

        :last-of-type 是对称逻辑:找父元素内**同类型标签的最后一个**。但它同样不关心是否“视觉上在末尾”或“DOM 中排最后”。例如:

          

        第一段

        中间

        第二段

        第三段

        其中第三个

        会匹配 p:last-of-type,而第二个不会——哪怕它后面跟着

        容易踩的坑:

        • 动态插入内容后,:last-of-type 可能意外切换目标(比如 JS 新增一个

          ,原来“最后一个”就失效了)
        • :nth-last-of-type(1) 功能等价,但后者更明确表达“倒数第一个”,可读性略高
        • 不能跨层级匹配:子元素的 :last-of-type 不会受孙元素影响

        对比 :first-child / :last-child 的关键区别

        这是最常混淆的点。:first-child 要求元素**必须是父元素的第一个子节点且类型不限**;而 :first-of-type 只要求它是该类型中的第一个,不管前面有没有别的标签。

        示例:

          

        标题

        正文第一段

        正文第二段

        • p:first-child → 不匹配任何

          (因为第一个子是

        • p:first-of-type → 匹配第一个

          (它是所有

          中的第一个)
        • p:last-of-type → 匹配第二个

        所以当你真正想选“容器里第一个段落”,用 :first-of-type 更稳妥;想选“整个列表结构里的首个直接子项”,才用 :first-child

        实际项目中建议怎么选

        多数情况下,:first-of-type:last-of-type 更贴近语义意图:比如文章首段加缩进、表格最后一行设底边框、卡片列表最后一项去 margin。它们对 HTML 结构变化更宽容。

        • 如果组件模板可能插入头部说明、工具栏等非主体标签,优先用 :first-of-type
        • 避免在需要精确位置控制的场景(如网格布局第 1/第 N 列)依赖这两个伪类
        • IE9+ 支持良好,无需 Polyfill;但注意某些旧版安卓 WebView 对 :nth-of-type 系列支持不稳定,:first-of-type 相对更稳
        • 调试时可用浏览器 DevTools 的「:hover 状态模拟」功能快速验证匹配结果

        真正要注意的是父容器里是否混入了同名但不同用途的标签——比如用多个 做布局和内容,这时 div:last-of-type 可能选到意料之外的块。

      • 标签:# css  # html  # js  # 浏览器  # 安卓  # 工具  # 区别  # css选择器  # 为什么  # class  
        在线客服
        服务热线

        服务热线

        4008888355

        微信咨询
        二维码
        返回顶部
        ×二维码

        截屏,微信识别二维码

        打开微信

        微信号已复制,请打开微信添加咨询详情!