「line-height」深入理解

是不是感觉line-height会用,但是用起来总是怪怪的?那是因为你对它理解的还不够!

* 什么是 line-height

  line-height【行高】顾名思意指一行文字的高度,用来指定行间的距离,具体来说是指两行文字间基线之间的最小距离。关于基线【base-line】,如下图:

* 支持性

所有浏览器都支持line-height,但ie不支持 line-height 的 inherit 值

* 注意点

line-height 不允许设置负值

* 说明

  line-heightfont-size 的计算值之差(在 CSS 中就是两行的“行间距”)分为两半,分别加到一个文本行内容的顶部和底部。可以包含这些内容的最小框就是行框。
  原始数字值指定了一个缩放因子,后代元素会继承这个缩放因子而不是计算值。即,当子元素节点设置line-heihgt:inherit的时候,继承的是父元素节点的缩放因子。

* javascript语法

object.style.lineHeight = "2"

* 取值

描述
normal 默认,设置合理的行间距
number 此数字会与当前字体的尺寸相乘来设置行间距
length 设置固定的行间距
% 基于当前尺寸的百分比行间距
inherit 从父元素继承 line-height 属性的值

* 深入理解 line-height

 css中起高度作用的应该就是height以及line-height了吧!如果一个标签没有定义height属性(包括百分比高度),那么其最终表现的高度一定是由line-height起作用,即使是 IE6 下 11像素左右默认高度bug也是如此。待我慢慢叙来。

 先说一个大家都熟知的现象,有一个空的div,<div></div>,如果没有设置至少大于1像素高度height值时,该div的高度就是个0。如果该div里面打入了一个空格或是文字,则此div就会有一个高度。那么您思考过没有,为什么div里面有文字后就会有高度呢?

 这是个看上去很简单的问题,是理解line-height非常重要的一个问题。可能有人会跟认为是:文字撑开的!文字占据空间,自然将div撑开。我一开始也是这样理解的,但是事实上,深入理解**inline模型**后,我发现,根本不是文字撑开了div的高度,而是line-height!

 那么,line-height 是如何产生高度的呢?

 在inline box模型中,有个line boxes,这玩意是看不见的,这个玩意的工作就是包裹每行文字;一行文字一个line boxes,无论是不同的<div>,<p>还是 <span>;还是单行内容过多自动换行,每一行,都有一个 line-boxes 包裹;line-boxes只有一个特性,就是高度。
  所以现在明白为什么没有设置height属性的div也有高度了吧?没错,就是由一个个line-boxes堆积起来的。我们看下例子帮助理解:

html代码

<div class="box">
  Hello world!
</div>
<br/>
<div class="box">
</div>

css代码

* { marign:0; padding: 0; background-color: #4e4e4e; }
.box {
  background-color: pink;
  border: solid 1px white;
}

结果展示

 可以看到,同样没有设置height,第一个 div 的高度被文字撑开了,第二个div高度为0。这就因为文案 “Hello World!”由一个 line-boxes 包裹,line-boxes的默认高度为字体高度的110%;所以有了以上现象。需要理解的是,line-boxes是根据文案、图片等这些资源生成的一个高度框,自身不产生高度。

既然如此,我们可以得出一个结论: line-height可以规定高度,有些时候,他也可以取代height

* 拓展与使用

单行文本的居中

 从上面的经验我们可以知道,对于单行的文本有 line-boxes 这东西。网络上常说,“把line-height设置与height相同的值,便可以实现单行文字的居中“。是没有错,但是其实略有冗余。line-height本身就能规定高度,其实只需要“把line-height设置成所需要的box的高度” 即可。

多行文本的居中对齐

1. 对于高度不固定的多行文本:
使用padding实现效果,只要把上下padding的值设为相同。

2. 对于高度固定的多行文本:
文字可能为单行,也可能为多行,再又或者字体大小不一致,这时我们就可以借助 line-height 实现居中效果。方案如下
注意:文案较多发生自动换行,或者不同屏幕适配时文字显示行数不一致下,将不适用
html代码

<p class="mulit_line">
    <span style="font-size:12px;">这里是高度为150像素的标签内的多行文字,文字大小为12像素。<br/>这里是第二行,用来测试多行的显示效果。</span>
  <i>&nbsp;</i>
</p>

css 代码

* { margin: 0; padding: 0;}
.mulit_line{
  line-height: 150px; 
  padding: 15px;
  margin-left: 50%;     /* 让盒子左右居中  */
  transform: translateX(-50%);
}
.mulit_line span{
  display: -moz-inline-stack; 
  display: inline-block; 
  line-height: 1.4em; 
  vertical-align: middle;
}
.mulit_line i{
  width:0; 
  display: -moz-inline-stack;
  display: inline-block; 
  vertical-align: middle; 
  font-size: 0;
}

效果展示

避免haslayout:巧妙的设置文字的背景颜色

 经常我们有这样的需求: 在一个文案中,需要对某些文字加背景显示,或者,我们有一个tag,用作标注信息。情形如下:


Tag 标签

可以这么实现
html代码

<span class="box">NEWS!</span>

css代码

.box {
  line-height: 20px;
  background-color: pink;
  padding: 5px;
  color: white;
  border-radius: 6px;
}

说明: 在某些情形下,line-height可以和height互换,因为实现的效果一样。都能撑开一个高度,然而这两个css属性有一个较隐蔽的差异,就是使用height会使标签haslayout,而使用line-height则不会。

冲破限制

关于line-height先说这些,如果有错误,欢迎指正。
如果觉得还不够深入,可以查看 腾讯团队的 深入理解line-height

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

推荐阅读更多精彩内容

  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 13,727评论 1 92
  • 行高: 两行文字“基线”之间的垂直距离 基线并不是汉字的下端沿,而是英文字母"x"的下端沿 行距: 一行“底线”至...
    lmmy123阅读 1,738评论 0 2
  • 前言 总括: 本文通过实例讲解CSS中最大的难点之一,行内元素的布局,主要是挖掘line-height和verti...
    秦至阅读 1,904评论 0 1
  • 以下文章是我在网上收集的内容,为了记录自己的学习以及为了以后不到处找而记录下来,如果对你有用,请感谢写这些文章的前...
    DCbryant阅读 919评论 0 2
  • 夜 深邃 沉静 在亿万光年里 默默的 默默的 恰如一个孤独的守望者 等待着遗落的繁星 我划一片星船 穿过片片云彩...
    思京阅读 197评论 0 3