在HTML表格中右键对齐文本的更好方法

问题描述 投票:50回答:11

我有一个包含大量行的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次。)

有没有有效的方法来做到这一点?有没有直接的说法,将所有行中的第三列对齐?

html css
11个回答
55
投票

直接回答你的问题:没有。没有更简单的方法可以在所有现代浏览器中获得一致的外观,而无需重复列上的类。 (虽然,见下文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很棒,但是如果你想要一致的外观和感觉,那么使用它是不可行的。


-2
投票

使用jquery可以不显眼地将类应用于所有tr。

$(“table td”)。addClass(“right-align-class”);

如果要选择特定的td,请在td上使用增强型过滤器。

jquery


-2
投票

生活在桌子内的<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>标记对于将样式应用于整个列非常有用,而不是为每一行重复每个单元格的样式。

11
投票

你可以使用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;
}

这将匹配前面有两个其他列的任何列。


9
投票

如果它始终是第三列,您可以使用它(假设表类“产品”)。虽然它有点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


3
投票

通过您的确切问题查看您的隐含问题:

第1步:使用您描述的类(或者,如果必须,使用内联样式)。

第2步:打开GZIP压缩。

作品奇迹;)

通过这种方式,GZIP可以为您(通过线路,无论如何)移除冗余,并且您的源仍然符合标准。


0
投票

几年前(在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发布)。


0
投票

这在IE6中不起作用,这可能是一个问题,但它可以在IE7 +和Firefox,Safari等中工作。它会将第3列对齐,并保留所有后续列。

td + td + td { text-align: right; }
td + td + td + td { text-align: left; }

0
投票

如果你只有两种“列式” - 使用一种作为TD,一种作为TH。然后,声明表的类和该表的TH和TD的子类。然后你的HTML可以超级高效。


0
投票

目前的CSS Selectors Level 4草案规定了网格的结构选择器。如果实施,我们将能够做到这样的事情:

th.price,
th.price || td {
    text-align: right;
}

当然,这对我们今天没有帮助 - 这里的其他答案为此提供了足够的实用建议。


-1
投票

你真正想要的是:

<col align="right"/>

但看起来Gecko还不支持这个:它是an open bug for over a decade

(Geez,为什么Firefox不能像IE6那样拥有像样的标准支持?)

© www.soinside.com 2019 - 2024. All rights reserved.