为什么CSS省略号在表格单元格中不起作用?


150

请考虑以下示例:(此处为现场演示

$(function() {
  console.log("width = " + $("td").width());
});
td {
  border: 1px solid black;
  width: 50px;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<table>
  <tbody>
    <tr>
      <td>Hello Stack Overflow</td>
    </tr>
  </tbody>
</table>

输出为:width = 139,并且省略号不出现。

我在这里想念什么?



某种程度上重复,但是答案并没有提供解决方法(就像Arlen Cuss一样)。
Florian Margaine '04年

1
widthheight表格上的单元格始终用作最小宽度和高度。表格单元格不同!
李斯特先生,2012年

1
@FlorianMargaine实际上,另一个问题确实提供了一种解决方法:将div放入所需宽度的单元格中。
李斯特先生,2012年

我仍然更喜欢此页面上列出的答案。
Florian Margaine'4

Answers:


102

显然,添加:

td {
  display: block; /* or inline-block */
}

也可以解决问题。


另一种可能的解决方案是table-layout: fixed;为表格设置,也将其设置为width。例如:http : //jsfiddle.net/fd3Zx/5/


4
究竟。具有元素display: table-cell(元素的默认设置)的td元素不接受宽度。
Michael Mior 2012年

29
display: block;有点违背了使用表格的目的。我喜欢这个table-layout: fixed;选项,对我来说效果很好。
Alex K

7
table-layout:fixed以一种不太聪明的方式分配列的宽度。是否有另一个选项将以相同的方式分配列宽table-layout: normal并正确显示省略号?
嵌套

该螺钉与桌子边框;没有使用最大宽度。
查理

84

放进去也很重要

table-layout:fixed;

到包含表上,因此它在IE9中也能很好地运行(如果您利用max-width的话)。


7
这也将确保文本溢出在响应式布局中起作用
jao 2013年

3
这正是我所需要的。我的桌子宽度为100%。并且除固定宽度的列以外的所有列。这允许最后一列占用剩余的空间。
matthew_360

78

如前所述,您可以使用,td { display: block; }但这违反了使用表的目的。

您可以使用 table { table-layout: fixed; }但也许您希望某些列的行为有所不同。

因此,实现所需目标的最佳方法是将文本包装在中,<div>然后将CSS应用于上<div>(而不是<td>),如下所示:

td {
  border: 1px solid black;
}
td > div {
  width: 50px;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

2
这是我见过的最简单的方法,它实际上在IE8中有效。
基思·凯特勒

2
实际上,这是我在表格中的省略号上看到的最佳解决方案。
memberound's

41

尝试使用max-width代替width,表格仍会自动计算宽度。

即使在ie11(使用ie8兼容模式)下也可以使用。

td.max-width-50 {
  border: 1px solid black;
  max-width: 50px;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
<table>
  <tbody>
    <tr>
      <td class="max-width-50">Hello Stack Overflow</td>
    </tr>
    <tr>
      <td>Hello Stack Overflow</td>
    </tr>
    <tr>
      <td>Hello Stack Overflow</td>
    </tr>
  </tbody>
</table>

jsfiddle


1
发现得好。最好同时使用两者,以使元素为固定宽度。否则,如果内容允许,它可能会更短。
LSerni

比展示骇客更好 带桌子边框的displayhack螺丝。
查理

21

演示页面

对于具有动态宽度的表,我发现以下方法可以产生令人满意的结果。每个<th>希望具有修剪文本功能的人都应该有一个内部包装元素,用于包装<th>允许text-overflow工作的内容。

真正的诀窍是max-width<th>)的vw单位

这将有效地导致元素的宽度“绑定”到视口宽度(浏览器窗口),并导致响应内容裁剪。将vw单位设置为所需的令人满意的值。

最低CSS:

th{ max-width:10vw; }
      
th > .wrap{ 
   text-overflow:ellipsis;
   overflow:hidden;
   white-space:nowrap;
}

这是一个可运行的演示:

table {
  font: 18px Arial;
  width: 40%;
  margin: 1em auto;
  color: #333;
  border: 1px solid rgba(153, 153, 153, 0.4);
}

table td, table th {
  text-align: left;
  padding: 1.2em 20px;
  white-space: nowrap;
  border-left: 1px solid rgba(153, 153, 153, 0.4);
}

table td:first-child, table th:first-child {
  border-left: 0;
}

table th {
  border-bottom: 1px solid rgba(153, 153, 153, 0.4);
  font-weight: 400;
  text-transform: uppercase;
  max-width: 10vw;
}

table th > .wrap {
  text-overflow: ellipsis;
  overflow: hidden;
  white-space: nowrap;
}
<table>
    <thead>
        <tr>
            <th>
                <div class="wrap" title="Some long title">Some long title</div>
            </th>
            <th>
                <div class="wrap">Short</div>
            </th>
            <th>
                <div class="wrap">medium one</div>
            </th>
            <th>
                <div class="wrap" title="endlessly super long title which no developer likes to see">endlessly super long title which no developer likes to see</div>
            </th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>-</td>
            <td>-</td>
            <td>-</td>
            <td>very long text here</td>
        </tr>
    </tbody>
</table>


3

仅当我遇到这个问题时才提供替代方法,这里的其他答案都没有达到我想要的效果。因此,我改用了一个列表。现在从语义上讲,我正在输出的信息既可以视为表格数据,也可以视为列出的数据。

所以最后我做了:

<ul>
    <li class="group">
        <span class="title">...</span>
        <span class="description">...</span>
        <span class="mp3-player">...</span>
        <span class="download">...</span>
        <span class="shortlist">...</span>
    </li>
    <!-- looped <li> -->
</ul>

所以基本上ultablelitrspantd

然后在CSS中,我将span元素设置为display:block;float:left;(我更喜欢这种组合,inline-block因为它可以在IE的较早版本中使用,以清除浮动效果,请参见:http : //css-tricks.com/snippets/css/clear- fix /)并包含椭圆:

span {
    display: block;
    float: left;
    width: 100%;

    // truncate when long
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

然后,您要做的就是设置max-widths跨度,这将使列表看起来像一张桌子。


您可以在TD内应用ul <td><ul>...</ul></td>吗(例如)?它似乎对我不起作用:(
萨姆

2

我没有使用省略号来解决文本溢出的问题,而是发现禁用和样式化的输入看起来更好,并且仍然允许用户根据需要查看和选择整个字符串。

<input disabled='disabled' style="border: 0; padding: 0; margin: 0" />

它看起来像一个文本字段,但是可以突出显示,因此更加用户友好


2
它不是用户友好的,因为使用辅助技术将其误读为输入,因此用户认为他可以输入某些内容。滥用元素的语义是非常不好的。
卡罗

天哪,这太聪明了!由于它是表格的一部分,因此只需将输入设置为无边界且透明背景即可。我喜欢这个解决方案!
山姆


0

保持桌子原样。只需使用应用了截断CSS的跨度将内容包装在TD内即可。

/* CSS */
.truncate {
    width: 50px; /*your fixed width */
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    display: block; /* this fixes your issue */
}

<!-- HTML -->
<table>
    <tbody>
        <tr>
            <td>
                <span class="truncate">
                    Table data to be truncated if it's too long.
                </span>
            </td>
        </tr>
    </tbody>
</table>

我试过了,它在DataTables.net上不起作用。任何想法?
山姆

-2

如果您不想将max-width设置为td(如此答案所示),则可以将max-width设置为div:

function so_hack(){}

function so_hack(){} http://jsfiddle.net/fd3Zx/754/ function so_hack(){}

function so_hack(){}

注意:100%不起作用,但99%可以实现FF中的技巧。其他现代浏览器不需要愚蠢的div hack。

td {
  边框:1px纯黑色;
    padding-left:5px;
    padding-right:5px;
}
td> div {
    最大宽度:99%;
    溢出:隐藏;
    文字溢出:省略号;
    空白:nowrap;

}
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.