理解css行高(line-height)

首先我们要明确 line-height 的定义,line-height指的是两条文字基线之间的距离。

行内框盒子模型

所有内联元素的样式表现都与行内框盒子模型有关。所以这个概念是非常重要的。

        <p>这是一段文字,这里有个<em>em</em> 标签。</p>

如上面一段普普通通的代码,却包含了4种盒子:

1)“内容区域”(content area),是一种围绕文字看不见的盒子,可理解为选中文字蓝色背景区域,如下图。“内容区域”的大小与 font-size 大小相关;

2)“内联盒子”(inline-boxes),“内联盒子”不会让内容成块显示,而是排成一行。如果文字外部含 inline 水平的标签(如span,a,em等),则属于“内联盒子”,如下图紫框处。如果是光秃秃的文字,则属于“匿名内联盒子”,如下图红框处;

3)“行框盒子”(line boxes),每一行就是一个“行框盒子”,每个“行框盒子”又是由一个一个“内联盒子”组成,“行框盒子”如下图红框处;

4)<p> 标签所在的“包含盒子”(containing box),如下图红框处。此盒子由一行一行的“行框盒子”组成

line-height 的高度机理

疑问一:元素高度是从何而来的呢?是由里面的文字撑开的吗?

答案:不是的,并不是由文字撑开的,实际上是由 line-height 决定的。

这时可能会提出疑问:line-height明明是两基线距离,单行文字哪来的行高呢?

关于这个问题,我们需要了解的是:

1)行高由于其继承性,影响无处不在,即使单行文本也不例外。

2)行高只是幕后黑手,高度的表现不是行高,而是内容区域和行间距。

内容区域 + 行间距 = 行高,正好高度表现等于行高,给人感觉上是行高起了作用。

1. 内容区域高度只与字号以及字体有关,与 line-height 没有任何关系。

2. 在simsun(宋体)字体下,内容区域高度等于文字大小值

因此,在 simsun(宋体)字体下:

font-size + 行间距 = line-height

那行间距的就可以这样计算了:

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

行间距上下拆分,就有了“半行间距”。

半行间距 = (行高 - 内容区域高度)/2

总结:

行高决定内联盒子高度,但高度表现是由行间距和内容区域表现的;行间距墙头草,可大可小(甚至负值),它的作用就是保证内联盒子高度正好等于行高。

疑问二:如果行框盒子里面有多个不同行高的内联盒子,这时高度会如何表现呢?是由行高最高的内联盒子决定的吗?

答案:不对。多行文本的高度就是单行文本高度累加。

疑问三:如果行框盒子里面混入inline-block水平元素(如图片),高度如何表现呢?

line-height 各类属性值

  • normal  默认属性值,不同浏览器表现不同,且与元素字体关联。
  • <number>  使用数值作为行高值,根据当前元素的font-size大小计算
  • <length>  使用具体长度值作为行高值
  • <percent>  使用百分比值作为行高值,相当于设置了该line-height属性的元素的font-size大小来计算
  • inherit  行高继承。如input框等元素默认行高是normal,使用inherit可以让文本样式可控性更强。
应用元素有差别:

line-height:1.5  所有可继承元素根据自己的 font-size 重新计算行高。推荐使用

line-height:150%/1.5em 当前元素根据font-size计算行高,直接继承给下面的元素。

body全局数值行高使用经验
        body{
            font-size: 14px;
            line-height: ?
        }

匹配20像素的使用经验——方便心算

line-height = 20px / 14px ≈ 1.4286

        body{
            font-size: 14px;
            line-height: 1.4286;
        }

line-height与图片表现

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

答案:不会。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
        p{
            background-color: #ccc;
        }
        span{
            background-color: white;
        }
    </style>
</head>
<body>
        <section>
            <p>
                <img src="./123.jpg" /><span>xxxxxxx</span>
            </p>
        </section>
</body>
</html>

效果如下图,图片会与右边的文字基线对齐。

当我们把span高度改一下,可以看到为了与文字基线对齐,p的高度变高了。

        span{
            display: inline-block;
            height: 50px;
            background-color: white;
        }

由上可知,行高改变容器的高度只是 vertical-align 和文字行高变化共同起的作用,图片占据的高度还是它原本的高度

下面我们再来看,

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
        p{
            background-color: #ccc;
        }
    </style>
</head>
<body>
        <section>
            <p>
                <img src="./123.jpg" />
            </p>
        </section>
</body>
</html>

效果如下图,右边没有文字了,但下面还是会有一点空。

原因是:

对于一个block元素,后面就像有一个文本节点在里面一样,看不到,获取不到,称之为隐匿文本节点。内联块级元素img默认对齐方式是基线baseline,要与文本对齐,文本存在line-height,所以存在间隙。

那么如何消除图片底部的间隙呢?

方法1:图片块状化 ——无基线对齐

        img{
            display: block;
        }

方法二:图片底线对齐

        img{
            vertical-align: bottom;
        }

方法三:行高足够小——基线上移

        p{
            background-color: #ccc;
            line-height: 0;
        }

方法四:消除隐匿文本字体大小

        p{
            background-color: #ccc;
            font-size: 0;
        }

小图片和大文字

基本上高度受行高控制。

line-height 的实际应用

图片水平垂直居中
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
        p{
            background-color: #ccc;
            line-height: 300px;
            text-align: center;
        }
        img{
            vertical-align: middle;
        }
    </style>
</head>
<body>
        <section>
            <p>
                <img src="./123.jpg" />
            </p>
        </section>
</body>
</html>

效果如下:

多行文本水平垂直居中
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
        p{
            line-height: 250px;
            text-align: center;
            background-color: #ccc;
        }
        span{
            display: inline-block;
            line-height: normal;
            text-align: left;
            vertical-align: middle;

        }
    </style>
</head>
<body>
        <section>
            <p>
                <span>
                    多行文本水平垂直居中实现的原理和图片的实现是一样的,区别在于要把
                    多行文本所在容器的 display 转换为和图片一样的 inline-block,以及
                    重置外部继承的 text-align 和 line-height 属性值。
                </span>
            </p>
        </section>
</body>
</html>

效果如下:

原文地址:https://www.cnblogs.com/ly2019/p/11241180.html

时间: 2024-08-07 09:42:15

理解css行高(line-height)的相关文章

深入了解css的行高Line Height属性

来源:http://www.cnblogs.com/fengzheng126/archive/2012/05/18/2507632.html 什么是行间距? 古时候我们使用印刷机来出来文字.印刷出来的每个字,都位于独立的一个块中. 行间距,即传说中控制两行文字垂直距离的东东.在CSS中,line-height被用来控制行与行之间垂直距离. 不过,行间距与半行间距,还是取决于CSS中的line-height.那么,如何来使用line-height呢? 默认状态,浏览器使用1.0-1.2 line-

【转】css行高line-height的一些深入理解及应用

一.前言 前两天在腾讯ISD团队博客上看到一篇翻译的文章“深入理解css 行高”,是个不错的文章,学到了不少东西,建议您看看. 这里,我也要讲讲我对line-height的一些理解,所讲解的东西绝大多数与上面提到的“深入理解css 行高”是不重复的,可以说是补充或是另外一个角度的思考.另外,将结合实际,展示line-height的一些特性和一些常见应用,帮助您对css行高line-height的理解.所讲述的并不一定都是正确的,欢迎指正欢迎交流. 二.一些字面意思“行高”顾名思意指一行文字的高度

css行高line-height的一些深入理解及应用

by zhangxinxu from http://www.zhangxinxu.com,原文地址:http://www.zhangxinxu.com/wordpress/?p=384 一.一些字面意思"行高"顾名思意指一行文字的高度.具体来说是指两行文字间基线之间的距离.基线实在英文字母中用到的一个概念,我们刚学英语的时使用的那个英语本子每行有四条线,其中底部第二条线就是基线,是a,c,z,x等字母的底边线.下图的红色线即为基线. vertical-align中有top,middle

[ css 深入理解 inline box 模型中line boxes ] css中深入理解line-height(行高)产生的原因:看不见的 line boxes

到底这个line-height行高怎么就产生了高度呢: 在inline box模型中,有个line boxes,这玩意是看不见的,这个玩意的工作就是包裹每行文字.一行文字一个line boxes.例如“艾佛森退役”这5个字,如果它们在一行显示,你艾佛森再牛逼,对不起,只有一个line boxes罩着你:但“春哥纯爷们”这5个字,要是竖着写,一行一个,那真是够爷们,一个字罩着一个line boxes,于是总计五个line boxes.line boxes什么特性也没有,就高度.所以一个没有设置he

CSS行高——line-height

初入前端的时候觉得CSS知道display.position.float就可以在布局上游刃有余了,随着以后工作问题层出不穷,才逐渐了解到CSS并不是几个style属性那么简单,最近看了一些关于行高的知识,就此总结一下. 所谓行高是指文本行基线间的垂直距离.要想理解这句话首先得了解几个基本知识: 顶线.中线.基线.底线 <!DOCTYPE html> <html> <head> <title>Test</title> <style type=

CSS行高line-height解释

"行高"顾名思意指一行文字的高度.具体来说是指两行文字间基线之间的距离.基线实在英文字母中用到的一个概念,我们刚学英语的时使用的那个英语本子每行有四条线,其中底部第二条线就是基线,是a,c,z,x等字母的底边线.下图的红色线即为基线. vertical-align中有top,middle,baseline,bottom与之是由关联的 css中起高度作用的应该就是height以及line-height了吧! 如果一个标签没有定义height属性(包括百分比高度) 1.单行文字的垂直居中对

css行高line-height的用法(转)

本文导读: “行高“指一行文子的高度,具体来说是指两行文子间基线间的距离.在CSS,line-height被用来控制行与行之间的垂直距离.line- height 属性会影响行框的布局.在应用到一个块级元素时,它定义了该元素中基线之间的最小距离而不是最大距离.所有浏览器都支持 line-height 属性. 一.line-height语法 line-height属性的具体定义列表如下: 语法: line-height : normal | <实数> | <长度> | <百分比

css行高line-height的用法

一.line-height语法 line-height属性的具体定义列表如下: 语法: line-height : normal | <实数> | <长度> | <百分比> | inherit 说明: line-height 属性设置行间的距离(行高),不能使用负值.该属性会影响行框的布局.在应用到一个块级元素时,它定义了该元素中基线之间的最小距离而不是最大距离.line-height 与 font-size 的计算值之差(行距)分为两半,分别加到一个文本行内容的顶部和

CSS 行高和对齐

文本垂直对齐 行高 line-height属性是制定文本行基线之间的距离,而不是字体的大小,它确定了将各个元素框的高度增加或减少多少.line-height控制了行间距,这是文本行之间超出字体大小的额外空间.换句话说,line-height值和字体大小之差就是行间距. 在应用到块级元素时,line-height定义了元素中文本基线之间的最小距离.注意它定义的是最小距离,而不是一个绝对数值,文本基线拉开的距离可能比line-height值更大.line-height并不影响替换元素布局,不过确实可