CSS line-height淺析(1)

来源:http://www.cnblogs.com/cc156676/archive/2016/07/15/5673403.html
-Advertisement-
Play Games

一、line-height的定義 line-height,行高,是指文本行基線間的垂直距離。 1. 什麼是基線? 一般而言,一個文本行一共有四條線,從上到下依次為頂線、中線、基線、底線;在英文中,基線為小寫 x 字母下邊緣所在的那條線。如圖: 註意,基線的位置與字體有關,不同的字體基線的位置有偏差。 ...


一、line-height的定義

line-height,行高,是指文本行基線間的垂直距離。

1.    什麼是基線?

一般而言,一個文本行一共有四條線,從上到下依次為頂線、中線、基線、底線;在英文中,基線為小寫 x 字母下邊緣所在的那條線。如圖:

註意,基線的位置與字體有關,不同的字體基線的位置有偏差。

2.    既然行高是指基線間的垂直距離,那麼單行文本有沒有行高?

當然是有的!答案在下麵。。。

3.    行高控制行間距。

在多行文本中,第一行文本根據文本的字體和字型大小顯示,並因此確定了第一行的基線;在此基礎上,根據line-height的值,確定第二行基線的所在位置,在那個位置之上顯示第二行文本。

在這個機制之下,可以推斷出line-height控制行間距,行間距是文本行之間超出字體大小的額外空間。換句話說,line-height與font-size之差就是行間距;如果line-height的值小於font-size,也就是說行間距為負,就會導致後一行文本與前一行文本重疊。

line-height在應用到塊級元素時,定義的是基線間的最小距離。所以在有多個<p>元素的情況下,即使line-height小於font-size,單個<p>元素中的不同行會重疊,而<p>元素之間卻不會重疊。

 比如這樣:

 1 <!DOCTYPE html>
 2 <html lang="en">
 3     <head>
 4         <style>
 5         body {
 6             width:800px;
 7             line-height: 10px;
 8         }
 9         </style>
10     </head>
11     <body>
12         <p>In CSS, leading refers to the difference between the content height and the value of the line-height property. 
13         Half the leading is called the half-leading. 
14         User agents center glyphs vertically in an inline box, which adds half-leading on the top and bottom. </p>
15         <p>For example, if a piece of text is "12pt" high and the line-height value is "14pt", 
16         2pt of extra space should be added: 1pt above and 1pt below the text .</p>
17         <p>this applies to empty boxes as well, as if the empty box contained zero-height text</p>
18     </body>
19 </html>

其頁面效果為:

可以很明顯地看到,由於line-height小於font-size,<p>元素內部各行有重疊現象,但是<p>元素之間顯示正常。

 

二、行內框與行框

1.    內容區(content area):頂線與底線包圍的區域,其高度與字體和字型大小相關(可粗略等於font-size的值),與行高沒有半毛錢關係

2.    行內框(inline boxes):

每個行內元素都會生成一個行內框,行內框是一個瀏覽器渲染模型中的一個概念,無法顯示出來,在沒有其他因素影響的時候(比如line-height),行內框等於內容區。

(然而line-height無處不在)設定line-height之後,將半行距【(行高-字體大小)/2】分別增加到內容區的上下兩邊,得到一個行內框。

3.    行框(line boxes):一旦給定的某一行已經生成了所有的行內框,行框的構造就會考慮這些行內框,使行框的高度足以包含最高行內框的頂端和最低行內框的底端。

4.    包含盒子(containing box):由一行一行的行框組成。

 

請看如下代碼: 

 1 <!DOCTYPE html>
 2 <html lang="en">
 3     <head>
 4         <style>
 5         p {
 6             font-size: 32px;
 7             line-height: normal;
 8             border: 1px solid red;
 9         }
10         </style>
11     </head>
12     <body>
13         <p>What kind of color this para will be?</p>
14     </body>
15 </html>

為了頁面效果比較明顯,所以將font-size設置為32px;當line-height的值為normal時,頁面效果如下圖:

如果我們改變line-height的值,比如將line-height的值設為0,其頁面效果為:

如果我們再次改變line-height的值,設置為10px,頁面效果為:

再試一下,將line-height的值設為60px,頁面效果為:

border為什麼會有這些變化?

font-size為32px,內容區的高度也就是32px;而line-height為0,那麼半行距就是-16px;將-16px分別加到內容區的上下部分,剛好抵消了所有內容區的高度,從而行內框的高度變成0;行框的高度也相應為0,於是就有了一個水平線的邊框。如果line-height為10px;半行距就是-11px,將-11px分別加到內容區的上下部分,從而行內框的高度就變成了10px;行框的高度也相應為10px。同理,當line-height為60px,行框的高度為60px。

於是,我們驚奇地發現,在文本行中,line-height確定了行內框的高度,以此為基準確定了行框的高度;因此,行內元素的高度是由line-height決定的,並不是由元素中的文本撐開的。 

下麵來解決上面遺留的問題,單行文本有行高嗎?

解決這個問題之前,先明確兩點:

1.    行高由於其繼承性,影響無處不在,即使單行文本也不例外。

2.    行高只是幕後黑手,行內框高度是由內容區和行間距表現的,只不過其值正好等於行高。

(行高決定了行內框高度,行內框高度通過內容區和行間距表現出來;行間距牆頭草,可大可小,可正可負,保證行內框高度等於行高。)

所以,在單行文本中,行內框高度通過內容區和行間距表現出來,而行內框高度等於行高,所以單行文本有行高???

(關於單行文本的行高,此處我也沒寫清楚,具體可見本系列之三,有詳細說明。)

 

三、line-height屬性的值

1.    normal;不同的瀏覽器有不同的預設值,且與字體有關,正因為如此,一般會在body元素中reset。

2.    number;根據當前元素font-size的值計算。

3.    percentage和em。

下麵通過一個例子來說明用number、percentage和em的區別:

假設父元素的font-size為20px,line-height為1.5;子元素的font-size為14px;在繼承時,子元素會繼承縮放因數1.5,於是子元素的行高為14*1.5=21px。

假設父元素的font-size為20px,line-height為150%或者1.5em;子元素的font-size為14px;在繼承時,子元素會繼承20*1.5=30px,於是子元素的行高為30。

簡單比較可以發現,使用percentage/em時,繼承的行高是一個計算數值(而且是一個絕對數值,不可變),而使用number時,繼承的是一個縮放因數,使子元素能夠根據自己的字體大小去計算它的行高;很明顯,設置line-height時使用number靈活性更高

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • CSS(Cascading Style Sheet,層疊樣式表),及其精巧且富有表達力,開發者可以用最為高效的方式高度掌控網頁內容的表示。 1. 盒模型 CSS中的一個基本概念是盒模型(box model)。可見元素會在頁面中占據一個矩形區域,該區域會在頁面中占據一個矩形區域,該區域就是元素的盒子, ...
  • × 目錄 [1]條件語句 [2]迴圈語句 [3]跳轉語句 前面的話 預設情況下,javascript解釋器依照語句的編寫順序依次執行。而javascript中的很多語句可以改變語句的預設執行順序。本文介紹可以改變語句預設執行順序的條件語句、迴圈語句和跳轉語句 條件語句 腳本的威力體現在它們可以根據人 ...
  • 開發者工具 現在一般的瀏覽器都內置了開發者工具,快捷鍵F12可以打開,如Chrome瀏覽器下,Sources面板下找到對應的js文件 這是首選方法,但是對於SPA程式(比如easyui),可能找不到內嵌頁面。所以如果是SPA程式,可能要想其它方法。 vs下在js代碼處斷點 這種方法對於SPA內嵌頁面... ...
  • ...
  • 上一篇僅僅考慮了純文本的情況,現在,來探討一下圖像。 首先,請看如下代碼: 其效果圖是這樣的: 可以看到,圖像的下邊緣依然有一些背景顏色,極其影響頁面的美觀,那麼,這些紅色背景是怎麼來的呢? 如果我們改變line-height的值,會發現圖像下邊緣的紅色背景區域也會跟著變化,比如將line-heig ...
  • 一、浮動(float)對內聯元素的影響。 1.我們都知道,內聯元素(例如:span/img/input...)在正常情況下不可以對其設置寬高的,它的大小之只和它內部內容的多少有關。 我們怎樣才可以對其設置寬、高呢?可以用display:block;或者display:inline-block;讓它轉 ...
  • 源代碼如下: <!DOCTYPE html><html><head> <title>xi</title> <meta charset="utf-8"> <style type="text/css"> .ww{ width: 70px; height: 70px; background: red; b ...
  • 1. rem單位方式,用法當前像素除以100。 2. px單位方式,以640px設計圖比例實現。 3.px單位方式,以設計圖640除以2實現。 4.px單位方式及media媒體查詢方式實現,判斷最大、最小方式實現,設計圖還是640標準。 註,第一種、二種方式是現在比較好用的 ...
一周排行
    -Advertisement-
    Play Games
  • 基於.NET Framework 4.8 開發的深度學習模型部署測試平臺,提供了YOLO框架的主流系列模型,包括YOLOv8~v9,以及其系列下的Det、Seg、Pose、Obb、Cls等應用場景,同時支持圖像與視頻檢測。模型部署引擎使用的是OpenVINO™、TensorRT、ONNX runti... ...
  • 十年沉澱,重啟開發之路 十年前,我沉浸在開發的海洋中,每日與代碼為伍,與演算法共舞。那時的我,滿懷激情,對技術的追求近乎狂熱。然而,隨著歲月的流逝,生活的忙碌逐漸占據了我的大部分時間,讓我無暇顧及技術的沉澱與積累。 十年間,我經歷了職業生涯的起伏和變遷。從初出茅廬的菜鳥到逐漸嶄露頭角的開發者,我見證了 ...
  • C# 是一種簡單、現代、面向對象和類型安全的編程語言。.NET 是由 Microsoft 創建的開發平臺,平臺包含了語言規範、工具、運行,支持開發各種應用,如Web、移動、桌面等。.NET框架有多個實現,如.NET Framework、.NET Core(及後續的.NET 5+版本),以及社區版本M... ...
  • 前言 本文介紹瞭如何使用三菱提供的MX Component插件實現對三菱PLC軟元件數據的讀寫,記錄了使用電腦模擬,模擬PLC,直至完成測試的詳細流程,並重點介紹了在這個過程中的易錯點,供參考。 用到的軟體: 1. PLC開發編程環境GX Works2,GX Works2下載鏈接 https:// ...
  • 前言 整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本為 v11 最新的版本。 開源項目 從零手寫實現 tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。 系列文章 web server apache tomcat11-01-官方文檔入門介紹 web serv ...
  • 1、jQuery介紹 jQuery是什麼 jQuery是一個快速、簡潔的JavaScript框架,是繼Prototype之後又一個優秀的JavaScript代碼庫(或JavaScript框架)。jQuery設計的宗旨是“write Less,Do More”,即倡導寫更少的代碼,做更多的事情。它封裝 ...
  • 前言 之前的文章把js引擎(aardio封裝庫) 微軟開源的js引擎(ChakraCore))寫好了,這篇文章整點js代碼來測一下bug。測試網站:https://fanyi.youdao.com/index.html#/ 逆向思路 逆向思路可以看有道翻譯js逆向(MD5加密,AES加密)附完整源碼 ...
  • 引言 現代的操作系統(Windows,Linux,Mac OS)等都可以同時打開多個軟體(任務),這些軟體在我們的感知上是同時運行的,例如我們可以一邊瀏覽網頁,一邊聽音樂。而CPU執行代碼同一時間只能執行一條,但即使我們的電腦是單核CPU也可以同時運行多個任務,如下圖所示,這是因為我們的 CPU 的 ...
  • 掌握使用Python進行文本英文統計的基本方法,並瞭解如何進一步優化和擴展這些方法,以應對更複雜的文本分析任務。 ...
  • 背景 Redis多數據源常見的場景: 分區數據處理:當數據量增長時,單個Redis實例可能無法處理所有的數據。通過使用多個Redis數據源,可以將數據分區存儲在不同的實例中,使得數據處理更加高效。 多租戶應用程式:對於多租戶應用程式,每個租戶可以擁有自己的Redis數據源,以確保數據隔離和安全性。 ...