我正在使用flexbox在窄列中显示文本标签和数值,以便在文本不符合的情况下使用省略号截断文本。
它工作正常,直到我需要将整个列放在表格单元格中 - 此时浏览器(Chrome)忽略了列宽并使表格足够宽以适合所有文本。
这是标签布局:
<div class="line">
<span>Very long label text</span>
<span>12345</span>
</div>
.line {
display: flex;
width: 100%;
}
.line span:first-child {
white-space: nowrap;
flex-grow: 1;
overflow: hidden;
text-overflow: ellipsis;
}
.line span:last-child {
flex-shrink: 0;
margin-left: 5px;
}
将其放置在具有固定宽度的常规div中按预期工作。将它放在表格单元格中不会:
小提琴:http://jsfiddle.net/98o7m7am/
.wrapper {
width: 150px;
}
.table {
display: table;
}
.table > div {
display: table-cell;
}
.line {
display: flex;
width: 100%;
}
.line span:first-child {
white-space: nowrap;
flex-grow: 1;
overflow: hidden;
text-overflow: ellipsis;
}
.line span:last-child {
flex-shrink: 0;
margin-left: 5px;
}
<div class="wrapper">
<div class="line">
<span>Very long label text</span>
<span>12345</span>
</div>
</div>
<div class="table wrapper">
<div>
<div class="line">
<span>Very long label text</span>
<span>12345</span>
</div>
</div>
</div>
更新:我最后通过使用更多的flexbox而不是表来“解决”这个问题,但我仍然想知道为什么原始示例不起作用。
答案 0 :(得分:18)
这是因为默认情况下,表格使用automatic table layout:
CSS 2.1规范没有定义布局模式,但提出了一种(非规范)算法,它反映了几种流行的HTML用户代理的行为。
根据该算法,表width
将仅被视为最小宽度,实际宽度将足以使内容不会溢出:
计算每个单元格的最小内容宽度(MCW):格式化 内容可能跨越任意数量的行但可能不会溢出单元格 框。
由于您有white-space: nowrap
,因此MCW将是全文的宽度。
为避免这种情况,您可以将第一个跨度的初始宽度设置为0:
.line span:first-child {
width: 0;
}
.wrapper {
width: 150px;
}
.table {
display: table;
}
.table > div {
display: table-cell;
}
.line {
display: flex;
width: 100%;
}
.line span:first-child {
width: 0;
white-space: nowrap;
flex-grow: 1;
overflow: hidden;
text-overflow: ellipsis;
}
.line span:last-child {
flex-shrink: 0;
margin-left: 5px;
}
&#13;
<div class="wrapper">
<div class="line">
<span>Very long label text</span>
<span>12345</span>
</div>
</div>
<div class="table wrapper">
<div>
<div class="line">
<span>Very long label text</span>
<span>12345</span>
</div>
</div>
</div>
&#13;
或者,您可能想要尝试fixed table mode,它在规范中正确定义(因此更可靠),通常更快,并且也解决了问题。
table-layout: fixed;
.wrapper {
width: 150px;
}
.table {
display: table;
table-layout: fixed;
}
.table > div {
display: table-cell;
}
.line {
display: flex;
width: 100%;
}
.line span:first-child {
white-space: nowrap;
flex-grow: 1;
overflow: hidden;
text-overflow: ellipsis;
}
.line span:last-child {
flex-shrink: 0;
margin-left: 5px;
}
&#13;
<div class="wrapper">
<div class="line">
<span>Very long label text</span>
<span>12345</span>
</div>
</div>
<div class="table wrapper">
<div>
<div class="line">
<span>Very long label text</span>
<span>12345</span>
</div>
</div>
</div>
&#13;