css元素及盒模型(二)
上节大部分讲的是块元素,这小节讨论下行内元素。行内元素见到最多的就是行内非置换元素em、a
,行内置换元素img
行内元素的布局
基本术语
Anonymous text 匿名文本
<p> I'm <em>so</em> happy!</p>
'I’m'和 'happy!'是匿名文本
Content area内容区:高度由font-size决定

Inline box 行内盒:高度由line-height决定

Leading: font-size和line-height的差值。差值的各一半被加到内容区的顶端和底端,组成行内盒。
Line box: Line box的边界为行内所有元素inline box的最大值和最小值之间的区域。

常用概念
行内元素的背景应用于内容区及padding区域
非置换元素的padding,borders和margin值对行内元素的垂直效果不起作用,它们不能改变inline-height值。
置换元素的Margins和borders值能改变该元素的inline box的高度,因此也能改变包含该元素的line box高度。
inline box是通过vertical-align属性垂直对齐于line box中。vertical-align属性值有:
top:元素inline-box的顶端与所包含的line box顶端对齐
bottom:元素inline-box的底端与所包含的line box底端对齐
text-top:将元素行内框的顶端同文本行的顶线对齐
text-bottom:文本的底端对齐
middle:中间对齐,通常使用在图片上,将图片的垂直方向的中线与文本行的中线对齐。
super:上标显示
sub:下标显示
<percentage>:百分比和长度
文本的基线、顶线、中线和底线,还有内容区、行内框和行框的相互关系:
- 默认情况下行内元素的对齐方式为:基线对齐(vertical-align : baseline)

- 顶端对齐(vertical-align : top)

- 文本顶端对齐(vertical-align : text-top)

- 底端对齐(vertical-align : bottom)

- 文本底端对齐(vertical-align : text-bottom)

- 中间对齐(vertical-align : middle)
中线的定义为:中线位于基线的上方,与基线的距离为小写字母x高度的一半(即0.5ex),而ex同font-size相关,大部分浏览器认为1ex = 0.5em(em同样也是相对单位,不是绝对单位),因此会将基线以上四分之一em处作为中线来对齐。
- 上标和下标
上标(vertical-align:super)使元素的基线相对于基准元素的基线升高,下标(vertical-align:sub)使元素的基线降低,移动的幅度CSS规范中没有规定,由浏览器来决定。
- 长度值和百分比
和上下标类似,长度值和百分比值可使元素的基线相对于基准元素的基线升高(正值)或者降低(负值)。上下标的移动尺寸是由浏览器确定的,而设定长度值或者百分比,可以精确控制文字上下移动的幅度。百分比与行高有关(line-height)
行高的确定原则:
由前面Leading的定义,我们可知,改变一个元素的行高值能引起与相邻元素的重叠。如当行高小于字体大小的时候。
为避免这种情况出现,可采用以下几种方法避免。
使用em单位,使得line-heigth的高度跟随元素本身font-size变化。
p {line-height: 1em;}
big {font-size: 250%; line-height: 1em;}
2.设置缩放比例值
body {line-height: 1.5;} 1.5倍当前字体值
增加盒属性
由前面讨论可知,padding, margins, 和 borders 可以应用于行内非置换元素. 但是不能改变行高值,也就不能改变行内元素的整体布局了。
如果你为行内元素设置border属性,那么border边界默认是元素的内容区域,也就是font-size控制区,而不是行高值区域,当你再设置padding值时,border会远离文本相应的值距离。但是文本的位置都不会变动,这和我们所说的理论不相冲突。
span {border: 1px solid black;}
span {padding: 4px;border: 1px solid black;}
效果分别如下:

行内置换元素
前面我们简单谈到过,置换元素的Margins和borders值能改变该元素的inline box的高度,因此也能改变包含该元素的line box高度。置换元素为什么也有自己的inline box的高度也就是行高值呢,因为,置换元素需要inline box来垂直定位自己,比如
p {font-size: 15px; line-height: 18px;}
img {vertical-align: 50%;}
<p>the image in this sentence <img src="test.gif" alt="test image">will be raised 9 pixels.</p>
图片相对于基线提升9px
行内块元素
行内块元素在行内的布局就和行内置换元素一样。也就是说,行内块元素基于基线对齐。