You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用CSS&SASS实现:仅当tbody含多个compDetails-row时添加边框?

解决SASS中tbody多行边框的例外场景问题

嘿,我明白你的困扰了!你想用SASS给tbody里带compDetails-row类的行加边框,但遇到只有单个该类元素时要移除边框的情况,而且:only-of-type没生效——这很正常,因为这个选择器的工作逻辑和你想的不一样!

为什么:only-of-type不生效?

:only-of-type是基于元素类型(比如<tr>)来判断的,而不是类。举个例子:

  • 如果你的tbody里有两个<tr>(不管它们有没有compDetails-row类),:only-of-type不会匹配任何一个tr,因为tr类型的元素有多个;
  • 就算tbody里只有一个带类的tr,但还有其他不带类的tr,:only-of-type也不会选中这个带类的tr,因为父元素里的tr类型元素不止一个。

所以这个选择器没法帮你区分“带该类的元素数量”,得换个思路!

解决方案

根据你的需求,这里有两种靠谱的实现方式:

方式1:用:has选择器(现代浏览器推荐)

:has是CSS新出的选择器,可以直接判断父元素里是否存在某个子元素,非常直观:

tbody {
  // 先给所有带类的行加边框
  .compDetails-row {
    border-bottom: 1px solid #ddd; // 自定义你的边框样式
  }

  // 当tbody里只有一个.compDetails-row时,移除它的边框
  &:not(:has(.compDetails-row + .compDetails-row)) .compDetails-row {
    border-bottom: none;
  }
}

解释:tbody:not(:has(.compDetails-row + .compDetails-row)) 意思是“没有第二个.compDetails-row的tbody”,也就是tbody里只有一个该类元素,这时移除它的边框。

方式2:用兄弟选择器(兼容旧浏览器)

如果需要兼容不支持:has的旧浏览器,可以用相邻兄弟选择器间接实现:

tbody {
  // 给第一个带类的行加边框,但只有当后面还有另一个带类的行时才生效
  .compDetails-row:first-of-type {
    border-top: 1px solid #ddd;
    // 只有存在下一个带类的行时,才保留边框
    &:not(:last-of-type) {
      border-bottom: 1px solid #ddd;
    }
  }

  // 给后面的每个带类的行都加上顶部边框(和上一行区分)
  .compDetails-row + .compDetails-row {
    border-top: 1px solid #ddd;
    border-bottom: 1px solid #ddd;
  }
}

这样,当tbody里只有一个.compDetails-row时,first-of-type同时也是last-of-type,所以不会有边框;当有多个时,所有行都会有边框。

验证效果

  • 当tbody里有2个.compDetails-row:所有行都会显示边框;
  • 当tbody里只有1个.compDetails-row:边框会被移除,完全符合你的需求。

内容的提问来源于stack exchange,提问作者Sunny

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:54:08