【问题标题】:CSS table cell left border with rowspanCSS表格单元格左边框与行跨度
【发布时间】:2022-10-23 16:00:03
【问题描述】:

使用我想添加的 CSS内部的带有折叠边框的 HTML 表格上的垂直边框。我不希望单元格边框出现在表格的外部。从表面上看,这很容易:只需在每个单元格上添加一个左边框,除了一行中的第一个单元格。

th:not(:first-child), td:not(:first-child) {
  border-left-style: solid;
}

不幸的是,这没有考虑跨两行的列:

<table>
  <tbody>
    <tr>
      <td rowspan="2">foobar</td>
      <td>one</td>
    </tr>
    <tr>
      <td>two</td>
    </tr>
  </tbody>
</table>

在这种情况下,选择器与“两个”的单元格不匹配,因为它是行中的第一个 &lt;td&gt;,即使它被呈现为在第二由于上面的rowspan="2" 列。

当然,我不是第一个遇到这种情况的人。确保单元格获得内部垂直边框的最新最佳实践方法是什么,即使它参与包含rowspan 的列?

【问题讨论】:

  • 也许只是td:not(:first-child), td:not([rowspan])
  • 但是应该设置不同样式的单元格不是rowspan 单元格,甚至不是在同一行,而是在下一个排。 rowspan 单元格本身的样式没有不同。那么当我们不想更改rowspan 单元格本身的样式时,td:not([rowspan]) 将如何提供帮助?

标签: css html-table


【解决方案1】:

table {
  border-collapse: collapse;
}

th:not(:first-child),
td:not(:first-child) {
  border-left-style: solid;
}

th[rowspan]:not(:last-child),
td[rowspan]:not(:last-child) {
  border-right-style: solid;
}
<table>
  <tbody>
    <tr>
      <td rowspan="2">foobar</td>
      <td>one</td>
    </tr>
    <tr>
      <td>two</td>
    </tr>
  </tbody>
</table>

【讨论】:

  • 嗯,如果我提前知道表的结构,当然可以解决。您使用[rowspan] 的示例与我在tds 之一上放置一个特殊的id 属性没有什么不同。但是我的目标是在我事先不知道表的结构的情况下有一个通用的解决方案。例如,如果您切换列的顺序,您的解决方案将无法正常工作,不是吗?
  • @GarretWilson 我测试了我能想到的任何表结构。没问题。尝试提供这样的表格,以便我的解决方案中断。然后我们将弄清楚如何解决它。 td[rowspan] 选择器仅在您没有其他方法选择您感兴趣的元素时才相关。您不能使用Id,因为每页只能有一个具有相同id 的元素。
  • 我可能弄错了。 (忽略我添加然后删除的评论。)我想我忘记了td[rowspan] 列已经有border-left-style,如果多行列也在右侧,它也会起作用。 ? 但是我认为您可以将选择器简化为td[rowspan]:not(:last-child),不是吗? (注意:border-right: none 的简写是 setting a lot of properties to their initial values,这是你不想要的。)
  • Andrei 的基本概念最终发挥了作用。感谢您为此做出贡献。从语义上讲,我并不特别喜欢这种固有的“覆盖”某些边框,但是对于折叠的边框,它并没有明显的区别。我将奖励这个答案以表达我的感激之情,但请调整你的答案:1)我认为像td[rowspan]:not(:last-child)这样的选择器会更有效率; 2)不要使用border-right: none,有改变其他属性的副作用; 3)您还需要添加th[rowspan]:not(:last-child)
  • @GarretWilson 修复它。