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
  • .Net8.0 Blazor Hybird 桌面端 (WPF/Winform) 實測可以完整運行在 win7sp1/win10/win11. 如果用其他工具打包,還可以運行在mac/linux下, 傳送門BlazorHybrid 發佈為無依賴包方式 安裝 WebView2Runtime 1.57 M ...
  • 目錄前言PostgreSql安裝測試額外Nuget安裝Person.cs模擬運行Navicate連postgresql解決方案Garnet為什麼要選擇Garnet而不是RedisRedis不再開源Windows版的Redis是由微軟維護的Windows Redis版本老舊,後續可能不再更新Garne ...
  • C#TMS系統代碼-聯表報表學習 領導被裁了之後很快就有人上任了,幾乎是無縫銜接,很難讓我不想到這早就決定好了。我的職責沒有任何變化。感受下來這個系統封裝程度很高,我只要會調用方法就行。這個系統交付之後不會有太多問題,更多應該是做小需求,有大的開發任務應該也是第二期的事,嗯?怎麼感覺我變成運維了?而 ...
  • 我在隨筆《EAV模型(實體-屬性-值)的設計和低代碼的處理方案(1)》中介紹了一些基本的EAV模型設計知識和基於Winform場景下低代碼(或者說無代碼)的一些實現思路,在本篇隨筆中,我們來分析一下這種針對通用業務,且只需定義就能構建業務模塊存儲和界面的解決方案,其中的數據查詢處理的操作。 ...
  • 對某個遠程伺服器啟用和設置NTP服務(Windows系統) 打開註冊表 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpServer 將 Enabled 的值設置為 1,這將啟用NTP伺服器功 ...
  • title: Django信號與擴展:深入理解與實踐 date: 2024/5/15 22:40:52 updated: 2024/5/15 22:40:52 categories: 後端開發 tags: Django 信號 松耦合 觀察者 擴展 安全 性能 第一部分:Django信號基礎 Djan ...
  • 使用xadmin2遇到的問題&解決 環境配置: 使用的模塊版本: 關聯的包 Django 3.2.15 mysqlclient 2.2.4 xadmin 2.0.1 django-crispy-forms >= 1.6.0 django-import-export >= 0.5.1 django-r ...
  • 今天我打算整點兒不一樣的內容,通過之前學習的TransformerMap和LazyMap鏈,想搞點不一樣的,所以我關註了另外一條鏈DefaultedMap鏈,主要調用鏈為: 調用鏈詳細描述: ObjectInputStream.readObject() DefaultedMap.readObject ...
  • 後端應用級開發者該如何擁抱 AI GC?就是在這樣的一個大的浪潮下,我們的傳統的應用級開發者。我們該如何選擇職業或者是如何去快速轉型,跟上這樣的一個行業的一個浪潮? 0 AI金字塔模型 越往上它的整個難度就是職業機會也好,或者說是整個的這個運作也好,它的難度會越大,然後越往下機會就會越多,所以這是一 ...
  • @Autowired是Spring框架提供的註解,@Resource是Java EE 5規範提供的註解。 @Autowired預設按照類型自動裝配,而@Resource預設按照名稱自動裝配。 @Autowired支持@Qualifier註解來指定裝配哪一個具有相同類型的bean,而@Resourc... ...