我有一个包含大量行的HTML表,我需要右对齐一列。
我知道以下方法,
<tr><td>..</td><td>..</td><td align='right'>10.00</td><tr>
和
<tr><td>..</td><td>..</td><td class='right-align-class'>10.00</td><tr>
在这两种方法中,我必须在每个<tr>
标记上重复align或class参数。 (如果有1000行,我必须将align ='right'或class ='right-align-class'1000次。)
有没有有效的方法来做到这一点?有没有直接的说法,将所有行中的第三列对齐?
直接回答你的问题:没有。没有更简单的方法可以在所有现代浏览器中获得一致的外观,而无需重复列上的类。 (虽然,见下文re:nth-child。)
以下是最有效的方法。
HTML:
<table class="products">
<tr>
<td>...</td>
<td>...</td>
<td class="price">10.00</td>
<td>...</td>
<td>...</td>
</tr>
<tr>
<td>...</td>
<td>...</td>
<td class="price">11.45</td>
<td>...</td>
<td>...</td>
</tr>
</table>
CSS:
table.products td.price {
text-align: right;
}
为什么你不应该使用nth-child:
CSS3伪选择器nth-child对此非常有用 - 而且效率更高 - 但它在现有的实际网络上使用是不切实际的。 It is not supported by several major modern browsers,包括所有IE的6-8。不幸的是,这意味着今天在a significant share(至少40%)浏览器中不支持nth-child。
所以,nth-child很棒,但是如果你想要一致的外观和感觉,那么使用它是不可行的。
使用jquery可以不显眼地将类应用于所有tr。
$(“table td”)。addClass(“right-align-class”);
如果要选择特定的td,请在td上使用增强型过滤器。
生活在桌子内的<colgroup>
和<col>
标签就是为此目的而设计的。如果表中有三列并想要对齐第三列,请在打开<table>
标记后添加:
<colgroup>
<col />
<col />
<col class="your-right-align-class" />
</colgroup>
以及必要的CSS:
.your-right-align-class { text-align: right; }
从W3:
Definition and Usage
<col>
标记定义表中一列或多列的属性值。<col>
标记对于将样式应用于整个列非常有用,而不是为每一行重复每个单元格的样式。
你可以使用nth-child
伪选择器。例如:
table.align-right-3rd-column td:nth-child(3)
{
text-align: right;
}
然后在你的表中做:
<table class="align-right-3rd-column">
<tr>
<td></td><td></td><td></td>
...
</tr>
</table>
编辑:
不幸的是,这仅适用于Firefox 3.5。但是,如果您的表只有3列,则可以使用兄弟选择器,它具有更好的浏览器支持。这是样式表的样子:
table.align-right-3rd-column td + td + td
{
text-align: right;
}
这将匹配前面有两个其他列的任何列。
如果它始终是第三列,您可以使用它(假设表类“产品”)。虽然它有点hacky,如果你添加一个新列,并不健壮。
table.products td+td+td {
text-align: right;
}
table.products td,
table.products td+td+td+td {
text-align: left;
}
但老实说,最好的想法是在每个细胞上使用一个类。您可以使用col
元素设置列的宽度,边框,背景或可见性,但不能设置任何其他属性。 Reasons discussed here。
通过您的确切问题查看您的隐含问题:
第1步:使用您描述的类(或者,如果必须,使用内联样式)。
第2步:打开GZIP压缩。
作品奇迹;)
通过这种方式,GZIP可以为您(通过线路,无论如何)移除冗余,并且您的源仍然符合标准。
几年前(在IE中只有几天)我使用的是<col align="right">
标签,但我只是测试了它,而且它似乎只是IE的一个特性:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Test</title>
</head>
<body>
<table width="100%" border="1">
<col align="left" />
<col align="left" />
<col align="right" />
<tr>
<th>ISBN</th>
<th>Title</th>
<th>Price</th>
</tr>
<tr>
<td>3476896</td>
<td>My first HTML</td>
<td>$53</td>
</tr>
</table>
</body>
</html>
该片段取自www.w3schools.com。当然,它不应该被使用(除非出于某种原因你真的只针对IE渲染引擎),但我认为提及它会很有趣。
编辑:
总的来说,我不明白放弃这个标签背后的原因。它似乎非常有用(至少对于手动HTML发布)。
这在IE6中不起作用,这可能是一个问题,但它可以在IE7 +和Firefox,Safari等中工作。它会将第3列对齐,并保留所有后续列。
td + td + td { text-align: right; }
td + td + td + td { text-align: left; }
如果你只有两种“列式” - 使用一种作为TD,一种作为TH。然后,声明表的类和该表的TH和TD的子类。然后你的HTML可以超级高效。
目前的CSS Selectors Level 4草案规定了网格的结构选择器。如果实施,我们将能够做到这样的事情:
th.price,
th.price || td {
text-align: right;
}
当然,这对我们今天没有帮助 - 这里的其他答案为此提供了足够的实用建议。
你真正想要的是:
<col align="right"/>
但看起来Gecko还不支持这个:它是an open bug for over a decade。
(Geez,为什么Firefox不能像IE6那样拥有像样的标准支持?)