固定表单元格宽度


175

许多人仍然使用表格来布局控件,数据等。-流行的jqGrid就是一个例子。但是,发生了一些我似乎无法理解的魔术(它的桌子大声喊叫,可能会有多少魔术?)

如何设置表的列宽并使它像jqGrid那样遵守!?如果我尝试复制此内容,即使我设置了every <td style='width: 20px'>,只要这些单元格之一的内容大于20px,该单元格就会展开!

有什么想法或见解吗?

Answers:


249

您可以尝试<col>对所有行使用标签管理表样式,但需要table-layout:fixed<table>或表css类上设置overflow样式并为单元格设置样式

https://developer.mozilla.org/zh-CN/docs/Web/HTML/Element/col

<table class="fixed">
    <col width="20px" />
    <col width="30px" />
    <col width="40px" />
    <tr>
        <td>text</td>
        <td>text</td>
        <td>text</td>
    </tr>
</table>

这是你的CSS

table.fixed { table-layout:fixed; }
table.fixed td { overflow: hidden; }

15
col在html5中不起作用,而是通过内联css或css类设置单个td的宽度
Pankaj Phartiyal

10
除非您为所需表格明确应用宽度,否则可接受的答案将不起作用。无论您使用单位还是百分比,效果都很好。我想指出这一点,因为@totymedli的答案没有获得任何投票,我也不希望用户忽略它。但是,除非您要这样做,否则不需要断字建议。
thebdawk05 2013年

当行中只有1个TD元素跨越多个列时,会发生什么情况?使用示例代码,如果您自己<TD colspan="3">连续一行,那么它会是90px吗?
sab669

谢谢它的帮助。对于数据重叠,添加this table.fixed td { word-wrap: break-word; }
Parag Tyagi

断词建议不是必需的,但对其余SO用户有用,并且与问题非常相关,因为在大多数情况下几乎肯定会发生固定宽度表中的内容溢出。
艾米·佩莱格里尼

101

现在在HTML5 / CSS3中,我们为该问题提供了更好的解决方案。我认为建议使用这种纯CSS解决方案:

table.fixed {table-layout:fixed; width:90px;}/*Setting the table width is important!*/
table.fixed td {overflow:hidden;}/*Hide text outside the cell.*/
table.fixed td:nth-of-type(1) {width:20px;}/*Setting the width of column 1.*/
table.fixed td:nth-of-type(2) {width:30px;}/*Setting the width of column 2.*/
table.fixed td:nth-of-type(3) {width:40px;}/*Setting the width of column 3.*/
<table class="fixed">
    <tr>
        <td>Veryverylongtext</td>
        <td>Actuallythistextismuchlongeeeeeer</td>
        <td>We should use spaces tooooooooooooo</td>
    </tr>
</table>

您需要width困扰解决方案中设置表的偶数。否则,它将无法正常工作。vsync建议的
另一个CSS3新功能是:。这会将单词中没有空格的单词也分成多行。只需像这样修改代码:word-break:break-all;

table.fixed { table-layout:fixed; width:90px; word-break:break-all;}

最后结果

渲染表


如果使用插入一行colspan,这似乎会破坏该解决方案。关于如何使用包含colspan> 1 的表使用此解决方案的任何建议?
Eric K

@QuantumDynamix我通过在第一行中包括没有colspans的行,而只有所有单独的具有宽度的列,来解决此问题。然后,我以0高度,边框:无,可见性:隐藏,填充:0px等隐藏该行,然后第二行是我想看到的第一行,其中有colspans。具有单独固定宽度单元格的第一行确定宽度。
AaronLS 2014年

@totymedli任何想法如何使我的表采用我所有列宽的总和?我的表格是动态生成的,因此无法提前计算表格宽度,但是我不想使用100%,因为这会拉伸一些元素。
AaronLS

14
table td 
{
  table-layout:fixed;
  width:20px;
  overflow:hidden;
  word-wrap:break-word;
}

9
您确定可以table-layout在td元素上使用吗?
尼克,

@Nick-可以。但是,我还必须添加min-width和max-width属性(与width相同的值),然后它才真正变为固定宽度。
丹尼斯·海伊

11

我有一个很长的表td单元格,这将表强行拉到浏览器的边缘,看上去很难看。我只希望该列仅固定大小,并在达到指定宽度时打断单词。因此,这对我来说效果很好:

<td><div style='width: 150px;'>Text to break here</div></td>

您无需为表tr元素指定任何样式。您也可以使用overflow:hidden; 正如其他答案所建议的那样,但这会使多余的文本消失。


2
或者,您可以在需要时使用max-width而不是width。除非您达到宽度限制,否则这将使您不破坏文本。如果您的文本小于指定的宽度,则表格单元格将没有空白。<td> <div style ='max-width:150px;'>要在此处中断的文本</ div> </ td>
Tarik


0

对于FULLSCREEN宽度表:

  • 桌子宽度必须为100%

  • 如果需要N个列,则TH必须为N + 1

3列的示例:

table.fixed {
      table-layout: fixed;
      width: 100%;
    }
    table.fixed td {
      overflow: hidden;
    }
  <table class="fixed">
      <col width=20 />
      <col width=20 />
      <col width=20 />
    <tr>
      <th>1</th>
      <th>2</th>
      <th>3</th>
      <th>FREE</th>
    </tr>
    <tr>
      <td>text111111111</td>
      <td>text222222222</td>
      <td>text3333333</td>
    </tr>
  </table>


-2
table
{
  table-layout:fixed;
}
td,th
{
  width:20px; 
  word-wrap:break-word;
}

:第一个孩子...:nth-​​child(1)或...

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.