说明:示例不支持移动端 背景 & 概念

先看一张来自维基百科的图,上面都是字体排印学的术语

来自维基百科


baseline(基线)

在字体排印学(CSS中的字体同样遵循字体排印学)中,基线指的是多数字母排列的基准线。

东亚字体(包括中文)没有基线,每个字符坐落在一个方形盒子中,既无升部也无降部。当它与具有低基线的字体混合使用时,东亚字符应当被调整,使其字符底部在低基线字体的基线和降部高度之间。

基线是存在于字体中的一条基准线,和字体有关。

x-height

在西文字体排印学中,x字高(英语:x-height或corpus size)是指字母的基本高度,精确地说,就是基线(baseline)和主线之间的距离,即小写字母x的高度。

在西文的具体字体以及排版术语中,x字高通常被称为一个ex,这和把大写字母M的宽度称为一个em的习惯类似。 (终于知道CSS中的em单位的含义了)


em

em是字体排印学的计量单位,相当于当前指定的点数。

em最初表示的是字体中大写M的宽度及所用的尺寸。

在CSS中,单位em是字体点数或英寸数在名义上的高度。


em框

em框在字体中定义(也称为字符框(character box))。

实际字形可能比em框更高或更矮(所有例子中的“p”字母), font-size的值确定了各个em框的高度。

下面用边框模拟了em框,虚线代表了各个字符的em框:

font-size: 60px S p h i n x

下面的两行文字中的“p”解释了“实际字形可能比em框更高或更矮”

Sphinx
Sphinx

内容区

在非替换元素中,内容区域是元素中各字符的em框串在一起构成的框,即顶线和底线所包裹的区域。

在替换元素中,内容区域是元素的固有高度再加上可能有的外边距、边框或内边距。

下面灰色的背景模拟了内容区:

font-size: 60px
line-height: 60px
S p h i n x

行间距

行间距 = line-height - font-size 这个差值实际上要分为两半,分别应用到内容区域的顶部和底部。

行间距只应用于非替换元素


下面的灰色区域模拟了内容区域,黄色区域分别模拟半个行间距:

font-size: 60px
line-height: 80px
S p h i n x

行内框

行内框 = line-height

这个框通过向内容区域增加行间距来描述

对于替换元素行内框刚好等于内容区的高度。


下面两条红线之间描述了行内框:

font-size: 60px
line-height: 80px
S p h i n x

行框

包含该行中出现的行内框的最高点和最低点的最小框。

即:行框的上边界要位于最高行内框的上边界,而行框的底边位于最低行内框的下边界。


当将“内容区”示例中的图片放大时,两条红线的距离变大了

这两条红线模拟了行框的区域,如下例所示:

font-size: 60px
S p h i n x

为什么文本上面会留有空隙,图片下面会留有空隙,正常来说完全可以将两个空隙压缩掉?

原因在于垂直的默认对齐方式是基于基线对齐的(vertical-align: baseline;),而替换元素的基线位于元素的下边缘。


示例

            
This is text, Good moring, fdf dsf sad f sdf sd fs dfs df sdf ds f sd fsdfsdfs dfsd fs adfasd ds sfs sdf dsfas df asdf sad fas df sad f asdf sadf asdf asd f asdfas df sdf sd fasdfasdf sdf sad fs adf asdfasdfasd fasd f

行内元素的边框边界由 font-size而不是 line-height控制。 换句话说,如果一个 <span>font-size: 12px; line-height: 36px; 其内容区就是 12px 高,边框将包围该内容区域。


            
This is text, Good moring, fdf dsf sad f sdf sd fs dfs df sdf ds f sd fsdfsdfs dfsd fs adfasd ds sfs sdf dsfas df asdf sad fas df sad f asdf sadf asdf asd f asdfas df sdf sd fasdfasdf sdf sad fs adf asdfasdfasd fasd f

内边距和边框不改变行高

外边距不会应用到行内非替换元素的顶端和低端,不过会作用于左右两端


line-height中 1em 、100% 和 1 的不同

            
This is text, Good moring, fdf dsf sad f sdf sd fs dfs df sdf ds f sd fsdfsdfs dfsd fs adfasd ds sfs sdf dsfas df asdf sad fas df sad f asdf sadf asdf asd f asdfas df sdf sd fasdfasdf sdf sad fs adf asdfasdfasd fasd f

当line-height的值有单位时,继承的是父元素计算之后的值,即在父元素上计算


            
This is text, Good moring, fdf dsf sad f sdf sd fs dfs df sdf ds f sd fsdfsdfs dfsd fs adfasd ds sfs sdf dsfas df asdf sad fas df sad f asdf sadf asdf asd f asdfas df sdf sd fasdfasdf sdf sad fs adf asdfasdfasd fasd f

同上面的1em,继承的是父元素计算之后的值,即在父元素上计算


            
This is text, Good moring, fdf dsf sad f sdf sd fs dfs df sdf ds f sd fsdfsdfs dfsd fs adfasd ds sfs sdf dsfas df asdf sad fas df sad f asdf sadf asdf asd f asdfas df sdf sd fasdfasdf sdf sad fs adf asdfasdfasd fasd f

当line-height的值无单位时,是继承值(缩放因子)而不是计算值,即在当前子元素上计算


vertical-align

vertical-align 不影响块级元素中内容的对齐,可以影响表格单元的垂直对齐方式

baseline

当前元素的基线与父元素的基线对齐

如果该元素没有基线(例如img、input),则以该元素的底端与父元素的基线对齐


            
Sphinx baseline font-size: 20px

上面这个示例中: font-size: 60px; line-height: 1em; 两条虚线代表了行框,行框的高度大于了60px?

原因在于“font-size: 20px”的行内框元素也继承了line-height的值,行框包含了最高元素和最低元素


top/bottom

将元素行内框的顶端/底端和包含该元素的行框的顶端/底端对齐


            
Sphinx line-height: 1 xxx

text-top/text-bottom

将元素行内框的顶端/底端和父元素内容区的顶端/底端对齐


            
Sphinx line-height: 1 top text-top

middle

将元素行内框的垂直中点与父元素基线上方0.5ex处对齐

这也解释了为什么middle之后的元素并不位于行框的中间


            
Sphinx middle xxx

<percentage>

将元素上/下移一定的距离,这个距离由相对于元素的 line-height 值计算的


            
Sphinx xxx

一图总结
中文 Sphinx line-height: 200px font-size: 120px font-family: Microsoft Sans Serif; baseline(142px) middle(111px) 顶线(40px) 底线(160px) (56px) 主线(80px) ascent(40px) descent(18px)
参考: