161

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

$(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,省略号不出现。

我在这里想念什么?

4

12 回答 12

108

显然,添加:

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

也解决了这个问题。


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

于 2012-04-29T13:25:56.913 回答
92

放上去也很重要

table-layout:fixed;

在包含表上,因此它在 IE9 中也能正常运行(如果您使用最大宽度)。

于 2012-10-11T12:05:50.693 回答
84

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

您可以使用table { table-layout: fixed; },但也许您希望它对某些列表现不同。

因此,实现您想要的最佳方法是将文本包装在 a 中<div>并将您的 CSS 应用于<div>(而不是<td>),如下所示:

td {
  border: 1px solid black;
}
td > div {
  width: 50px;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
于 2014-02-26T12:54:10.403 回答
45

尝试使用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

于 2012-04-29T13:11:21.080 回答
26

演示页面

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

真正的诀窍是以单位设置max-width(在 上<th>)。vw

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

最小的 CSS:

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

演示(带有可编辑文本):

document.designMode="on"
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>

于 2016-04-21T10:17:51.110 回答
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;and 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你的跨度,这将使列表看起来像一个表格。

于 2014-11-15T16:59:39.437 回答
2

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

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

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

于 2015-09-03T09:11:02.370 回答
1

检查元素box-sizing的 css 属性。我对将其设置为值td的 css 模板有问题。border-box你需要设置box-sizing: content-box

于 2016-09-26T13:06:22.517 回答
1

我已经尝试了许多上述解决方案,但没有一个感到灵活或令人满意。

这个 max-width: 1px 的小技巧可以直接应用于 td 元素

.truncated-cell {
   max-width: 1px;
   white-space: nowrap;
   overflow: hidden;
   text-overflow: ellipsis;
 }
于 2020-08-06T13:59:26.597 回答
0

让你的桌子保持原样。只需使用应用了截断 CSS 的 span 将内容包装在 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>
于 2019-01-16T21:46:56.300 回答
0
.ellipsis {
  overflow: hidden;
  text-overflow: ellipsis;
  display: -webkit-box;
  -webkit-line-clamp: 1;
  -webkit-box-orient: vertical;
}

上述设置对我有用,无需更改表格宽度。我在里面添加了一个 div 并在其中添加了类省略号。

于 2021-07-30T06:22:09.760 回答
-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纯黑色;
    填充左:5px;
    填充右:5px;
}
td>div{
    最大宽度:99%;
    溢出:隐藏;
    文本溢出:省略号;
    空白:nowrap;

}
于 2015-04-08T21:00:52.380 回答