SoXnix / Front-end-day-by-day

way to front end day by day
MIT License
7 stars 1 forks source link

最后一次理解 line-height #8

Open XueSeason opened 8 years ago

XueSeason commented 8 years ago

首先来一张盗图,否则完全不知道 line-height 所云。

其中半行高的计算公式:

半行距 = (line-height - font-size)/2

如果 line-height 小于 font-size,那么半行距就会出现负值的情况,此时会造成文字换行时重叠。

line-height 默认值 1.2,即 normal。注意 line-height 是可以被继承的,但是我们会遇到这样一种情况:

父元素 font-size: 16px; line-height: 150% => 计算可得到最终父元素的 line-height = 16px * 150% = 24px。

那么子元素继承的 line-height 到底是 150% 还是 24px ?
答案是后者 24px。

由此得出,_通过百分比设值,子元素继承父元素的行高是以最终计算结果为准。_

接着如果 line-height 的值不是百分比,而是 normal 形式的普通值,结果完全相反:

父元素 font-size: 16px; line-height: 1.5 => 计算可得到最终父元素的 line-height = 16px * 1.5 = 24px。

最终子元素继承的 line-height 为 1.5,如果此时子元素的 font-size 为 8px,那么就可以推算出子元素的 line-height = 8px * 1.5 = 12px。

就酱,一般 line-height 的知识点也就这些,具体可以参考表格:

设置方式 line-height 计算后的line-height 子元素继承的line-height
inherit 父元素的line-height值 不用计算 父元素的line-height值
length 20px 不用计算 20px
% 120% 自身font-size (16px) * 120% = 19.2px 继承父元素计算后的line-height值 19.2px,而不是120%
normal 1.2 自身font-size (16px) * 1.2 = 19.2px 继承1.2,line-height = 自身font-size(32px) * 1.2 = 38.4px
纯数字 1.5 自身font-size (16px) * 1.2 = 19.2px 继承1.5,line-height = 自身font-size(32px) * 1.5 = 48px

重新思考

在 CSS 中对元素的高度直接影响的元素,一个是 height,另一个就是 line-height。如果我们没有去设置 height,那么就只有 line-height 影响到元素高度(这里避开讨论 padding 撑大元素的情况)。

回想我们刚学 CSS 的时候,<div>Hello World</div> 这里我们没有直接设置 div 的高度,我们会认为这里的高度是被文字给撑大的。其实我们一开始就错了,而且不研究下 line-height 永远都活在自己错误的理论中。

有质疑的同学可以对比 font-size:20px; line-height:0;font-size:0; line-height:20px; 两种情况。这里决定 div 高度的是 line-height,而不是所谓的文字撑大。

上面的所有奥秘,可以去研究下 inline box 模型。

一些巧用

(未完待续)