第5章 内联元素与流
# 第5章 内联元素与流
# 字母x
# 字母x
与CSS世界的基线
字母x
的下边缘(线)就是基线。
# 字母x
与CSS中的x-height
x-height
指的是字母x
的高度。
vertical-align:middle;
的middle
指的是基线网上1/2 x-height
高度。
# 字母x
与CSS中的ex
ex
是CSS中的一个相对单位,指的是小写字母x
的高度,即x-height
。
ex
的作用是不受字体和字号影响的内联元素的垂直居中对齐效果。
内联元素默认是基线对齐,而基线就是x
的底部,而1ex
就是一个x
的高度。
文字与小三角图标
See the Pen 文字与小三角图标 by whjin (@whjin) on CodePen.
# 内联元素的基石line-height
# 内联元素的高度之本——line-height
**div
高度是行高line-height
决定的,而非文字。**对于非替换元素的纯内联元素,其可视高度完全由line-height
决定。
行距=line-height
-font-size
。em
是一个相对font-size
大小的CSS单位,因此1em
等于当前一个font-size
大小。
See the Pen 半行间距 by whjin (@whjin) on CodePen.
line-height
不会影响替换元素。图片为内联元素,会构成一个“行框盒子”,而在HTML5下,每一个“行框盒子”的前面都是一个宽度为0
的“幽灵空白节点”,其内联特性表现和普通字符完全一样。
对于块级元素,line-height
对其本身没有任何作用,改变line-height
,块级元素的高度跟着变化实际上是通过改变块级元素里面内联元素占据的高度实现。
# 为什么line-height
可以让内联元素“垂直居中”
行高实现多行文本或图片等替换元素的垂直居中效果
See the Pen 行高与多行文字垂直居中 by whjin (@whjin) on CodePen.
# 深入line-height
的各类属性值
line-height
的默认值是normal
,还支持数值、百分比值以及长度值。
在实际开发中,需要对line-height
的默认值进行重置:
- 数值。计算方法
line-height
=1.5*font-size
- 百分比值。
line-height
=150%*font-size
- 长度值。
line-height
=1.5*font-size
- 制作一个图文内容比较多的网站,使用数值作为单位,
line-height
值可以设置在1.6~1.8
。 - 偏重布局结构的网站,使用长度值或数值都可以,
line-height
值可以设置在20px
。
# 内联元素line-height
的“大值特性”
无论内联元素line-height
如何设置,最终父级元素的高度都是由数值大的那个line-height
决定,称之为内联元素line-height
的“大值特性”
每个内联盒子外层都有一个看不见的行框盒子,在每个行框盒子前面都有一个宽度为0
的具有该元素的字体和行高属性的看不见的幽灵空白节点。
# line-height
的好朋友vertical-align
凡是line-height
起作用的地方vertical-align
也一定起作用。
# vertical-align
家族基本认识
vertical-align
属性值分为以下4类:
- 线类。
baseline
默认值、top
、middle
、bottom
- 文本类。
text-top
、text-bottom
- 上标下标类。
sub
、super
- 数值百分比类。
20px
、2em
、20%
等,正值往上偏移,负值往下偏移。
vertical-align
的默认值是baseline
,即基线对齐,而基线的定义是字母x
的下边缘。因此,内联元素默认都是沿着字母x
的下边缘对齐。
See the Pen vertical-align数值-文字与图标垂直居中 by whjin (@whjin) on CodePen.
margin/padding
是相对于宽度计算,line-height
是相对于font-size
计算,vertical-align
属性的百分比值是相对于line-height
计算。
# vertical-align
作用前提
vertical-align
作用前提条件:只能应用于内联元素以及display
值为table-cell
的元素。也就是只能作用在display
计算值为inline
、inline-block
、inline-table
、inline-cell
的元素上。
块级元素不支持。浮动元素和绝对定位会让元素块状化,从而导致vertical-align
不起作用。
# vertical-align
和line-height
之间的关系
See the Pen 解决内联元素“幽灵空白节点” by whjin (@whjin) on CodePen.
解决图片底部留有间隙的问题
消除间隙的方法,从幽灵空白节点、line-height
和vertical-align
入手:
- 图片块状化。
- **容器
line-height
足够小。**比如容器设置line-height:0;
- 容器
font-size
足够小。 - 图片设置其他
vertical-align
属性值。间隙产生的原因之一就是基线对齐,所以设置vertical-align
的值为top/bottom/middle
其中一个。
# 深入理解vertical-align
线性类属性值
# 1. inline-block
与baseline
一个inline-block
元素,如果里面没有内联元素,或者overflow:visible
,则该元素的基线就是其margin
底边缘;否则其基线就是元素里面最后一行内联元素的基线。
See the Pen inline-block与baseline by whjin (@whjin) on CodePen.
没有内联元素,基线就是容器的margin
下边缘,即下边框下面的位置;有内联元素,基线就是字符的下边缘。
字符实际占据的高度是由line-height
决定,当line-height
变为0
时,字符占据的高度也是0
,此时高度的起始位置就变成字符内容区域的垂直中心位置。
解决间隙问题的方法
- 改变占位
<i>
元素的基线; - 改造幽灵空白节点的基线位置;
- 使用其他
vertical-align
对齐方式。
改造幽灵空白节点的基线位置可以使用font-size
,当字体足够小时(设为0
),基线和中线会重合在一起。
基于
20px
图标对齐的处理技巧
- 图标高度和当前行高都是
20px
。 - 图标标签里面永远有字符。借助
:before
和:after
伪元素生成一个空格字符。 - 图标CSS不适用
overflow:hidden;
保证基线为里面字符的基线,但是需要让里面潜在的字符不可见。
See the Pen 图标文字对齐 by whjin (@whjin) on CodePen.
# 2. vertical-align:top/bottom
- 内联元素:元素底部和当前行框盒子的顶部对齐。
table-cell
元素:元素底padding
边缘和表格行的顶部对齐。
# 3. vertical-align:middle
与近似垂直居中
- 内联元素:元素的垂直中心点和行框盒子相对于外面的表格行居中对齐。
table-cell
元素:单元格填充盒子相对于外面的表格行居中对齐。
# 深入理解vertical-align
文本类属性值
vertical-align:text-top
:盒子的顶部和父级内容区域的顶部对齐。vertical-align:text-bottom
:盒子的底部和父级内容区域的底部对齐。
- 文本类属性值的垂直对齐与左右文字大小和高度都没有关系,而所有线性类属性值的定位都会受到兄弟内联元素的影响。
- 文本类属性值的垂直对齐可以像素级精确控制。如果是图文对齐,可以通过改变父元素的
font-size
大小精确控制对齐位置;如果是文字之间对齐,可以通过改变文字的line-height
,也就是改变元素的高度(上下边缘位置)精确控制对齐位置。
# 简单了解深入理解vertical-align
线性类属性值上标下标类属性值
vertical-align
线性类属性值上标下标类属性值指的是sub
和super
两个值。
vertical-align:super
:提高盒子的基线到父级合适的上标基线位置。vertical-align:sub
:降低盒子的基线到父级合适的下标基线位置。
# 无处不在的vertical-align
# 基于vertical-align
属性的水平垂直居中弹框
使用纯CSS实现大小不固定的弹框永远居中的效果,如果伪元素换成普通元素,兼容IE7。
See the Pen 水平垂直居中弹框 by whjin (@whjin) on CodePen.
**vertical-align:middle
**定义是元素的中线和字符x
中心点对齐。
font-size
设置为0
,x
中心点位置是.container
的上边缘,高度100%
宽度0
的伪元素和这个中心点对齐。CSS中默认是左上方排列对齐,所以这个伪元素和原本在容器上边缘的x
中心点一起往下移动了半个容器高度,就是此时x
中心点在 容器的垂直中心线上。弹框元素
.dialog
设置vertical-align:middle;
。根据定义,弹框的垂直中心位置和x
中心点位置对齐,此时x
中心点在容器的垂直中心位置,.dialog
元素和容器垂直中心位置对齐,从而实现垂直居中效果。