一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第1天,点击查看活动详情。
当你的页面 HTML 结构长这个样子,
<div id="box">
<p>
<span>这是一段超过一定长度就会显示省略号的文字</span>
<span>看这里</span>
</p>
</div>
你想要实现超出长度显示省略号。这个时候你上网一顿百度,写下了这么一段样式。
#box p {
width: 800px;
font-size: 30px;
}
#box p span {
display: inline-block;
}
#box p span:nth-child(1) {
max-width: 350px;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
实现了吗?实现了,但又不完全实现。你发现,这个元素出现了位置偏出。
一个父元素(块级元素)中有几个在同一水平线上的几个元素(行内块元素),设置其中某个元素的oveflow:hidden之后,会导致这几个行内块元素不再是同一水平线上对齐。
然后你又一通百度,发现解决方法。
-
设置行内块元素对齐方式:
vertical-align: top/bottom;#box p span { display: inline-block; vertical-align: top; } -
设置行内块元素的 overflow 不为 visible;
#box p span { display: inline-block; overflow: hidden/auto/scroll; } -
设置 flex 布局
#box p { width: 800px; font-size: 30px; display: flex; } -
为行内块元素设置 float 属性
#box p span { display: inline-block; float: left; }
原因是:行内块元素的默认对齐方式是基线对齐即(vertical-align:baseline),设置overflow不为visible之后改变了它的默认对齐方式为下边距边缘。但是其他行内块元素依然还是基线对齐就会出现下沉的视觉效果。
W3的解释:当一个行内块元素被设置overflow不为visible属性值后,其baseline将被强制修改为元素下外边沿。
默认情况下,baseline为字符x的底线位置且vertical-align属性值为baseline。
由于div包含块中只有行内级别的元素,所以将生成一个IFC(行内格式化上下文)来规定其中元素的渲染规则。根据IFC布局的规则,垂直方向上对齐遵照vertical-align属性。
为什么W3要做如此奇怪的规定呢?
这是因为 overflow 被设置为非 visible 值,将使得该 inline-block 元素中的last line box的渲染处于不确定状态(浏览器可能渲染也可能不渲染),
这让保持默认规则的baseline也处于不确定状态,那么索性就规定以确定的下外边沿来作为baseline。