CSS text-overflow in a table cell?
我想在表格单元格中使用css
我试过这个:
1 2 3 4 5 | td { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } |
但是,
- 表格单元格不能很好地处理
overflow 。尝试在单元格中放置一个DIV并设置该DIV的样式。
要在文本溢出表单元格时用省略号剪切文本,需要在每个
1 2 3 4 5 6 | td { max-width: 100px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } |
对于响应式布局,使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 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的呈现问题。
1 2 3 4 5 6 7 8 | <!--[if IE]> <style> table { table-layout: fixed; width: 100px; } </style> <![endif]--> |
- +1工作得很好,没有额外的标记jsfiddle.net/rbths/42
- 该表还需要一个宽度才能在ie.jsfiddle.net/rbths/69中工作。
- @Trevor Dixon谢谢Trev,没有注意到这是一个要求,但在我的正常代码中。
- 这里也值得一看:stackoverflow.com/a/10372455/114029
- 它也适用于
display: table-cell ! - 谢谢!工作很棒!
- @关于IE的问题,你能提供一个阅读链接吗?或者解释一下发生了什么事
- @Olga旧IE通常呈现不同于其他呈现引擎。它似乎需要宽度属性,而不考虑最大宽度属性
- 还可以考虑用一个DIV标记包装td中的内容,然后将限制CSS的文本流应用到该DIV,这为我提供了所需的功能。
- @TFD很好,我一直在努力工作,而且非常简单,THX很多。
- 如果设置
width: 100%; 和min-width: 1px; ,单元格将始终尽可能宽,并且仅在需要时(而不是当元素宽度达到一定大小时)使用省略号截断文本,这对于响应布局非常有用。 - @Ozrentkalceckrznaric确实在
display: table-cell 上工作,但当max-width 以百分比(%)定义时则不工作。在FF 32上进行测试 - (上一步)如果您使用的是%值,那么只有在元素上使用
table-layout: fixed 和display: table 才能实现这个技巧。 - 要在
响应的情况下稍微扩展一点:从所有单元格或列中删除 width: 100% ,将table-layout: fixed; width: 100% 添加到元素,然后只指定宽度到
元素,您希望不超过该宽度。没有为应尽可能宽的列指定宽度。 - 如果您希望在像引导响应表这样的响应方式上自动分配列的宽度,该怎么办?设置一个最大宽度会妨碍这一点。有解决办法吗?
- 查看stackoverflow.com/questions/17345158/&hellip;可以将最大宽度减少到1倍。
- 江户十一〔12〕在江户十一〔13〕为我工作。
- 谢谢。它像魔术一样工作。我刚刚错过了最大宽度:0;
- 江户十一〔十二〕耍了这个花招!多谢!
- 这是一个具有3列的完整工作示例:jsfiddle.net/5jsfr2p1/1
指定
max-width 或固定宽度并不适用于所有情况,而且表格应该是流动的,并且自动调整单元格的间距。这就是桌子的用途。使用:http://jsfiddle.net/maruxa1j/
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17<td class="ellipsis"><span>This Text Overflows and is too large for its cell.</span></td>
.ellipsis {
position: relative;
}
.ellipsis:before {
content: ' ';
visibility: hidden;
}
.ellipsis span {
position: absolute;
left: 0;
right: 0;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}适用于IE9和其他浏览器。
- 注:该溶液将细胞内容物包裹在
元素中。 - 这是一个非常聪明的解决方案,适用于我需要的所有表。但是,如果不希望所有表格单元格的宽度相同,则需要设置宽度。
- 当没有固定的宽度时,此解决方案最有效。真的很聪明!
- 当其他解决方案如
display: block 没有时,这样可以保持垂直对齐。 - 事件最小宽度工作。做得好!
- 最简单的解决方案!很有创意。非常感谢。
为什么会这样?
w3.org上的这一节似乎建议文本溢出仅适用于块元素:
1
2
3
4
5
6
7
8
911.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 specifiedMDN也这么说。
这个jfiddle有您的代码(经过一些调试修改),如果它应用于
div 而不是td ,它就可以正常工作。它还有我能快速想到的唯一解决方法,将td 的内容包装在一个包含div 的块中。但是,在我看来,这看起来像"丑陋的"标记,所以我希望其他人有更好的解决方案。测试此项的代码如下所示:1
2
3
4
5
6
7td, div {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
border: 1px solid red;
width: 80px;
}1
2
3
4
5Works, but no tables anymore:
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.
Works, but non-semantic markup required:
<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></tr></table>- 很好,谢谢。我无法从标记中删除表格单元格,所以我只是将内容包装在div中(将其宽度设置为单元格的宽度),并将溢出应用到那里。工作得很有魅力!
- 实际答案在这一页的底部…
如果不想将固定宽度设置为任何值下面的解决方案允许表单元格内容很长,但不能影响父表的宽度,也不能影响父行的高度。例如,如果您希望有一个带有
width:100% 的表,该表仍将自动调整大小功能应用于所有其他单元格。在带有"注释"或"注释"列的数据网格中很有用。将这3条规则添加到您的CSS中:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30.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格式:
1
2
3
4
5
6
7<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/
- 最有用的答案是,动态省略号非常棒。
- 它扰乱了每个列的选定宽度限制,例如,如果您为
max-width: X 定义了一些列,那么它们现在可以更宽--我认为这是因为display: flex 正在使用,但是我删除了它,没有看到任何区别…
如果您在
table 元素上指定table-layout: fixed; ,那么您的td 样式将生效。不过,这也会影响单元格的大小。SitePoint在这里讨论了一些表布局方法:http://reference.sitepoint.com/css/tableformatting
- 当您不想指定表的宽度时,这应该是正确的答案。
如果只想自动布局表格不使用
max-width 或百分比列宽,或table-layout: fixed 等。https://jsfiddle.net/tturadqq/
它是如何工作的:
步骤1:让表自动布局完成它的工作。
当有一列或多列包含大量文本时,它将尽可能缩小其他列,然后将长列的文本换行:
步骤2:将单元格内容包装在一个DIV中,然后将该DIV设置为
max-height: 1.1em 。(额外的0.1em用于在文本基础下呈现一点的字符,如"g"和"y"的尾部)
第三步:将
title 放在沙发床上这对易接近性很好,对于我们稍后将使用的小技巧是必要的。
第四步:在DIV上增加一个css
::after 。这是个棘手的问题。我们用
content: attr(title) 设置了一个css::after ,然后把它放在DIV的顶部,设置text-overflow: ellipsis 。我把它染成了红色以使它清晰可见。(注意长列现在有一个尾随省略号)
步骤5:将DIV文本的颜色设置为
transparent 。我们完了!
- 这是一个很棒的完美解决方案!我想知道为什么这会得到否定票而不是多数赞成票!!
- 谢谢你!
- 真棒,男人!(@user9645-不对:让它处理用vue.js呈现的表-确保将标题放在DIV上,而不是TD上)
- @克里斯蒂亚诺皮茨-是的,我一定是把事情搞砸了……已重试,正在运行。
- 我注意到在表单元内使用
而不是 时,这种方法失败了。添加 word-break: break-all; 解决了这个问题。示例:jsfiddle.net/de0bjmqv - 太好了。你甚至不需要在单元格中有相同的文本(标题足够了),然后你不需要最大高度:1.1米等等-你只需要位置:相对;。
- 我甚至可以得到一个没有标题/后技巧的工作示例,只使用div,通过对它们应用类似的样式。基蒂尔·汉森也这么做了,见下面他的回答。
如果是百分比表格宽度,或者不能在表格单元格上设置固定宽度。您可以应用
table-layout: fixed; 使其工作。1
2
3
4
5
6
7
8
9
10table {
table-layout: fixed;
width: 100%;
}
td {
text-overflow: ellipsis;
white-space: nowrap;
overflow: hidden;
border: 1px solid red;
}1
2
3
4
5
6<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>在flex块中包装单元格内容。另外,单元格自动适应可见宽度。
1
2
3
4
5
6
7
8
9
10
11
12
13
14table {
width: 100%;
}
div.parent {
display: flex;
}
div.child {
flex: 1;
width: 1px;
overflow-x: hidden;
text-overflow: ellipsis;
}1
2
3
4
5
6
7
8
9
10
11<table>
<tr>
<td>
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
</td>
</tr>
</table>- 我还得把
white-space: nowrap; 添加到child 类中。
我使用单元格内绝对定位的DIV(relative)解决了这个问题。
1
2
3
4
5
6
7
8
9
10td {
position: relative;
}
td > div {
position: absolute;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
max-width: 100%;
}就是这样。然后,您可以向DIV添加一个top:value或将其垂直居中:
1
2
3
4
5
6td > div {
top: 0;
bottom: 0;
margin: auto 0;
height: 1.5em; // = line height
}要在右侧获得一些空间,可以稍微减小最大宽度。
- 使用JS小提琴会很好,就像这个流行问题的许多其他答案一样。
- 是的,这很有效,但是我对div使用了一些不同的样式:左:0;上:0;右:0;下:0;padding:2px;为了得到正确的位置,并使用与表单元格中相同的padding。
这是在IE9中工作的版本。
http://jsfiddle.net/s27gf2n8/
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16<table style="width: 100%; table-layout: fixed;">
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.
</table>
Top right Cell.
<table style="width: 100%; table-layout: fixed;">
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.
</table>
Bottom right cell.- a作为
的直接子级?这似乎不对!
- @Michiel Fyi-浏览器可以处理表标记下的div。
Copyright © 码农家园 联系:[email protected]