我最近偶然发现了一个问题,其中有人试图在其标题上获得正确的后退行为。像这样:
它们的实现在不同的标题中产生了不同的结果,因此问题。使用table
表示元素,table-cell
表示:before
和:after
,实现非常奇怪。由此产生的行为对我来说非常令人惊讶。我在jsfiddle上做了一个测试,看看。
你会看到我有两节课; a
和b
,前者的宽度为25%,后者的宽度为40%。尽管如此,b
比a
宽近5倍。将它们分别设置为40%和45%会使b
成为a
的两倍。这只是5%的差异,这是完全出乎意料的行为。文本的长度似乎也会影响到这一点。
我知道这个实现很糟糕,它会“破坏”。但是,我想知道为什么它打破了它的方式。这对我来说毫无意义。
div {
display: table;
background: grey;
margin: 10px 0;
}
div:before,
div:after {
width: 25%;
position: relative;
content: '';
border-top: 2px solid black;
display: table-cell;
}
div.b:before,
div.b:after {
width: 45%;
}
<div class="a">text</div>
<div class="a">some more text</div>
<div class="b">text</div>
<div class="b">some more text</div>
答案 0 :(得分:3)
标准没有指定自动表格布局,因此我建议不要使用这种百分比技巧,这可能会在某些浏览器中出现。
但是,似乎大多数浏览器的行为都是这样的:
::before
和::after
伪元素将占用表格的指定百分比。因此,如果您有width: 25%
,则文本将采用剩余的50%
。
tablewidth = textwidth / 50% = 2 * textwidth
pseudowidth = 25% * tablewidth = 0.5 * textwidth
如果您有width: 40%
,则文本将采用剩余的20%
。
tablewidth = textwidth / 20% = 5 * textwidth
pseudowidth = 40% * tablewidth = 2 * textwidth
如果您有width: 45%
,则文本将采用剩余的10%
。也就是说,如果文本相同,表格的宽度将相对于前一种情况加倍。
tablewidth = textwidth / 10% = 10 * textwidth
pseudowidth = 45% * tablewidth = 4.5 * textwidth
当然,如果如上所述计算的所需表格宽度超过包含块,则事情开始变得棘手。然后
文本单元格将具有解析伪元素留下的剩余百分比的宽度。这将小于文本的首选宽度,因此文本将换行多行。
但是,文本单元格不会比文本的最小所需宽度窄。这通常是最长字的宽度,但可能由于例如word-break: break-all
或white-space: nowrap
。
文本留下的剩余空间将平均分配在伪元素中。
如果剩余空间为负,则伪元素将具有0宽度,并且表将增长(溢出包含块)以补偿该值。