【问题标题】:HTML table ignoring element-style width忽略元素样式宽度的 HTML 表格
【发布时间】:2012-10-25 16:48:09
【问题描述】:

忽略元素样式宽度的 HTML 表格

我有一个 HTML 表格,其中某些单元格的文本内容很长。

我想使用 jQuery 为这些单元格指定宽度(以像素为单位),但呈现的表格只是忽略了给定的宽度。

有没有办法强制表格遵守这个宽度?

谢谢!


JSFiddlehttp://jsfiddle.net/sangil/6hejy/35/

(如果您检查单元格,您可以看到计算出的宽度与元素样式的宽度不同)


HTML

<div id="tblcont" class="tblcont">
 <table id="pivot_table">
 <tbody>
   <tr>
      <th id="h0" >product</th>
      <th id="h1" >price</th>
      <th id="h2" >change</th>
   </tr>         
   <tr>
      <!-- this is the cell causing trouble -->
      <td id="c00" >Acer 2400 aaaaaaaaaaaaaaaaaaaaaaaaaa</td>
      <td id="c01" >3212</td>
      <td id="c02" >219</td>         

   </tr>
   <tr>
      <td id="c10" >Acer</td>
      <td id="c11" >3821</td>
      <td id="c12" >206</td>         

   </tr>
</tbody>
</table>
</div>

CSS

.tblcont {
  overflow: hidden;
  width: 500px;
}

table {
  table-layout: fixed;
  border-collapse: collapse; 
  overflow-x: scroll; 
  border-spacing:0; 
  width: 100%;
}

th, td {
 overflow: hidden;
 text-overflow: ellipsis;
 word-wrap: break-word;
}

th {
 height: 50px;
}

Javascript

$(document).ready(function() {

  // THIS LINE HAS NO EFFECT!
  $('#c00').width(30);
});​

【问题讨论】:

    标签: html html-table


    【解决方案1】:

    我可以从你的小提琴中看出你已经很好地掌握了如何获得截断等词。我认为您可能会发现执行以下操作很有用:

    <table>
      <colgroup>
        <col style="width: 30px;" /> <!-- this style affects the whole 1st column -->
        <col />
        <col />
      </colgroup>
    
      <!-- the rest of your table here -->
    </table>
    

    此方法以符合 HTML 规范的方式使用 - 并将调整整个列的大小。如果您改为将单元格的 display 更改为 inline-block,如上所述,将会发生的情况是您将单元格从表格流中取出 - 并且其他样式更改可能会停止工作。

    通过使用上面的代码对整个col 进行样式设置,您可以使用table 元素的table-layout: fixed 样式来代替。

    另外 - 我注意到您已将单元格设置为使用 text-overflow: ellipsis; 在 quirksmode 上查看 this article 以了解它为什么不起作用。您需要的修复是进行以下编辑:

    th, td {
        border: solid #4682B4 1px;
        overflow: hidden;
        text-overflow: ellipsis;
        word-wrap: break-word;
        text-align: center;
    
        white-space: nowrap; /* Add this line */
    }
    

    【讨论】:

    • 这是一个很好的解决方案 - 尽管我认为使用它的 id 更改标题的宽度而不是添加一个 colgroup 会更简单(我应该想到从 :-/ ) 谢谢!
    • “宽度”是非标准/过时的。
    • 是的 - 我已经更新了我的答案以反映在 HTML5+ 中应该做什么。
    【解决方案2】:

    默认情况下,表格单元格适合其内容并忽略您的宽度。

    已提供答案的其他可能性:

    用其他容器包围文本:

    <td id="c00" ><div>Acer 2400 aaaaaaaaaaaaaaaaaaaaaaaaaa</div></td>
    

    并改变它的宽度:

    $('#c00 div').width(30);
    

    【讨论】:

    • 这也是一个非常可行的解决方案。我认为这不太符合他的目标——但嵌套元素是我经常使用的技巧。然后你可以做一些事情,比如在:hover 上切换嵌套项目的样式,并让内部元素像工具提示一样弹出,等等。
    【解决方案3】:

    你有几个问题:

    table-layout: fixed 告诉列相等。

    然后,即使你把它去掉,你的文本也比 30 像素宽,没有空格,所以它不会比"aaaaaaaaaa" 等更窄。你需要使文本更小,或者添加空格。

    最后,width 应该是 "30px"(用引号括起来)。

    希望对您有所帮助。

    【讨论】:

    • 如果你仔细观察,他实际上将单元格设置为用省略号截断。当列太窄时,他试图截断文本。
    • 刚刚注意到你打开了'word-wrap: break-word',我想应该让它中断。 (我从未使用过它,所以我不确定为什么该部分可能无法正常工作。)
    • 最大的魔力应该来自他正在使用的tr, td { } css 风格。 break-word 规则将被应用,但实际上不会做任何事情。 text-overflow: ellipsis;overflow: hidden; 是会改变事物的部分 - 通过在它们流出渲染框之前截断单词,并在末尾添加 ...。他只是想念white-space: nowrap; 以使其正常工作。
    • 谢谢,Troy - 只是在处理另一个问题,应该更仔细地阅读。
    • np :) 看到你提到不知道该规则是如何工作的,所以我想我会指出来。
    【解决方案4】:

    试试这个:

    $('#c00').css("width","30px");
    

    或者这个:

    <td id="c00" style='width:30px'>
    

    如果您使用的是 IE,您可能需要打开兼容模式。另外,请确保您正在导入正确的 jQuery 插件。

    【讨论】:

    • 不需要 jQuery 来解决这个问题 - 这是一个纯 CSS 问题。
    • 您说:我想使用 jQuery 为这些单元格指定宽度(以像素为单位),但呈现的表格只是忽略了给定的宽度。有没有办法强制表格遵守这个宽度?
    • 你也可以内联样式:
    • 我需要使用 jQuery 来动态更改列宽。正如 Troy 所指出的,问题是我试图直接更改单元格宽度,而不是使用标题或 colgroup。
    猜你喜欢
    相关资源
    最近更新 更多
    热门标签