inline-block元素设置overflow:hidden属性导致相邻行内元素向下偏移

在表单修改界面中常会使用一个标签、一个内容加一个修改按钮来组成单行界面,如下所示:

那么在表单总长度受限的情况下,当中间的邮箱名称过长时,会遮盖到旁边的按钮。

我们可以把中间邮箱设定最大宽度,然后对于长度超出部分设置overflow: hidden来解决这个问题。

但是这可能会引发另一个经典的 baseline 对齐问题,也就是本文要讨论的主要问题。

1. 问题现象

我们先给出一个在线实例:

http://wow.techbrood.com/fiddle/15438

我们可以看到当给中间的 inline-block 元素p添加overflow: hidden属性后,其左右相邻元素被奇怪的向下拉动了一定的距离。

2. 解决方法

常用的解决方法是为上述inline-block元素添加vertical-align: bottom。你可以在上面的例子中在线测试下。

3. 问题原因

W3的规范对此行为有明确规定:

The baseline of an ‘inline-block‘ is the baseline of its last line box in the normal flow, unless it has either no in-flow line boxes or if its ‘overflow‘ property has a computed value other than ‘visible‘, in which case the baseline is the bottom margin edge.

我们从规范中可以知道当一个inline-block元素被设置overflow非visible属性值后,其baseline将被强制修改为元素下外边沿。

我们知道默认情况下,baseline为字符x的底线位置且vertical-align属性值为baseline。

此外由于div包含块中只有行内级别的元素,所以将生成一个IFC(行内格式化上下文)来规定其中元素的渲染规则。

按照IFC布局规则,垂直方向上对齐遵照vertical-align属性(请参考阅读:http://techbrood.com/Guide/h5b2a?p=css-ifc),

那么p元素两边的2个匿名line box将被迫向下移动一个偏移值来和p元素对齐。

那么可能有人要进一步追问了,为什么W3要做如此奇怪的规定呢?

这是因为overflow被设置为非visible值,将使得该inline-block元素中的last line box的渲染处于不确定状态(浏览器可能渲染也可能不渲染),

这让保持默认规则的baseline也处于不确定状态,那么索性就规定以确定的下外边沿来作为baseline。

baseline
Align the baseline of the box with the baseline of the parent box. If the box does not have a baseline, align the bottom margin edge with the parent‘s baseline.
4. 偏移的计算

上述的向下偏移量,实际上就是inline-block元素的默认baseline和其下外边沿的距离。

shift = D(descent) part of Glyph(字母下降部分)+ bottom half-leading
5. 参考链接:

1. http://techbrood.com/Guide/h5b2a?p=css-line-height

2. http://www.w3.org/TR/CSS2/visudet.html#propdef-line-height

by iefreer

时间: 2024-11-03 20:49:40

inline-block元素设置overflow:hidden属性导致相邻行内元素向下偏移的相关文章

[Web 前端] inline-block元素设置overflow:hidden属性导致相邻行内元素向下偏移

cp from : https://blog.csdn.net/iefreer/article/details/50421025 在表单修改界面中常会使用一个标签.一个内容加一个修改按钮来组成单行界面,如下所示: 那么在表单总长度受限的情况下,当中间的邮箱名称过长时,会遮盖到旁边的按钮. 我们可以把中间邮箱设定最大宽度,然后对于长度超出部分设置overflow: hidden来解决这个问题. 但是这可能会引发另一个经典的 baseline 对齐问题,也就是本文要讨论的主要问题. 1. 问题现象

行内元素和块级元素的具体区别是什么?行内元素的padding和margin可设置吗?

块级元素(block)特性: 总是独占一行,表现为另起一行开始,而且其后的元素也必须另起一行显示; 宽度(width).高度(height).内边距(padding)和外边距(margin)都可控制; 内联元素(inline)特性: 和相邻的内联元素在同一行; 宽度(width).高度(height).内边距的top/bottom(padding-top/padding-bottom)和外边距的top/bottom(margin-top/margin-bottom)都不可改变(也就是paddin

css块级元素和行内元素详细解析

块级元素和行内元素是布局中常见的两种基本元素,但是未必有很多人深入的研究它们的细微差别. 常见块级元素:div  p  form ul ol li 等: 常见的行内元素:span stronh em; 它们的区别主要有以下几点: 1.块级元素独自占一行且宽度会占满父元素宽度,行内元素不会独占一行,相邻行内元素可以排在同一行. 如图: <head> <meta charset="UTF-8"> <title>测试</title> <s

CSS关于子元素设置了float属性后父元素高度为0的解释和解决方法

1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> 2 <html lang="en"> 3 <head> 4 <meta http-equiv="Content-Type" content="text/html;charset=UTF-8&q

块元素和行内元素之间的转换,overflow与visibility

<!doctype html><html lang="en"> <head> <meta charset="UTF-8"> <title>块元素和行内元素之间的转换,overflow与visibility</title> <style> a{ width:100px; height:100px; border:1px solid #000000; background:red; di

Web前端入门学习(4)—— 块级元素和行内元素之特征与转换

块级元素和行内元素  1.元素的定义 根据CSS规范的规定,每一个网页元素都有一个display属性,用于确定该元素的类型,每一个元素都有默认的display属性值,比如div元素,它的默认display属性值为"block",成为"块级"元素(block-level):而span元素的默认display属性值为"inline",称为"行内"元素.     div这样的块级元素,就会自动占据一定矩形空间,可以通过设置高度.宽度

14-块级元素和行内元素

学习的初期,我们就要知道,标准文档流等级森严.标签分为两种等级: 行内元素 块级元素 比如h1标签和span,同时设置宽高,来看浏览器效果,那么你会发现: 行内元素和块级元素的区别:(非常重要) 行内元素: 与其他行内元素并排: 不能设置宽.高.默认的宽度,就是文字的宽度. 块级元素: 霸占一行,不能与其他任何元素并列: 能接受宽.高.如果不设置宽度,那么宽度将默认变为父亲的100%. 块级元素和行内元素的分类: 在以前的HTML知识中,我们已经将标签分过类,当时分为了:文本级.容器级. 从HT

行内元素和块级元素的区别

一.行内元素和块级元素的区别 1. 行内元素不会占据整行,在一条直线上排列,都是同一行,水平方向排列: 块级元素会占据一行,垂直方向排列. 2. 块级元素可以包含行内元素和块级元素:行内元素不能包含块级元素. 3. 行内元素与块级元素属性的不同,主要是盒模型属性上,行内元素设置width无效,height无效(可以设置line-height),margin上下无效,padding上下无效. 二.行内元素和块级元素的相互转换 行内元素转化为块元素: display:block; 块元素转化为行内元

块级元素和行内元素的区别

1.块级元素可以设置宽度和高度属性,而行内元素不行: 2.块级元素:display:block; 而行内元素:display:inline; 3.块级元素可以设置margin.padding,而行内元素水平方向margin-left.margin-right.padding-left和padding-right可以有效,竖直方向上的margin-top.margin-bottom.padding-top和padding-bottom不能生效: 4.块级元素可以独占一行,而行内元素不会独占一行.