CSS 行高 line-height 解析

line-height CSS 属性用于设置多行元素的空间量,如多行文本的间距。对于块级元素,它指定元素行盒(line boxes)的最小高度。对于非替代的 inline 元素,它用于计算行盒(line box)的高度。

以上内容来自 MDN(不在此叙述line_height的单位等问题),从以上的内容我们可以了解到,line-height主要用于设置行盒的最小高度,看到这一些人可能会觉得行高就是元素的高度,如下图所示:

[外链图片转存失败(img-bIF5OpYC-1568260006789)(https://github.com/lanniu/picHub/blob/master/data/20190912095446.png?raw=true)]

但其实这种想法并不是完全正确的,首先我们要明确一点,line-height != heightline-height只是限制了height的最小值,而在我看来line-heightheight的关系也就到这了,为什么这么说呢?我们看下面两个例子。

<html>
<head>
<style>
div{
	height: 100px;
	border: 1px dotted #000;
	line-height: 100px;
	background: rgba(0, 0, 0, 0.3);
}
</style>
</head>
<body>
<div>
<span>块格式化上下文(Block Formatting Context,BFC) 是Web页面的可视化CSS渲染的一部分,是块盒子的布局过程发生的区域,也是浮动元素与其他元素交互的区域。</span>
</div>
</body>
</html>

image

<html>
<head>
<style>
div{
    // height: 100px; 注释掉此行,让高度自适应
	border: 1px dotted #000;
	line-height: 100px;
	background: rgba(0, 0, 0, 0.3);
}
</style>
</head>
<body>
<div>
<span>块格式化上下文(Block Formatting Context,BFC) 是Web页面的可视化CSS渲染的一部分,是块盒子的布局过程发生的区域,也是浮动元素与其他元素交互的区域。</span>
</div>
</body>
</html>

image

上面两个例子的窗口宽度都不足以让文本在一行显示,唯一的不同就是是否显示的定义了div的height,当我们显示定义div的height并将line-height设置为等于height时,我们发现文本的内容跑到了div的外面,而当我们没有显示的定义div的height时,内容被包裹到div中。

通过以上的现象我们可以得知,line-height确实限制了height的最小值,但是当内容多于一行时,height并不会自动适应。

接下来我们仔细的分析一下为什么会出现超出div的情况,请看下图。

image

首先,我们需要知道的是font有四条线,分别是:

  1. 上线 对应上图的 1a
  2. 中线 对应上图的 2b
  3. 基线 对应上图的 3c
  4. 下线 对应上图的 4d

我们熟知的font-size就可以看成是上线下线的距离。我们现在关注的line-height其实是两条基线之间的距离,而行距就是第一行的下线和第二行的上线之间的距离,我们稍微整理下,可以得到一个公式:

行距 + 字体大小 = 行高 

我们再回到刚才的问题,为什么会出现内容超出div的情况,其实就是因为出现了多行,使得高度超出了div的height,但当div的高度为自适应时就不会出现这种情况。

相信一部分人和我一样,知道line-height属性是因为遇到了一个问题,“如何垂直居中”,这时候就会看到一条答案,“设置 line-height 等于 height”,然后一试,果然可以。但不知道大家有没有想过为什么。

其实原因很简单,当我们设置 line-height 等于 height 时,根据刚才的公式我们可以得到,行距 + 字体大小 = height ,并且由于上下的半行距相等,而文字被夹在上下的半行距之间,所以无论字体大小是多少都会让文字垂直居中。但这种方法不可取,因为如果出现换行或者需要垂直居中的不是文字,就会出现意料之外的情况。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值