CSS行高——line-height初入前端的時(shí)候覺得CSS知道display、position、float就可以在布局上游刃有余了,隨著以后工作問題層出不窮,才逐漸了解到CSS并不是幾個(gè)style屬性那么簡單,最近看了一些關(guān)于行高的知識(shí),就此總結(jié)一下。
所謂行高是指文本行基線間的垂直距離。要想理解這句話首先得了解幾個(gè)基本知識(shí):
頂線、中線、基線、底線
<!DOCTYPE html><html> <head> <title>Test</title> <style type="text/css" > span { padding:0px; line-height:1.5; } </style> </head> <body> <div class="test"> <div style="background-color:#ccc;"> <span style="font-size:3em;background-color:#999;">中文English</span> <span style="font-size:3em;background-color:#999;">English中文</span> </div> </div> </body><html>
從上到下四條線分別是頂線、中線、基線、底線,很像才學(xué)英語字母時(shí)的四線三格,我們知道vertical-align屬性中有top、middle、baseline、bottom,就是和這四條線相關(guān)。
尤其記得基線不是最下面的線,最下面的是底線。
行高、行距與半行距
行高是指上下文本行的基線間的垂直距離,即圖中兩條紅線間垂直距離。
行距是指一行底線到下一行頂線的垂直距離,即第一行粉線和第二行綠線間的垂直距離。
半行距是行距的一半,即區(qū)域3垂直距離/2,區(qū)域1,2,3,4的距離之和為行高,而區(qū)域1,2,4距離之和為字體size,所以半行距也可以這么算:(行高-字體size)/2
內(nèi)容區(qū)、行內(nèi)框、行框
內(nèi)容區(qū):底線和頂線包裹的區(qū)域,即下圖深灰色背景區(qū)域。
行內(nèi)框,每個(gè)行內(nèi)元素會(huì)生成一個(gè)行內(nèi)框,行內(nèi)框是一個(gè)瀏覽器渲染模型中的一個(gè)概念,無法顯示出來,在沒有其他因素影響的時(shí)候(padding等),行內(nèi)框等于內(nèi)容區(qū)域,而設(shè)定行高時(shí)行內(nèi)框高度不變,半行距【(行高-字體size)/2】分別增加/減少到內(nèi)容區(qū)域的上下兩邊(深藍(lán)色區(qū)域)
行框(line box),行框是指本行的一個(gè)虛擬的矩形框,是瀏覽器渲染模式中的一個(gè)概念,并沒有實(shí)際顯示。行框高度等于本行內(nèi)所有元素中行內(nèi)框最大的值(以行高值最大的行內(nèi)框?yàn)榛鶞?zhǔn),其他行內(nèi)框采用自己的對(duì)齊方式向基準(zhǔn)對(duì)齊,最終計(jì)算行框的高度),當(dāng)有多行內(nèi)容時(shí),每行都會(huì)有自己的行框。
<div style="background-color:#ccc;"> <span style="font-size:1em;background-color:#666;">中文English</span> <span style="font-size:3em;background-color:#999;">中文English</span> <span style="font-size:3em;background-color:#999;">English中文</span> <span style="font-size:1em;background-color:#666;">English中文</span> </div>
line-height
基本概念搞明白了我們就可以說說本文的主角line-height屬性了。
定義:line-height 屬性設(shè)置行間的距離(行高),不能使用負(fù)值。該屬性會(huì)影響行框的布局。在應(yīng)用到一個(gè)塊級(jí)元素時(shí),它定義了該元素中基線之間的最小距離而不是最大距離。line-height 與 font-size 的計(jì)算值之差(行距)分為兩半,分別加到一個(gè)文本行內(nèi)容的頂部和底部??梢园@些內(nèi)容的最小框就是行框。
可能的值
值說明
normal默認(rèn),設(shè)置合理的行間距。
number設(shè)置數(shù)字,此數(shù)字會(huì)與當(dāng)前的字體尺寸相乘來設(shè)置行間距。相當(dāng)于倍數(shù)
length設(shè)置固定的行間距。
%基于當(dāng)前字體尺寸的百分比行間距。
inherit規(guī)定應(yīng)該從父元素繼承 line-height 屬性的值。
貌似很簡單,但感覺沒什么用出的樣子,那就讓我們看看line-height的幾個(gè)應(yīng)用
div文字垂直居中
div居中對(duì)齊一直是個(gè)難題,水平還好解決些,margin:0 auto; 可以解決現(xiàn)代瀏覽器,IE下text-align:center。但垂直居中就沒那么簡單了,默認(rèn)是這樣子的。
<div style="width:150px;height:100px;background-color:#ccc;"> <span>This is a test.<br/> This is a test. </span> </div>
我們可以利用line-block這樣做
<div style="width:150px;height:100px;line-height:100px;background-color:#ccc;font-size:0;"> <span style="display:inline-block;font-size:10px;line-height:1.4em;vertical-align:middle;">This is a test.<br/> This is a test. </span> </div>
單行就比較簡單了,把line-height設(shè)置為box的大小可以實(shí)現(xiàn)單行文字的垂直居中
<div style="line-height:100px;border:dashed 1px #0e0;"> This is a test. </div>
元素對(duì)行高影響
行框高度是行內(nèi)最高的行內(nèi)框高度,通過line-height調(diào)整,內(nèi)容區(qū)行高與字體尺寸有關(guān),padding不對(duì)行高造成影響。
<div style="border:dashed 1px #0e0;margin-bottom:30px;"> <span style="font-size:14px;background-color:#999;">This is a test</span> </div> <div style="border:dashed 1px #0e0;"> <span style="font-size:14px;padding:20px;background-color:#999;">This is a test</span> </div>
第二個(gè)span雖然因?yàn)閜adding原因內(nèi)容區(qū)變大,當(dāng)行高并未改變
行高的繼承
行高是可繼承的,但并不是簡單的copy父元素行高,繼承的是計(jì)算得來的值。
<div style="border:dashed 1px #0e0;line-height:150%;font-size:10px;"> <p style="font-size:30px;"> 1232<br/> 123 </p> </div>
按一般理解既然line-height可以繼承,那么p元素的行高也是150%了,可是事實(shí)是這樣的
非但沒有變成150%,反而連100%都沒有,重疊了!這就是繼承計(jì)算的結(jié)果,如果父元素的line-height有單位(px、%),那么繼承的值則是換算后的一個(gè)具體的px級(jí)別的值;上例p得到的是10px*150%=15px的行高,而P的字體大小為30px,所以發(fā)生了重疊。
而如果屬性值沒有單位,則瀏覽器會(huì)直接繼承這個(gè)“因子(數(shù)值)”,而非計(jì)算后的具體值,此時(shí)它的line-height會(huì)根據(jù)本身的font-size值重新計(jì)算得到新的line-height 值。
<div style="border:dashed 1px #0e0;line-height:1.5;font-size:10px;"> <p style="font-size:30px;"> 1232<br/> 123 </p> </div>
所以在使用line-height時(shí),除非你刻意否則盡量使用倍數(shù)設(shè)值
分類:
CSS標(biāo)簽:
css,
行高,
line-height綠色通道:
與我聯(lián)系色拉油啊油關(guān)注 - 11粉絲 - 10069
0
(請(qǐng)您對(duì)文章做出評(píng)價(jià))
上一篇:
JavaScript 誤區(qū) 下一篇:
Html 字體大小單位 px em ptposted @ 2013-08-04 19:21
色拉油啊油 閱讀(4882) 評(píng)論(8)
編輯評(píng)論列表
2013-08-05 09:09
小木公 今天才知道那四條線,學(xué)習(xí)了!
2013-08-05 20:34
Never_say 不錯(cuò),很詳細(xì)。
2013-08-05 22:50
paxster 最后一個(gè)例子,p和div的字體大小最后都是15px了么?看得云里霧里的
[樓主] 2013-08-06 18:34
色拉油啊油 paxster
首先誰的字體大小都不會(huì)改變,變得是行高
因?yàn)閐iv的line-height屬性沒有單位,所以子元素p的行高是自己字體尺寸(30px)*1.5=45,45〉30所以字體不會(huì)重疊