使用 CSS 从表格的第二行替换行颜色

Posted

技术标签:

【中文标题】使用 CSS 从表格的第二行替换行颜色【英文标题】:Alternate row colours from 2nd row of the table using CSS 【发布时间】:2020-11-12 19:07:35 【问题描述】:

我有一张如下表。我需要从第二行开始应用替代颜色。当我使用 nth-child 选择器来区分奇数行和偶数行时,正在考虑不满足要求的第一行。

那么,我们如何编写一个忽略第一行并从第二行开始应用颜色的选择器,将第二行视为奇数行?

我知道我们可以将奇数行的颜色应用于偶数行,反之亦然,但是当我们查看代码时有些令人困惑的地方。所以,我正在寻找下面这个表结构的替代解决方案。我感谢您的帮助。谢谢。

<table>
  <tbody>
    <tr>
      <th>col 1</th>
      <th>col 2</th>
    </tr>
    <tr>
      <td>11</td>
      <td>12</td>
    </tr>
    <tr>
      <td>21</td>
      <td>22</td>
    </tr>
    <tr>
      <td>31</td>
      <td>32</td>
    </tr>
  </tbody>
</table>

【问题讨论】:

【参考方案1】:

您可以使用:nth-child() selector。另外,如果您使用&lt;th&gt; 元素,您可以将它们放在&lt;thead&gt; 中。

tbody tr:nth-child(2n) 
  background: peachpuff;
<table>
  <thead>
    <tr>
      <th>col 1</th>
      <th>col 2</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>11</td>
      <td>12</td>
    </tr>
    <tr>
      <td>21</td>
      <td>22</td>
    </tr>
    <tr>
      <td>31</td>
      <td>32</td>
    </tr>
    <tr>
      <td>41</td>
      <td>42</td>
    </tr>
    <tr>
      <td>51</td>
      <td>52</td>
    </tr>
    <tr>
      <td>61</td>
      <td>62</td>
    </tr>
  </tbody>
</table>

如果您不想更改标记,可以从第 3 个索引开始。

tr:nth-child(2n+3) 
  background: moccasin;
<table>
  <tbody>
    <tr>
      <th>col 1</th>
      <th>col 2</th>
    </tr>
    <tr>
      <td>11</td>
      <td>12</td>
    </tr>
    <tr>
      <td>21</td>
      <td>22</td>
    </tr>
    <tr>
      <td>31</td>
      <td>32</td>
    </tr>
    <tr>
      <td>41</td>
      <td>42</td>
    </tr>
    <tr>
      <td>51</td>
      <td>52</td>
    </tr>
    <tr>
      <td>61</td>
      <td>62</td>
    </tr>
  </tbody>
</table>

【讨论】:

这与 2n 选择器相同,没有特定于我的场景。【参考方案2】:

您可以使用nth-child() css 选择器来选择奇数和偶数。然后通过nth-child(2) 选择器跳过第二行。

tr:nth-child(even) background: #CCC
tr:nth-child(odd) background: green
tr:nth-child(1) 
background:none;
<table>
  <tbody>
    <tr>
      <th>col 1</th>
      <th>col 2</th>
    </tr>
    <tr>
      <td>11</td>
      <td>12</td>
    </tr>
    <tr>
      <td>21</td>
      <td>22</td>
    </tr>
    <tr>
      <td>31</td>
      <td>32</td>
    </tr>
     <tr>
      <td>31</td>
      <td>32</td>
    </tr>
     <tr>
      <td>31</td>
      <td>32</td>
    </tr>
  </tbody>
</table>

另一种实现方法是将&lt;thead&gt;&lt;tbody&gt; 分开。

tbody tr:nth-child(even) background: #CCC
tbody tr:nth-child(odd) background: green
<table>
  <thead>
    <tr>
      <th>col 1</th>
      <th>col 2</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>11</td>
      <td>12</td>
    </tr>
    <tr>
      <td>21</td>
      <td>22</td>
    </tr>
    <tr>
      <td>31</td>
      <td>32</td>
    </tr>
    <tr>
      <td>31</td>
      <td>32</td>
    </tr>
    <tr>
      <td>31</td>
      <td>32</td>
    </tr>
  </tbody>
</table>

【讨论】:

在我的场景中,我们无法将颜色应用到第一行,因为我们不确定代码中的某些位置是否已经应用了颜色。 col1 和 col2 没有颜色。你想要同样的权利吗?你想跳过第二个值 11 和 12 吗?为了区分,您可以添加一些边框或不添加。 我希望第 2、第 4、第 6、... 被视为奇数行,第 3、第 5、第 7、... 被视为偶数行,因为我们忽略了第 1 行。 你的第一行是标题?或具有值 11 和 12 的行?没有清除 不管是不是标题还是表格行。在这种情况下,它是标题行。无论哪种方式,我们都必须过滤掉第一行并从第二行开始计数作为第一行。【参考方案3】:

这对你有用吗?分别定位第一行

tr:nth-child(even) background: #CCC
tr:nth-child(odd) background: #FFF
tr:first-child 
  background-color: yellow;
<table>
  <tbody>
    <tr>
      <th>col 1</th>
      <th>col 2</th>
    </tr>
    <tr>
      <td>11</td>
      <td>12</td>
    </tr>
    <tr>
      <td>21</td>
      <td>22</td>
    </tr>
    <tr>
      <td>31</td>
      <td>32</td>
    </tr>
  </tbody>
</table>

【讨论】:

在我的场景中,我们无法将颜色应用到第一行,因为我们不确定代码中的某些位置是否已经应用了颜色。【参考方案4】:

您可以将nth-child() 选择器与not() 选择器结合使用。

tr:nth-child(2n + 1):not(:nth-child(1)) 
    background: red;

【讨论】:

这不仅会为第一行应用颜色,还会为第三行、第五行等应用颜色。但是,在我的情况下,第 2、第 4、第 6 等等应该被视为奇数行。【参考方案5】:
 table > tbody tr:nth-child(2n+1) > td
    background-color: #eee;

table > tbody > tr:first-child > td
    background-color: #006c00;
           
table > tbody > tr:nth-child(2n + 2) > td
    background-color: #d8e4bc;

【讨论】:

在我的场景中,我们无法将颜色应用到第一行,因为我们不确定代码中的某些位置是否已经应用了颜色。 不会有 :) 试试看codepen.io/Codrey/pen/ZEQwZjN?editors=1100 2n+1 在我们查看代码时基本上是奇数行,但它被应用于偶数行(如果计数从实际的第二行开始,则为第二行)。所以,我不想在代码和视觉之间产生这种混淆。

以上是关于使用 CSS 从表格的第二行替换行颜色的主要内容,如果未能解决你的问题,请参考以下文章

如何用第二行扩展表格的第一行?

如何在js中一一移动每一行的背景颜色并从前一个颜色中删除颜色

CSS li 当前选中项目背景颜色为蓝色怎么做?

CSS表格交替行颜色和悬停颜色[重复]

使用css替换具有不一致类的表行颜色的方法[重复]

BI Publisher Report中如何将Ms.Word表格的第一行和第二行保持在一个页面中?