分析 line-height

行高和行距

line-height 是用于定于行高的css屬性。什么是行高?

行高和行距

從上圖可以清楚看到,一行文本對應(yīng)會有四條線,由上而下分別是 頂線(top line),中線(middle line),基線(baseline),底線(bottom line)。根據(jù)這些線,可以清晰地認(rèn)知:

  • 行高:相鄰兩行基線(baseline)間的垂直距離
  • 行距:上一行的底線(bottom line)和下一行的頂線(top line)的垂直距離

line-height 的取值

line-height: normal | <number> | <length> | <percentage> ;
初始值 : normal
繼承 : 是
適用元素:幾乎全部,包括偽元素::first-letter和::first-line
  • line-height 初始值為normal,這個值大概等于數(shù)值上的1-1.2,因元素的font-family不同而不同。
  • 取值<number>時,應(yīng)為純數(shù)字,不帶單位,最終line-height 的值等于元素的字體大小值乘以該數(shù)值,即font-size * number。
  • 取值length時,應(yīng)該是一個帶單位的長度值,比如說empx,rem等等。
  • 取值<percentage>時,是一個百分比數(shù)值,最終line-height 的值等于元素的字體大小值乘以該數(shù)值,即font-size * number。

要注意<number><percentage>之間的區(qū)別,它們兩個計算自身的line-height方式和結(jié)果都是完全一樣的,但區(qū)別就在于繼承方式上,對子元素影響方式不一樣。

  • 使用<percentage>元素得出的line-height 值會轉(zhuǎn)換成length形式的px值,然后再把這個值繼承給它的子元素。
    舉例說,父元素設(shè)置了font-size: 20px; line-height: 150%;,父元素自身的行高就是20px * 150%,即30px。那么子元素得到的line-height屬性的繼承值就是30px,而非150%。(有點em的意思)
  • 使用<number>元素會先把<number>繼承給它的子元素,再由子元素自己去計算line-height值。
    舉例說,父元素設(shè)置了font-size: 20px; line-height: 150%;,那么子元素line-height屬性的繼承值就是1.5,子元素的行高由子元素本身的font-size * 1.5得出。

因此,在實際場景中使用line-height屬性使用<number>類型的值是較好的做法,因為你不知道<percentage>的繼承方式會不會導(dǎo)致一些不可預(yù)料的錯誤,譬如

效果

代碼

子元素字體比父元素更大時,使用<percentage>繼承得到的行高就顯得有些不夠用了,相對而言<number>實用性更強!

line-height 的實際應(yīng)用和效果

首先,要認(rèn)識inline content(行內(nèi)內(nèi)容)、inline box(行內(nèi)框)和line box(行內(nèi)框),這三個概念和line-height緊密關(guān)閉?。ǖ谝粋€概念是我自己編的)

顯示效果

代碼

由上圖可見:

  • 藍色框是指div的高度,也是inline box(行內(nèi)框)和line box(行內(nèi)框),由于inline boxline box是不可見的,所以描述對應(yīng)的圖不太準(zhǔn)確,自己領(lǐng)會吧!
  • 灰色底的區(qū)域就是inline content(行內(nèi)內(nèi)容)

那么inline box(行內(nèi)框)和line box(行內(nèi)框)有什么不一樣呢?可以說,line box(行內(nèi)框)是由一個或多個inline box(行內(nèi)框)形成的,line box(行內(nèi)框)的高度由其中高度最大的inline box(行內(nèi)框)決定。繼續(xù)上個例子,對a標(biāo)簽設(shè)置line-height: 100px;,可以得到:

a標(biāo)簽設(shè)置100px行高

(行內(nèi)元素之間還是對齊的,因為vertical-align的關(guān)系,遲點再學(xué)習(xí)它)

下面說說line-heightheight之間的關(guān)系。
平時我們輸入一對空內(nèi)容的<div></div>標(biāo)簽時,瀏覽器渲染出來div的高度為0,那么當(dāng)我們輸入文字的時候,div就有了高度,這個高度是因為文字大小撐起來的嗎?答案:不是,是由line box撐起來的??聪旅?zhèn)€例子:

<style>

</style>
<div>
  我是div里的內(nèi)容
</div>
未設(shè)置line-height時
<style>
  div{ line-hright: 1px; }
</style>
<div>
  我是div里的內(nèi)容
</div>
設(shè)置行高為1px

可以看到,高度確實是由line box撐起來的。那么,既然line-heightheight之前的關(guān)系如此曖昧,我們是不是可以利用起來?
是的,比如說:多行文本在容器內(nèi)的垂直居中。

<style>
  div{ width: 100px; border: 1px solid #ccc; text-align: center; line-height: 100px;}
  span{ line-height: 16px; display: inline-block; vertical-align: middle; }
</style>
多行文本垂直居中

這里有要注意的一點,就是當(dāng)spandisplay: inline-block;去掉后,居中效果就沒有了,為啥呢?答案就在于line box的數(shù)量,畢竟一行一個line box嘛,領(lǐng)會!
上面這個技巧,可以用于圖片在容器內(nèi)的垂直居中嗎?答案是,NO!
開頭在介紹使用元素的時候,寫了“幾乎全部”,那么就有一些元素對line-height是不感冒的!在這里列出來規(guī)則:

  • 對于塊級元素,CSS屬性line-height指定了元素內(nèi)部inline box的最小高度
  • 對于非替代行內(nèi)元素,line-height用于計算自身包含的匿名inline box的高度。
  • 對于替代行內(nèi)元素,如img 或其他object元素,line-height沒有作用。

什么是替代元素和非替代元素?

  • 非替代元素即內(nèi)容即顯示的元素,如div、p等等大部分元素,里面的內(nèi)容會立即顯示。
  • 替代元素會根據(jù)元素標(biāo)簽,屬性等決定顯示內(nèi)容,如img,你得有src屬性,下載圖片才能顯示出來。

規(guī)則是在 MDN - line-height 上摘過來的,但是經(jīng)過實驗發(fā)現(xiàn),不是所有的替代行內(nèi)元素都對line-height不感冒。
要注意的是,上面 MDN 的規(guī)則中關(guān)于替代元素的描述仍然是正確的?。ㄒ苍S你看完后面的應(yīng)該再回過頭來想想)

首先說說inputinput的替代性在于它的type標(biāo)簽,type不一樣,效果和功能就完全不一樣,下面是所有的input type
input type : text | button | submit | radio | checkbox | file | hidden | image | password | reset ;
列舉其中2個試驗場景:
試驗1:

<style>
  *{margin: 0; padding: 0;}
  body{ line-height: 50px; }
  input{ line-height: 30px; }
</style>

<input type="text" value="i am input">
試驗1

試驗2:

<style>
  *{margin: 0; padding: 0;}
  body{ line-height: 50px; }
  input{ line-height: 30px; }
</style>

<input type="text" value="i am input">
試驗2

明顯可以看到,input除了hidden類型外,其他都屬于inline-block,也就是行內(nèi)元素,對塊級元素body設(shè)置行高,作為子元素的input會有一個相對的最小line box高度(其實是繼承)。但是,對行內(nèi)元素input設(shè)置行高就不一定有效了,關(guān)鍵在于是否擁有(匿名)行內(nèi)子元素。input:textinput:password(其實file也有,不過很奇葩)都能輸入文本,里面的文本內(nèi)容可以看做是input的匿名行內(nèi)子元素,它也可以撐開一個inline box。同理,textarea也一樣,只不過textarea可換行,擁有多個inline boxes。
總而言之,就是要看容器內(nèi)有沒有匿名行內(nèi)元素啦!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標(biāo)簽?zāi)J(rèn)的外補...
    _Yfling閱讀 14,168評論 1 92
  • 參考文章:深入了解CSS的line-height屬性Vertical-Align: 你需要知道的所有事【譯】Ver...
    若邪Y閱讀 3,568評論 1 6
  • 閱讀目錄移動開發(fā)基本知識點 calc基本用法box-sizing的理解及使用理解display:box的布局理解f...
    張憲宇閱讀 1,684評論 0 1
  • 移動開發(fā)基本知識點 一.使用rem作為單位 html { font-size: 100px; } @media(m...
    橫沖直撞666閱讀 3,734評論 0 6
  • 今夜有雨,悲歡如樊籬四圍 困我于寥落長街 孤單令人無所適從,令人心生懷念 卻顧所來徑啊 那些措手不及的天氣,時局和...
    念念相續(xù)1閱讀 1,064評論 3 5

友情鏈接更多精彩內(nèi)容