表格单元格中的CSS文本溢出?


499

我想text-overflow在表格单元格中使用CSS ,这样,如果文本太长而无法放在一行上,它将用省略号进行剪切,而不是换成多行。这可能吗?

我尝试了这个:

td {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

但是,white-space: nowrap似乎使文本(及其单元格)不断向右扩展,从而使表格的总宽度超出了其容器的宽度。但是,如果没有它,文本在到达单元格边缘时会继续换行。


9
表格单元不能overflow很好地处理。尝试在单元格中放置一个div并设置该div的样式。
李斯特先生,2012年

Answers:


897

要在表格单元溢出时用省略号剪切文本,您需要max-width在每个td类上设置CSS属性,以使溢出起作用。不需要额外的布局div

td {
    max-width: 100px;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

对于响应式布局;使用max-widthCSS属性指定列的有效最小宽度,或仅max-width: 0;用于无限的灵活性。此外,包含表将需要特定的宽度,通常为width: 100%;,列的宽度通常设置为总宽度的百分比

table {
    width: 100%;
}
td {
    max-width: 0;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}
td.columnA {
    width: 30%;
}
td.columnB {
    width: 70%;
}

历史记录:对于IE 9(或更低版本),您需要在HTML中包含它,以解决特定于IE的呈现问题

<!--[if IE]>
<style>
    table {
        table-layout: fixed;
        width: 100px;
    }
</style>
<![endif]-->

7
该表还需要一个宽度才能在IE中工作。jsfiddle.net/rBthS/69
Trevor Dixon

1
如果进行设置width: 100%;min-width: 1px;则单元格将始终尽可能宽,并且仅在需要时才使用省略号截断文本(而不是在元素宽度达到特定大小时截断)-这对于响应式布局非常有用。
Duncan Walker 2014年

2
@OzrenTkalcecKrznaric display: table-cell确实可以使用,但是当max-width以百分比(%)定义时则无效。测试于FF 32
Greg

14
(在上述内容之后),在使用%值的情况下,然后仅table-layout: fixed在with元素上使用display: table将达到目的
Greg

1
如果您希望以响应方式(例如引导响应表)自动分配列的宽度,该怎么办?设置最大宽度会干扰这一点。有解决方法吗?
嵌套

81

指定max-width宽度或固定宽度并非在所有情况下都适用,并且表格应该是流畅的并自动间隔其单元格。那就是表的用途。

使用此:http : //jsfiddle.net/maruxa1j/

HTML:

<td class="ellipsis">
    <span>This Text Overflows and is too large for its cell.</span>
</td>

CSS:

.ellipsis {
    position: relative;
}
.ellipsis:before {
    content: '&nbsp;';
    visibility: hidden;
}
.ellipsis span {
    position: absolute;
    left: 0;
    right: 0;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}

可在IE9和其他浏览器上使用。


注意:此解决方案将单元格内容包装在<span>元素中。
罗伊·廷克

2
这是一个非常聪明的解决方案,适用于我需要解决方案的所有表。但是,如果您不希望所有表格单元格都具有相同的宽度,则确实需要设置宽度。
凯文·比尔,2015年

当没有固定宽度时,此解决方案效果最佳。确实很聪明!
avidenic

1
当其他解决方案display: block没有这样做时,这将保持垂直对齐
j3ff

简直是有史以来最好的解决方案!相当巧妙。非常感谢。
ClownCoder

39

为什么会这样?

w3.org上的这一部分似乎建议文本溢出仅适用于块元素

11.1.  Overflow Ellipsis: the ‘text-overflow’ property

text-overflow      clip | ellipsis | <string>  
Initial:           clip   
APPLIES TO:        BLOCK CONTAINERS               <<<<
Inherited:         no  
Percentages:       N/A  
Media:             visual  
Computed value:    as specified  

MDN说了同样的

这个jsfiddle具有您的代码(进行了一些调试修改),如果将其应用于a div而不是,则可以正常工作td。通过将的内容包装td在一个包含div块中,它也是我能很快想到的唯一解决方法。但是,对我来说这看起来像“丑陋”的标记,因此我希望其他人有更好的解决方案。测试它的代码如下所示:

td, div {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  border: 1px solid red;
  width: 80px;
}
Works, but no tables anymore:
<div>Lorem ipsum and dim sum yeah yeah yeah. Lorem ipsum and dim sum yeah yeah yeah. Lorem ipsum and dim sum yeah yeah yeah. Lorem ipsum and dim sum yeah yeah yeah. Lorem ipsum and dim sum yeah yeah yeah.</div>

Works, but non-semantic markup required:
<table><tr><td><div>Lorem ipsum and dim sum yeah yeah yeah. Lorem ipsum and dim sum yeah yeah yeah. Lorem ipsum and dim sum yeah yeah yeah. Lorem ipsum and dim sum yeah yeah yeah. Lorem ipsum and dim sum yeah yeah yeah.</div></td></tr></table>


2
很好,谢谢。我无法从标记中删除表单元格,因此我只是将内容包装在div中(它们的宽度设置为单元格的宽度),然后在其中应用溢出。像魅力一样工作!
daGUY 2012年

28

如果您不想将固定宽度设置为任何值

下面的解决方案使您可以拥有较长的表格单元格内容,但不得影响父表的宽度或父行的高度。例如,您想拥有一个表格,width:100%并且该表格仍将自动调整大小功能应用于所有其他单元格。在带有“注释”或“注释”列或其他内容的数据网格中很有用。

在此处输入图片说明

将以下3条规则添加到CSS:

.text-overflow-dynamic-container {
    position: relative;
    max-width: 100%;
    padding: 0 !important;
    display: -webkit-flex;
    display: -moz-flex;
    display: flex;
    vertical-align: text-bottom !important;
}
.text-overflow-dynamic-ellipsis {
    position: absolute;
    white-space: nowrap;
    overflow-y: visible;
    overflow-x: hidden;
    text-overflow: ellipsis;
    -ms-text-overflow: ellipsis;
    -o-text-overflow: ellipsis;
    max-width: 100%;
    min-width: 0;
    width:100%;
    top: 0;
    left: 0;
}
.text-overflow-dynamic-container:after,
.text-overflow-dynamic-ellipsis:after {
    content: '-';
    display: inline;
    visibility: hidden;
    width: 0;
}

在任何要使动态文本溢出的表单元格中,将HTML格式设置为:

<td>
  <span class="text-overflow-dynamic-container">
    <span class="text-overflow-dynamic-ellipsis" title="...your text again for usability...">
      //...your long text here...
    </span>
  </span>
</td>

另外,将所需的min-width(或根本不使用)应用于表格单元。

当然是小提琴:https : //jsfiddle.net/9wycg99v/23/


最有用的答案是,动态省略号很棒。
lucifer63

它弄乱了每列的选定宽度限制,例如,如果您定义了一些列,max-width: X现在它们可以更宽-我认为这是因为display: flex使用了列,但我删除了它,没有区别...
user9645


20

如果您只是想要表格自动布局

使用max-width,或列宽百分比table-layout: fixed等。

https://jsfiddle.net/tturadqq/

怎么运行的:


步骤1:只需让表格自动布局即可。

当一个或多个列中包含大量文本时,它将尽可能缩小其他列,然后包装长列中的文本:

在此处输入图片说明


第2步:将单元格内容包装在div中,然后将该div设置为 max-height: 1.1em

(额外的0.1em用于在文本底部下方呈现一些字符的字符,例如'g'和'y'的尾部)

在此处输入图片说明


第3步:title在div上设置

这对可访问性有好处,对于我们稍后将使用的小技巧也是必需的。

在此处输入图片说明


步骤4:::after在div上添加CSS

这有点棘手。我们用设置CSS ::aftercontent: attr(title)然后将其放置在div顶部并进行设置text-overflow: ellipsis。为了清楚起见,我在这里将其涂成红色。

(请注意,长列现在具有尾部省略号)

在此处输入图片说明


步骤5:将div文本的颜色设置为 transparent

我们完成了!

在此处输入图片说明


2
这是很棒的完美解决方案!我不知道为什么这次投票否决而不是大多数投票!!
zendu

2
太棒了,伙计!(@ user9645-这是不对的:让它与使用Vue.js渲染的表一起使用-请确保将标题放在div上,而不是td上)
Christian Opitz

@ChristianOpitz-是的,我一定以某种方式弄乱了它...重试了它并且它正在工作。
user9645

我观察到,使用<a>而不是<div>内部表单元格时此方法失败。添加即可word-break: break-all;解决问题。示例:jsfiddle.net/de0bjmqv
zendu,

太好了 而且您甚至不必在单元格中具有相同的文本(标题就足够了),那么您就不需要max-height:1.1em等-div所需的全部就是position:relative;。
KS74

13

如果是百分比表格宽度,或者无法在表格单元格上设置固定宽度。您可以申请table-layout: fixed;使其生效。

table {
  table-layout: fixed;
  width: 100%;
}
td {
  text-overflow: ellipsis;
  white-space: nowrap;
  overflow: hidden;
  border: 1px solid red;
}
<table>
  <tr>
    <td>Lorem ipsum and dim sum yeah yeah yeah. Lorem ipsum and dim sum yeah yeah yeah. Lorem ipsum and dim sum yeah yeah yeah. Lorem ipsum and dim sum yeah yeah yeah. Lorem ipsum and dim sum yeah yeah yeah.</td>
    <td>Lorem ipsum and dim sum yeah yeah yeah. Lorem ipsum and dim sum yeah yeah yeah. Lorem ipsum and dim sum yeah yeah yeah. Lorem ipsum and dim sum yeah yeah yeah. Lorem ipsum and dim sum yeah yeah yeah.</td>
  </tr>
</table>


5

将单元格内容包装在flex块中。另外,单元格自动适合可见宽度。

table {
  width: 100%;
}

div.parent {
  display: flex;
}

div.child {
  flex: 1;
  width: 1px;
  overflow-x: hidden;
  text-overflow: ellipsis;
}
<table>
  <tr>
    <td>
      <div class="parent">
        <div class="child">
          xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
        </div>
      <div>
    </td>
  </tr>
</table>


3
我还必须添加white-space: nowrap;child课堂上。
罗斯·艾伦

3

我使用绝对定位的div(相对)来解决此问题。

td {
    position: relative;
}
td > div {
    position: absolute;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    max-width: 100%;        
}

而已。然后,您可以在div中添加top:值或将其垂直居中:

td > div {      
    top: 0;
    bottom: 0;
    margin: auto 0;
    height: 1.5em; // = line height 
}

要在右侧留出一些空间,可以稍微减小最大宽度。


使用JSFiddle会很好,因为这个受欢迎的问题还有许多其他答案。
OMA

是的,这可行,但是我为div使用了一些不同的样式:left:0; top:0; right:0; bottom:0; padding:2px; 以获得正确的位置,并具有与表格单元格相同的填充。
KS74

0

就我而言,这在Firefox和Chrome中都有效:

td {
  max-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  width: 100%;
}

-5

这是IE 9中可用的版本。

http://jsfiddle.net/s27gf2n8/

<div style="display:table; table-layout: fixed; width:100%; " >
        <div style="display:table-row;">
            <div style="display:table-cell;">
                <table style="width: 100%; table-layout: fixed;">
                    <div style="text-overflow:ellipsis;overflow:hidden;white-space:nowrap;">First row. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.</div>
                </table>
            </div>
            <div style="display:table-cell;">
                Top right Cell.
            </div>
        </div>
        <div style="display:table-row;">
            <div style="display:table-cell;">
                <table style="width: 100%; table-layout: fixed;">
                    <div style="text-overflow:ellipsis;overflow:hidden;white-space:nowrap;">Second row - Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.</div>
                </table>
            </div>
            <div style="display:table-cell;">
                Bottom right cell.
            </div>
        </div>
    </div>

6
一个<div>作为<table>的直接子代?这似乎不对!
米歇尔

@michiel仅供参考-浏览器可以处理表格标签下方的Div。
Ryan O'Connell
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.