【问题标题】:How can I properly target the last tr in a table that uses tfoot, tbody, and thead?如何正确定位使用 tfoot、tbody 和 thead 的表中的最后一个 tr?
【发布时间】:2017-01-24 01:33:20
【问题描述】:

我有一张桌子。

它目前包含一个thead、tbody 和tfoot 部分。

我想定位表格中的最后一行 (tr)。

如果我使用tr:last-of-type,它会导致 3 行成为目标:

这是因为它针对的是 thead 中的最后一个 tr、tbody 中的最后一个 tr 和 tfoot 中的最后一个 tr。

我不希望它以 3 行为目标。我只希望它针对表中的最后一行。

我可以使用tfoot tr:last-of-type,只要 tfoot 中至少有一个 tr 元素,它就可以工作:

但是,如果 tfoot 为空,或者表格缺少 tfoot 元素,则不会有任何目标。

我希望始终以表的绝对最后一行为目标,仅使用 CSS。我该怎么做?

【问题讨论】:

    标签: html css html-table css-tables


    【解决方案1】:

    “始终以最后一行为目标,无论它在哪里”的一种简单方法就是

    table > *:last-child > tr:last-of-type {
    	background-color: #0f0;
    }
    <table>
    	<thead>
    		<tr>
    			<th>A</th>
    		</tr>
    	</thead>
    	<tbody>
    		<tr>
    			<td>a</td>
    		</tr>
    		<tr>
    			<td>b</td>
    		</tr>
    	</tbody>
    </table>
    
    <table>
    	<thead>
    		<tr>
    			<th>A</th>
    		</tr>
    	</thead>
    	<tbody>
    		<tr>
    			<td>a</td>
    		</tr>
    		<tr>
    			<td>b</td>
    		</tr>
    	</tbody>
    	<tfoot>
    		<tr>
    			<td>c</td>
    		</tr>
    	</tfoot>
    </table>

    这将按照您的描述进行,尽管有一个问题。 &lt;thead&gt;&lt;tbody&gt;&lt;tfoot&gt; 元素的顺序未强制执行,因此您实际上可以在 &lt;tbody&gt; 之前放置一个 &lt;tfoot&gt;,并使用与输出相同的表,在这种情况下实际上是最后一个 &lt;tr&gt;将被选中,这在视觉上不是最后一个&lt;tr&gt;

    这需要一些额外的技巧:

    /* the optimistic true last <tr> */
    table > :last-child > tr:last-of-type,
    /* any last <tr> within a <tfoot> */
    table tfoot > tr:last-of-type {
        background-color: #0f0;
    }
    
    /* reset any style in the true last <tr> if its parent is
       preceded by a `<tfoot>` */
    table > tfoot ~ :last-child > tr:last-of-type {
        background-color: initial;
    }
    

    working fiddle

    编辑: 我忘了考虑空的&lt;tfoot&gt; 元素,这需要使用:not:empty 伪类(旧浏览器不支持),看起来像:

    /* the optimistic true last <tr> */
    table > :last-child > tr:last-of-type,
    /* any last <tr> within a <tfoot> */
    table tfoot > tr:last-of-type {
        background-color: #0f0;
    }
    
    /* reset any style in the true last <tr> if its parent is
       preceded by a `<tfoot>` */
    table > tfoot:not(:empty) ~ :last-child > tr:last-of-type {
        background-color: initial;
    }
    

    updated fiddle

    【讨论】:

    • 哇,这看起来很有希望。稍后我会仔细看看它是否满足所有边缘情况。
    • 我认为问题是一样的。如果最后一个tr 为空,则失败
    • @IvanRodriguezTorres - 你说得对,这里失败了:jsfiddle.net/10tLbtsk
    • 虽然你是对的@IvanRodriguezTorres,如果这是空的,这对于最后一个&lt;tr&gt; 不会在视觉上做任何事情,它会针对它的风格。该要求没有说明最后一个 &lt;tr&gt; 是空的(CSS 无法做到这一点),但它确实声明应该忽略空的 &lt;tfoot&gt;,现在已将其添加到答案中。
    • 这并不能解决在&lt;tbody&gt; 之后出现空&lt;tfoot&gt; 的问题,尽管始终使用以下顺序可能很容易解决这个问题:thead、tfoot、tbody。使用纯 CSS 不可能做到这一点的主要原因在于 CSS 只能“前进”(可以定位 tbody 之后的空 tfoot (tbody + tfoot:empty),但在这种情况下,您实际上希望定位 @ 987654345@ 在那里,这是无法完成的(不幸的是,即使像 tbody:not(+ tfoot:empty) 这样的东西也不能,因为 not 伪类只允许排除兄弟关系的“简单选择器”(+
    【解决方案2】:

    不确定您所说的以表中的最后一行为目标是什么意思。

    如果你想定位你会使用的最后一个 tfoot:

     table tfoot tr:last-of-type
    

    如果您想定位 tbody 中的最后一行,您可以使用:

    table tbody tr:last-of-type
    

    如果你想定位到你会使用的tad中的最后一行:

    table thead tr:last-of-type
    

    如果您想定位 tfoot 中的最后一行,除非它是空的,否则您想定位 tbody 中的最后一行,那么您将需要使用 JavaScript。

    这是一个小提琴链接供您查看代码。 Fiddle Link

    【讨论】:

    • 我正在寻找你所说的最后一件事,但使用纯 CSS 解决方案而不是 JavaScript。
    • CSS 不支持条件语句。 [CSS if else] 或CSS if。不知道这有多大帮助
    【解决方案3】:

    这里是另一种方式。

    table
    {
       border-collapse:collapse;
    }
    tr{
       border-bottom: 1px solid #000;
    }
    
    table :last-child >:last-child > td {
       background-color: red
    }
    <table>
      <tr>
    <td>a
    </td>
    <td>a
    </td>
      </tr>
      <tr>
    <td>b
    </td>
    <td>b
    </td>
      </tr>
      <tr>
    <td>v
    </td>
    <td>v
    </td>
      </tr>
    </table>
    --------------
    <table>
      <tr>
    <td>a
    </td>
    <td>a
    </td>
      </tr>
      <tr>
    <td>b
    </td>
    <td>b
    </td>
      </tr>
      <tr>
    <td>v
    </td>
    <td>v
    </td>
      </tr>
      <tfoot>
    <tr>
      <td>v
      </td>
      <td>v
      </td>
    </tr>
      </tfoot>
    </table>
    ------------
    
    <table>
      <thead>
    <tr>
      <td>r</td>
      <td>r</td>
    </tr>
      </thead>
      <tr>
    <td>a
    </td>
    <td>a
    </td>
      </tr>
      <tr>
    <td>b
    </td>
    <td>b
    </td>
      </tr>
      <tr>
    <td>v
    </td>
    <td>v
    </td>
      </tr>
      <tfoot>
    <tr>
      <td>v
      </td>
      <td>v
      </td>
    </tr>
      </tfoot>
    </table>

    解决方案很简单。首先,您在我的 sn-p table 中对表进行寻址。然后你必须处理最后一个元素,因为我们有三个级别 (thead or tbody or tfoot > td > 'tr'),我们需要处理最后一个元素 3 次

    【讨论】:

    • 这似乎是针对最后一个单元格,而不是最后一行。还是我做错了? jsfiddle.net/onk6bq03
    • 你是对的,一点点修改就足以让它工作@Pikamander2
    • 没错。如果它确实有效并且只针对最后一行,它将错过最后一行为空的用例。不过非常接近。
    • 编辑在大多数情况下效果很好,但如果结尾有空白 tfoot 或类似内容,则会失败:jsfiddle.net/hkrdybuo
    • 是的,我正在努力,但正如@MichaelHeath 建议的那样,使用 CSS 似乎是不可能的。我会继续努力
    【解决方案4】:

    完全编辑我的答案。对于那个很抱歉。这里的问题是你无法判断最后一行是否有任何 CSS 内容。

    所以纯粹使用 CSS 是行不通的,因为该行仍然存在,即使它是空的。所以它将是最后一行的样式,里面什么都没有。我会查看 Javascript,或者如果您正在生成此服务器端,请在最后一行添加一个类,以便您可以自定义样式。

    【讨论】:

    • 我刚刚意识到我可能错过了您所说的内容。一分钟!
    • 正确,这没有解决问题的最后一部分。我想始终以最后一行为目标,无论它在哪里。基本上,我想要一个万能的解决方案。
    猜你喜欢
    • 2019-04-06
    • 1970-01-01
    • 2010-12-02
    • 1970-01-01
    • 1970-01-01
    • 2010-11-11
    • 2012-05-11
    • 1970-01-01
    • 2021-07-04
    相关资源
    最近更新 更多