【问题标题】:Force HTML Tables To Not Exceed Their Containers' Size强制 HTML 表格不超过其容器的大小
【发布时间】:2013-07-31 22:46:21
【问题描述】:

这个问题已经被问过好几次了,但提供的答案似乎都对我没有帮助:

在此处查看实际操作:http://jsfiddle.net/BlaM/bsQNj/2/

我有一个包含两列的“动态”(基于百分比)布局。

.grid {
    width: 100%;
    box-sizing: border-box;
}
.grid > * {
    box-sizing: border-box;
    margin: 0;
}
.grid .col50 {
    padding: 0 1.5%;
    float: left;
    width: 50%;
}

在这些列中的每一列中,我都有一个应该使用完整列宽的表格。

.data-table {
    width: 100%;
}
.data-table td {
    white-space: nowrap;
    text-overflow: ellipsis;
    overflow: hidden;
}

我的问题是该表中的某些列的内容需要被截断以适合表的给定宽度。但是,这不会发生。我得到两个相互重叠的表。

要求:

  • 需要基于百分比。我无法设置绝对尺寸。
  • 每行的高度不得超过一个文本行(如果我删除空格:nowrap,就会发生这种情况)
  • 必须在 Chrome、Firefox 和 Internet Explorer 8+ 中运行
  • 无法在彼此下方显示表格,因为打印时表格必须适合一张纸。

我尝试了什么:

  • 在里面使用宽度和溢出。什么都没改变。
  • “显示:表格;”包含 div - 表格不是有两列而是显示在彼此下方
  • “表格布局:固定;” - 强制所有列具有相同的宽度
  • 我知道第 2+3 列总共有 30% 的宽度,所以我尝试手动将第 1 列设置为 70% - 没有改变任何东西
  • Zero-width spaces in content - 没有改变任何东西,可能是由于 white-space: nowrap;

相关问题:

【问题讨论】:

  • 这里有几个想法。如果您必须截断某些文本,请溢出:隐藏;基本上取消了这种效果,所以如果有额外的文字,它就会被隐藏起来。我不确定我是否理解 a) 将所有内容保持在一条线上并切断一些线(未隐藏)和 b) 让多个表格相互重叠。
  • a) 我不希望这些表重叠。这正是我想要避免的。 b)我可以在文本不适合表格宽度的地方截断文本。 c) 为什么总是有人在这个网站上问“为什么”,即使它无助于解决问题? ;)
  • @BlaM 询问为什么是确定 OP 会接受哪些解决方案变体的一种方法。

标签: html css html-table column-width


【解决方案1】:

你需要添加 table-layout 属性:

table-layout: fixed;

在表格 HTML 标记中也包括 width=100%,而不仅仅是样式标记。

http://jsfiddle.net/reeK5/

【讨论】:

  • 太棒了,谢谢!无论宽度值如何,这都能很好地工作,但我只测试了百分比宽度。
  • 为什么在 HTML 标签中包含width="100%"
  • @swenedo 样式作为 HTML 标记中的属性是“行内”样式,它们优先于 <head> 元素或任何外部样式表中的任何样式。这是一种确保表设置为 width: 100%; 而不是像在其他地方声明的 width: auto; 这样的不同的方法。
  • Per MDN wrt to width 属性:“不要使用此属性,因为它已被弃用。” developer.mozilla.org/en-US/docs/Web/HTML/Element/table——此外,它是不必要的。跨度>
  • 这使得所有列的宽度相同,这不是我想要的。不需要为包含数值的列分配与包含大文本的列相同的宽度
【解决方案2】:

也许你会对我发现的max-width: 0; hack 感兴趣。

它有一些限制,我们应该使用 CSS 表格而不是 HTML,但它确实有效:

.leftBlock
{
    width: 100%;
    max-width: 0;
    word-wrap: break-word;
    overflow: hidden;
}

.rightBlock
{
    width: 200px;
    max-width: 200px;
    min-width: 200px;
}

http://jsfiddle.net/CyberAP/NUHTk/103/

【讨论】:

  • 我发现最大宽度和最小宽度对表格及其部分的影响在 CSS 2.1 规范中是明确未定义的。因此,可能无法依赖任何相关的行为。仍然很有趣。
【解决方案3】:

.div {
  width:300px;
  border:1px solid;
}
.breaked {
  word-break: break-all;
}
table{
  border:1px solid red;
}
td {
  border:1px solid green;
}
<div class="div">
<table>
  <tr>
    <td>aaaaaaa_________________________________________-sdasd-ad-f-asfas-df-a a-sd-fa-d-ad-fa-ds-asd-a-ads-fa-df-ads-fa-d-fad-f-ad-fad-ad-sa-fda-df-</td>
    <td>13</td>
  </tr>
  <tr>
    <td>ddddddddddddd</td>
    <td>aa</td>
  </tr>
 </table>
  <br /><hr/><br />
  <table class="breaked">
  <tr>
    <td>aaaaaaa_________________________________________-sdasd-ad-f-asfas-df-a a-sd-fa-d-ad-fa-ds-asd-a-ads-fa-df-ads-fa-d-fad-f-ad-fad-ad-sa-fda-df-</td>
    <td>13</td>
  </tr>
  <tr>
    <td>ddddddddddddd</td>
    <td>aa</td>
  </tr>
 </table>
</div>

【讨论】:

  • 仅适用于文本表格,不适用于包含复杂数据的表格。
【解决方案4】:

在桌子上的测量工作方式不同。一般来说,表格单元格的宽度被处理为最小宽度。

如果您不介意添加额外的标记,一个解决方案是在您放置内容的每个表格单元格中放置一个div。然后给这个 div 一个宽度,或者一个最大宽度。所以

<td>http://www.xxxxxx.xxxxxxx.com/xxx_xxxx/XXXXXXXX/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/XXXXXXXX_xXxxxx</td>

变成

<td><div>http://www.xxxxxx.xxxxxxx.com/xxx_xxxx/XXXXXXXX/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/XXXXXXXX_xXxxxx</div></td>

等等。

查看更新的小提琴:http://jsfiddle.net/bsQNj/4/

编辑:我看到小提琴需要一些工作 - 我忘记在必要的地方放置一些 div。但我希望你能接受这个想法。

【讨论】:

  • 我只能使用基于百分比的宽度,因为我永远无法知道列的宽度。当我使用 10em 时,它可能太窄或太宽。但是,给
    一个基于百分比的宽度并没有帮助。
  • 对不起,但就像我在编辑中所说的那样,我没有将 div 添加到所有 td 中。不过还是希望你能接受这个想法。
  • 缺少 div 不是问题。 “最大宽度:10em”是没有帮助我的部分。该列可能是 100em 宽,也可能是 5em 宽。这取决于屏幕/纸张大小,我事先不知道。我可以尝试用 javascript 来解决这个问题,但对我来说这感觉像是一个肮脏的 hack ;)
  • 10em 只是一个例子。就像你的小提琴只是一个例子。将所需的大小应用于 tds 中的 div 而不是 tds 本身。问题不是我希望你的列宽 10em,而是 tds 拒绝缩小到你给它们的任何宽度。这是我之前制作的小提琴:jsfiddle.net/MrLister/HnB3G/3
  • 我的问题是我想要的宽度是“尽可能宽”。我不能使用绝对值 - 例如 px、pt、em - 因为我不知道表格的宽度。都是百分比。
【解决方案5】:

在您的 CSS 中:

table {
    table-layout: auto;
    width: 100%;
}   

应该涵盖所有表格

【讨论】:

  • 当我添加这个时没有任何变化。
  • 如果您的表格在 html 中声明了固定宽度(即 width="500px"),则将无法使用
猜你喜欢
相关资源
最近更新 更多
热门标签