2020-09-25 line-height

1、line-height的定义

行高,两行文字基线之间的距离

定义三问
1)、什么是基线?
image.png
2)、为何是基线?

基线是定义任何线的根本。

image.png
3)、需要两行?—— 一行文字没有行高?

一行文字也是有行高的。两行的定义已经决定了一行的表现!

image.png
4)、 不同字体的基线位置也有不同:
image.png
5)、为何line-height可以让单行文本垂直居中?

图中的红线为元素垂直距离的中线。实际上没有垂直居中,只是看起来居中了。

image.png

2、line-height与行内框盒子模型

所有内联元素的样式表现都与行内框盒子模型有关!例如浮动的图文环绕效果等。

行内框盒子模型讲解,下图:
image.png
1)、 “内容区域”(content area)

是一种围绕文字看不见的盒子。“内容区域”(content area)的大小与font-size大小有关;

内容区域的大小个人理解为我们选中文字时所看到的选中区域

2)、“内联盒子”(inline boxes)
image.png

image.png
3)、“行框盒子”(line boxes)—— 有几行文字,就有几个“行框盒子”
image.png

image.png
4)、“包含盒子”(containing box)

image.png

<p>标签所在的“包含盒子”(containing box),此盒子有一行一行的“行框盒子”(line boxes)组成;

*总结,行内框盒子模型有:
image.png

其中,4包含3,3包含2,2和1的关系说不清

3、line-height的高度机制和原理(主要讲内联元素)

<body>
    <p>这是一行普通的文字,这里有个<em>em</em>标签。</p>
    <script>
        console.log(document.querySelector('p').clientHeight); // 21
    </script>
</body>

上面p的高度是:21px

1)、 思考:内联元素的高度从何而来?

是不是由里面的文字撑开的?—— 不是。实际上是由line-height决定的!

<style>
    .test1 {
        font-size: 36px;
        line-height: 0;
        border: 1px solid #ccc;
    }
    .test2 {
        font-size: 0;
        line-height: 36px;
        border: 1px solid #ccc;
    }
</style>
<body>
    <p class="test1">这是一行普通的文字,这里有个<em>em</em>标签。</p>
    <p class="test2">这是一行普通的文字,这里有个<em>em</em>标签。</p>
</body>
image.png
2)、 line-height明明是两基线之间的距离,单行文字哪来的行高,还控制了高度?

需要知道的:

  1. 行高由于其继承性,影响无处不在,即使单行文本也不例外;
  2. 行高只是幕后黑手,高度的表现不是行高,而是内容区域行间距,只不过,正好:内容区域高度 + 行间距 = 行高
3)、 内容区域高度:
  1. 内容区域高度只与字号以及字体有关,与line-height没有任何关系。
  2. 在simsun(宋体)字体下,内容区域高度等于font-size大小值。

simsun(宋体)字体下:font-size + 行间距 = line-height

4)、行间距(假设是宋体):

font-size: 240px;
line-height: 360px;
行间距 = 360px - 240px = 120px;

实际上文字的行间距是上下均分的: 行间距上下拆分,就有了“半行间距”。

总结:

行高决定内联盒子高度;行间距可大可小(甚至负值),保证高度正好等同于行高。

5)、 如果行框盒子里面有多个不同行高的内联盒子?

由行高最高的那个盒子决定?—— 似是而非,看上去是对的其实不对。

<body>
    <p>这是一行简单地文字<em style="line-height:80px;">em</em></p>
    <script>
        console.log(document.querySelector('p').clientHeight); // 80
    </script>
</body>

上面<p>高度是:80px

<body>
    <p>这是一行简单地文字<em style="line-height:80px;vertical-align: 40px;">em</em></p>
    <script>
        console.log(document.querySelector('p').clientHeight); // 90
    </script>
</body>

上面<p>高度是:90px ≠ 高度最高的内联元素

6)、包含多个行框盒子的包含容器:

多行文本的高度就是单行文本高度累加。

4、line-height各类属性值

1)、line-height支持的属性值
  • normal
  • <number>
  • <length>
  • <percent>
  • inherit
2)、line-height:normal—— 默认属性值,跟着用户的浏览器走,且与元素字体关联。

mormal值 = 文字占据的高度 / 字体的font-size (由于mormal值的不确定,因此在网页开发中,经常在body元素样式里面设置一个固定的line-height值)

3)、line-height:<number>—— 使用数值作为行高值
line-height: 1.5;

根据当前元素的font-size大小计算。
假设文字大小(font-size)20像素,则实际的行高像素值是:
line-height = 1.5 * 20px = 30px;

<style>
    p {
        font-size: 20px;
        line-height: 1.5;
    }
</style>
<body>
    <p>哈哈哈哈哈哈哈哈哈哈哈哈哈哈或</p>
</body>
image.png
4)、line-height:<length>—— 使用具体长度值作为行高值
line-height: 1.5em; 
line-height: 1.5rem; 
line-height: 20px; 
line-height: 20pt;
5)、line-height:<percent>—— 使用百分比作为行高值
line-height: 150%;

相对于设置了该line-height属性的元素的font-size大小计算。
假设文字大小(font-size)20像素,则实际的行高像素值是:
line-height = 150% * 20px = 30px;

<style>
    p {
        font-size: 20px;
        line-height: 150%;
    }
</style>
<body>
    <p>哈哈哈哈哈哈哈哈哈哈哈哈哈哈或</p>
</body>
image.png
6)、line-height:inherit—— 行高继承,IE8+
input { line-height: inherit; }

input框等元素默认行高是normal,使用inherit可以让文本框样式可控性更强。

7)、line-height:1.5, line-height:150%, line-height:1.5em有什么区别?
  1. 计算无差别
  2. 应用元素有差别
  • line-height:1.5 所有可继承元素根据font-size重新计算行高;
  • line-height:150%/1.5em 当前元素根据font-size计算行高,继承给下面的子元素;
<style>
    .p1 {
        font-size: 20px;
        line-height: 1.5;
    }
    .p2 {
        font-size: 20px;
        line-height: 150%;
    }
    span {
        font-size: 60px;
    }
</style>
<body>
    <p class="p1">
        <span>我的font-size为60px</span>
    </p>
    <p class="p2">
        <span>我的font-size也为60px</span>
    </p>
</body>
image.png
8)、网页开发时,body全局数值行高使用经验—— 匹配20像素的使用经验,方便心算

line-height = 20px / 14px ≈ 1.4285714...

font-size:14px;
/* chrome浏览器计算出来是19px */
line-height: 1.42857;

因此取:

font-size: 14px;
line-height: 1.4286;

同时设置字体:

font: 14px/1.4286 'microsoft yahei';

5、line-height与图片的表现

行高不会影响图片实际占据的高度!

image.png
1)、如何消除图片底部间隙
  1. 图片块状化 - 无基线对齐
img { display: block; }
  1. 图片底线对齐
img { vertical-align: bottom; }
  1. 行高足够小 - 基线位置上移
.box { line-height: 0; }
2)、小图片和大文字

基本上高度受行高控制

image.png

6、line-height的实际应用

1)、图片水平垂直居中 - IE8+以上浏览器支持
.box {line-height: 300px; text-align: center;}
.box > img {vertical-align: middle;}
2)、多行文本水平垂直居中
.box {line-height: 250px; text-align: center;}
.box > .text {display: inline-block; line-height: normal; text-align: left; vertical-align: middle;}

多行文字水平垂直居中实现的原理跟上面图片的实现是一样的,区别在于要把多行文本所在的容器的display水平转换穿成和图片一样的,也就是inline-block,以及重置外部继承的text-align和line-height属性值。

image.png
image.png

IE6等浏览器下,元素一旦有了高度,就表现为了display:block样式,父级的display:inline-block就不起作用了


image.png
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,284评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,115评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,614评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,671评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,699评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,562评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,309评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,223评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,668评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,859评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,981评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,705评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,310评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,904评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,023评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,146评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,933评论 2 355

推荐阅读更多精彩内容