css中的px、em、rem 詳解

BothEyes1993發表於2019-03-04

概念介紹:

1、px (pixel,畫素):

是一個虛擬長度單位,是計算機系統的數字化影像長度單位,如果px要換算成物理長度,需要指定精度DPI(Dots Per Inch,每英寸畫素數),在掃描列印時一般都有DPI可選。Windows系統預設是96dpi,Apple系統預設是72dpi。

2、em(相對長度單位,相對於當前物件內文字的字型尺寸):

是一個相對長度單位,最初是指字母M的寬度,故名em。現指的是字元寬度的倍數,用法類似百分比,如:0.8em, 1.2em,2em等。通常1em=16px。

3、pt (point,磅):

是一個物理長度單位,指的是72分之一英寸。pt=1/72(英寸), px=1/dpi(英寸)

4、rem(root em,根em):

是CSS3新增的一個相對單位,這個單位引起了廣泛關注。這個單位與em有什麼區別呢?區別在於使用rem為元素設定字型大小時,仍然是相對大小,但相對的只是HTML根元素。這個單位可謂集相對大小和絕對大小的優點於一身,通過它既可以做到只修改根元素就成比例地調整所有字型大小,又可以避免字型大小逐層複合的連鎖反應。目前,除了IE8及更早版本外,所有瀏覽器均已支援rem。對於不支援它的瀏覽器,應對方法也很簡單,就是多寫一個絕對單位的宣告。這些瀏覽器會忽略用rem設定的字型大小。

1、em與px的問題

px是何物?

px畫素(Pixel)。相對長度單位。畫素px是相對於顯示器螢幕解析度而言的。(引自CSS2.0手冊)
em是相對長度單位。相對於當前物件內文字的字型尺寸。如當前對行內文字的字型尺寸未被人為設定,則相對於瀏覽器的預設字型尺寸。(引自CSS2.0手冊)
PX特點

  1. IE無法調整那些使用px作為單位的字型大小;
  2. 國外的大部分網站能夠調整的原因在於其使用了em或rem作為字型單位;
  3. Firefox能夠調整px和em,rem,但是96%以上的中國網民使用IE瀏覽器(或核心)。
em是何物?

em 指字型高,任意瀏覽器的預設字型高都是16px。所以未經調整的瀏覽器都符合: 1em=16px。那麼12px=0.75em, 10px=0.625em。為了簡化font -size的換算,需要在css中的body選擇器中宣告Font-size=62.5%,這就使em值變為16px*62.5%=10px, 這樣12px=1.2em, 10px=1em, 也就是說只需要將你的原來的px數值除以10,然後換上em作為單位就行了。

em特點:

1em指的是一個字型的大小,它會繼承父級元素的字型大小,因此並不是一個固定的值。任何瀏覽器的預設字型大小都是16px。因此,12px = 0.75em。實際應用中為了方便換算,通常會如下設定樣式:
CSS程式碼

html { font-size: 62.5%; }
複製程式碼

這樣,1em = 10px。我們常用的1.2em理論上就是12px。但是,這個換算在IE瀏覽器下不成立,1.2em會比12px稍大一些,解決辦法是把html標籤樣式中的62.5%改成63%,即:
CSS程式碼

html { font-size: 63%; }
複製程式碼

在 中文的文章中,一般會在段首空兩格。如果用px作為單位,對12px字型來說需要空出24px,對14px字型來說需要空出28px……這樣換算非常不通 用。如果用上em單位,這個問題就很好解決了,1個字的大小就是1em,那兩個字的大小就是2em。因此,只需這樣定義就行了:
CSS程式碼

p { text-indent: 2em; }
複製程式碼

em和px兩種字型單位的區別

字型單位應該用em而不用px,原因簡單來說就是支援IE6下的字型縮放,在頁面中按ctrl+滾輪,字型以px為單位的網站沒有反應。px是絕對單位,不支援IE的縮放,em是相對單位。
我在調整本blog的時候,發現不僅僅是字型,將行距(line-height),和縱向高度的單位都用em。保證縮放時候的整體性。

em有如下特點:
  1. em的值並不是固定的;
  2. em會繼承父級元素的字型大小。
em重寫步驟:
  1. body選擇器中宣告Font-size=62.5%;
  2. 將你的原來的px數值除以10,然後換上em作為單位;
    簡 單吧,如果只需要以上兩步就能解決問題的話,可能就沒人用px了。經過以上兩步,你會發現你的網站字型大得出乎想象。因為em的值不固定,又會繼承父級 元素的大小,你可能會在content這個div裡把字型大小設為1.2em, 也就是12px。然後你又把選擇器p的字型大小也設為1.2em,但如果p屬於content的子級的話,p的字型大小就不是12px,而是1.2em= 1.2 * 12px=14.4px。這是因為content的字型大小被設為1.2em,這個em值繼承其父級元素body的大小,也就是16px * 62.5% * 1.2=12px, 而p作為其子級,em則繼承content的字型高,也就是12px。所以p的1.2em就不再是12px,而是14.4px。
  3. 重新計算那些被放大的字型的em數值。避免字型大小的重複宣告,也就是避免以上提到的1.2 * 1.2= 1.44的現象。比如說你在#content中宣告瞭字型大小為1.2em,那麼在宣告p的字型大小時就只能是1em,而不是1.2em, 因為此em非彼em,它因繼承#content的字型高而變為了1em=12px。
IE中的12px漢字:

完成 em轉換時還發現了一個詭異的現象,就是由以上方法得到的12px(1.2em)大小的漢字在IE中並不等於直接用12px定義的字型大小,而 是稍大一點。你只需在body選擇器中把62.5%換成63%就能正常顯示了。原因可能是IE處理漢字時,對於浮點的取值精確度有 限。本現象只發生在12px的漢字,英文不存在此現象。解決方法就是把style.css中的62.5%換 為63%。

一個px、em、pt單位轉換工具:

地址:pxtoem.com/

2、rem特點

rem是CSS3新增的一個相對單位(root em,根em),這個單位引起了廣泛關注。這個單位與em有什麼區別呢?區別在於使用rem為元素設定字型大小時,仍然是相對大小,但相對的只是HTML根元素。這個單位可謂集相對大小和絕對大小的優點於一身,通過它既可以做到只修改根元素就成比例地調整所有字型大小,又可以避免字型大小逐層複合的連鎖反應。目前,除了IE8及更早版本外,所有瀏覽器均已支援rem。對於不支援它的瀏覽器,應對方法也很簡單,就是多寫一個絕對單位的宣告。這些瀏覽器會忽略用rem設定的字型大小。
舉例:

p {font-size:14px; font-size:.875rem;}
複製程式碼

注意:
選擇使用什麼字型單位主要由你的專案來決定,如果你的使用者群都使用最新版的瀏覽器,那推薦使用rem,如果要考慮相容性,那就使用px,或者兩者同時使用。

3、字型換算表

字號 pt px em
初號 42pt 56px 3.5em
小初 36pt 48px 3em
34pt 45px 2.75em
32pt 42px 2.55em
30pt 40px 2.45em
29pt 38px 2.35em
28pt 37px 2.3em
27pt 36px 2.25em
一號 26pt 35px 2.2em
25pt 34px 2.125em
小一 24pt 32px 2em
二號 22pt 29px 1.8em
20pt 26px 1.6em
小二 18pt 24px 1.5em
17pt 23px 1.45em
三號 16pt 22px 1.4em
小三 15pt 21px 1.3em
14.5pt 20px 1.25em
四號 14pt 19px 1.2em
13.5pt 18px 1.125em
13pt 17px 1.05em
小四 12pt 16px 1em
11pt 15px 0.95em
五號 10.5pt 14px 0.875em
10pt 13px 0.8em
小五 9pt 12px 0.75em
8pt 11px 0.7em
六號 7.5pt 10px 0.625em
7pt 9px 0.55em
小六 6.5pt 8px 0.5em
七號 5.5pt 7px 0.4375em
八號 5pt 6px 0.375em

相關文章