1. 程式人生 > >px,em,rem 解釋精透

px,em,rem 解釋精透

你可能已經很熟練使用這兩個靈活的單位,但你可能不完全瞭解何時使用rem,何時使用em。 本教程將幫你弄清楚!

em和rem都是相對單位,由瀏覽器轉換為畫素值,具體取決於您的設計中的字型大小設定。 如果你使用值1em或1rem,它可以被瀏覽器解析成 從16px到160px或其他任意值。

何時使用 Em 與 Rem

padding設定了1em

何時使用 Em 與 Rem

解析出來的值為16px

何時使用 Em 與 Rem

padding設定了1em

何時使用 Em 與 Rem

解析出來的值為160px

另一方面,瀏覽器使用px值,所以1px將始終顯示為完全1px。

滑動滑塊試試這個 CodePen 例子,你可以看到rem和em單位的值可以轉化為不同的畫素值,而px單位保持固定大小:

最大問題

使用em和rem單位可以讓我們的設計更加靈活,能夠控制元素整體放大縮小,而不是固定大小。 我們可以使用這種靈活性,使我們在開發期間,能更加快速靈活的調整,允許瀏覽器使用者調整瀏覽器大小來達到最佳體驗。

em和rem單位提供的這種靈活性和工作方式都很相似,所以最大的問題是,我們何時應使用em值,何時應使用rem值呢?

主要區別

em和rem單位之間的區別是瀏覽器根據誰來轉化成px值 理解這種差異是決定何時使用哪個單元的關鍵。

我們要通過複習rem和em單位如何工作,來確保你知道每一個細節。 然後我會講到為什麼你應該使用em或rem的單位。

最後,我們會看看到底哪些典型元素的設計,你應該在實際應用中使用哪種型別的單位。

rem 單位如何轉換為畫素值

當使用rem單位,他們轉化為畫素大小取決於頁根元素的字型大小,即html元素的字型大小。 根元素字型大小乘以你rem值。

例如,根元素的字型大小16px,10rem將等同於160px,即10 x 16 = 160。

何時使用 Em 與 Rem

CSS設定padding為10rem

何時使用 Em 與 Rem

瀏覽器解析出來的值為160px

em 單位如何轉換為畫素值

當使用em單位時,畫素值將是em值乘以使用em單位的元素的字型大小。

例如,如果一個div有18px字型大小,10em將等同於180px,即10 × 18 = 180。

何時使用 Em 與 Rem

CSS設定padding為10em

何時使用 Em 與 Rem

瀏覽器解析出來的值為180px(或接近它)

重點理解:

有一個比較普遍的誤解,認為em單位是相對於父元素的字型大小。 事實上,根據 W3標準 ,它們是相對於使用em單位的元素的字型大小。

父元素的字型大小可以影響em值,但這種情況的發生,純粹是因為繼承。 讓我們看看為什麼以及如何起作用。

Em 單位的繼承效果

使用em單位存在繼承的時候,情況會變得比較棘手,因為每個元素將自動繼承其父元素的字型大小。 繼承效果只能被明確的字型單位覆蓋,比如px,vw。

使用em單位的元素字型大小根據它們來定。 但該元素可能繼承其父元素的字型大小,而父元素又繼承其父元素的字型大小,等等。 因此,以em為單位的元素字型大小可能會受到其任何父元素的字型大小影響。

讓我們看看一個例子。 在下面的 CodePen 單步執行試試。 隨著你的前進,使用 Chrome 開發工具或 Firebug 為火狐瀏覽器來檢查我們的em單位計算到的畫素值。

Em 繼承的例子

如果我們的根元素字型大小為16px(通常是預設值) 一個子元素div裡面padding值為1.5em,該div將從根元素繼承字型大小16px。 因此padding會解析成24px,即1.5 x 16 = 24。

如果我們加多一個div來包裹原先的div,然後設定其字型大小為1.25em呢?

我們包裹的div繼承根元素字型大小16px,並乘以它自己的1.25em的字型大小。 這將設定包裹div字型大小為20px,即1.25 x 16 = 20。

現在我們原始的div不再直接從根元素繼承,而是從其新的父元素繼承字型大小為20px 1.5em其padding值現在等於30px,即1.5 x 20 = 30。

這個繼承效應可以更復雜,如果我們向我們原始的div新增em字型單位,比方說1.2em。

div從其父級繼承20px字型大小,然後,乘以它自己的1.2em設定,給它24px,即1.2 × 20 = 24新字型大小。

div上1.5em的padding現在將再次改變大小,用新的字型大小,36px,即1.5 × 24 = 36。

最後,為了進一步說明那個em單位是相對於他們最終獲得(不是父元素)的字型大小,讓我們來看看設定padding: 1.5em如果我們顯式設定div使用14px值,不繼承字型大小會發生什麼。

現在,我們的padding為21px,即1.5 x 14 = 21已經變小了。 它不受父元素的字型大小。

由於存在著這些隱患,你可以看到為什麼必須知道如何正確管理使用em單位。

瀏覽器設定 HTML 元素字型大小的影響

預設情況下瀏覽器通常有字型大小16px,但這可以被使用者更改為從9px到72px的任何值。

何時使用 Em 與 Rem

你需要知道的:

根html元素將繼承瀏覽器中設定的字型大小,除非顯式設定固定值去覆蓋。

所以html元素的字型大小雖然是直接確定rem值,但字型大小可能首先來自瀏覽器設定。

因此瀏覽器的字型大小設定可以影響每個使用rem單元以及每個通過em單位繼承的值。

沒有設定 HTML 字型大小時,瀏覽器設定起作用

除非重寫,否則它將繼承瀏覽器預設設定的字型大小。 例如,讓我們把網站的html元素沒有設定font-size值。

如果使用者讓他們的瀏覽器預設字型大小為16px,那麼根元素字型大小將為16px。 在 Chrome 開發工具下,你可以在已計算選項卡下看到一個元素繼承的屬性。

何時使用 Em 與 Rem

在這種情況下10rem等於160px,即10 x 16 = 160。

如果使用者將其瀏覽器中的預設字型大小調為18px,根字型大小變成18px。 現在10rem轉換為180px,即10 × 18 = 180。

何時使用 Em 與 Rem

瀏覽器將調整使用 em 單位的 HTML 元素字型大小

當em單位設定在html元素上時,它將轉換為em值乘以瀏覽器字型大小的設定。

例如,如果網站的html元素的字型大小屬性設定為1.25em,根元素字型大小將為1.25倍的瀏覽器的字型大小設定。

如果瀏覽器字型大小被設定為16px,根字型大小會出來為20px,即1.25 x 16 = 20。

何時使用 Em 與 Rem

在這種情況下10rem將等於200px,即10 × 20 = 200。

何時使用 Em 與 Rem

所以,如果瀏覽器字型大小被設定為20px,根元素字型大小會解析成25px,即1.25 × 20 = 25。

何時使用 Em 與 Rem

現在10rem將等於250px,即10 × 25 = 250。

何時使用 Em 與 Rem

總結 rem與 em 差異

上述所有歸結如下:

  • rem單位翻譯為畫素值是由html元素的字型大小決定的。 此字型大小會被瀏覽器中字型大小的設定影響,除非顯式重寫一個具體單位。
  • em單位轉為畫素值,取決於他們使用的字型大小。 此字型大小受從父元素繼承過來的字型大小,除非顯式重寫與一個具體單位。

為什麼使用 rem 單位:

rem單位提供最偉大的力量並不僅僅是他們提供一致尺寸而不是繼承。 相反,它給我們的一個途經去獲取使用者的偏好來影響網站中每一處使用rem的元素大小,不再是使用固定的px單位。

為此,使用rem單位的主要目的應該是確保無論使用者如何設定自己的瀏覽器,我們的佈局都能調整到合適大小。

一個站點最初設計可以專注於最常見的預設瀏覽器中字型大小16px。

何時使用 Em 與 Rem

使用瀏覽器預設字號16px

但是,通過使用rem單位,如果使用者調整其字型大小,我們也能保證佈局的完整性,使用較小的文字避免文字空間被壓扁了。

何時使用 Em 與 Rem

瀏覽器解析的字號為34px。

如果使用者縮小其字型大小,整個佈局掉下來,空白區域中的文字也不會想得很無力。

何時使用 Em 與 Rem

瀏覽器字型大小 9px

使用者會因為各種各樣的原因更改字型大小設定。 容納這些設定可以獲得更好的使用者體驗。

重要的是:

一些設計師使用結合rem單位的方式給html元素設定了一個固定的px單位。 這是很普遍的做法,所以改變html元素的字型大小時,可以使整個頁面做相應調整

我強烈反對種做法,因為它重寫繼承了使用者設定的瀏覽器字型大小。 更誇張的說,這剝削了使用者自行調整以獲得最佳視覺效果的能力。

如果您確實需要更改 html 元素的字型大小,那麼就使用em,rem單位,這樣根元素的值還會是使用者瀏覽器字型大小的乘積。

這將允許您通過更改您的html元素的字型大小,調整你的設計,但仍會保留使用者的瀏覽器設定的效果。

為什麼使用 em 單位

em單位取決於一個font-size值而非html元素的字型大小。

為此,em單位的主要目的應該是允許保持在一個特定的設計元素範圍內的可擴充套件性。

例如,您可能使用em值設定導航選單項的padding、margin,line-height等值。

何時使用 Em 與 Rem

帶有0.9rem字型大小的選單

通過這種方式,如果您更改選單的字型大小選單項周圍的間距將在剩餘的空間按比例縮放。

何時使用 Em 與 Rem

帶有1.2rem字型大小的選單

前面一節中你看到em單位如何變得不可收拾。 為此,我建議只在你標識清楚的情況下使用em單位。

實際應用

一些 Web 設計師之間存在辯論,我相信不同的人有不同的首選的方法,但我的建議是,如下所示。

使用 em 單位:

根據某個元素的字型大小做縮放而不是根元素的字型大小。

一般來說,你需要使用em單位的唯一原因是縮放沒有預設字型大小的元素。

根據我們上面的例子,設計元件比如按鈕,選單和標題可能會有自己明確的字型大小。 當你修改字型大小的時候,你希望整個元件都適當縮放。

通用屬性這一準則將適用於在非預設字型大小的元素上的padding、margin、width、height和line-height等值。

我建議,當您使用em單位,他們使用的元素的字型大小應設定對rem單位,以保留的可擴充套件性,但避免繼承混淆。

通常不使用em單位控制字型大小

我們經常會看到使用em作為字型大小單位,特別是標題,當我認為如果使用rem將更具可擴充套件性。

標題經常使用em單位的原因是他們相比px單位,在相對常規文字大小方面更出色。 然而rem單位同樣也可以實現這一目標。 如果html元素上任何字型大小調整,標題大小仍會縮放。

請嘗試更改下面的 CodePen,看看html元素上的em字型大小如何起作用:

少部分情況下,我們不想我們的字型大小根據根元素做調整,只有幾個例外的情況。

我們可以想到的例子是一個使用em字型大小的下拉選單,我們有第二個級別的選單項文字大小取決於第一級字型大小。 另一個例子可能是用在按鈕裡面的字型圖示,字型圖示的大小跟按鈕的文字大小有關。

然而,大多數 Web 設計中的元素往往不會有這種型別的要求,所以一般使用rem單位的字型大小,em單位只在特殊的情況下使用。

使用 rem 單位:

不需要em單位,並且根據瀏覽器的字型大小設定縮放的任何尺寸。

這幾乎在一個標準的設計中佔據了一切,包括height,width,padding,margin,border,font-size,shadows,幾乎包括你佈局的每部分。

簡單地說,一切可擴充套件都應該使用rem單位。

小技巧

建立佈局時,往往要以畫素為單位更方便,但部署時應使用rem單位。

或者,您可以使用 PXtoEM 手動做您的轉換。

始終使用 rem 單位做媒體查詢

特別注意,當使用rem單位建立統一可擴充套件的設計,媒體查詢也應該是rem單位。 這將確保,無論使用者瀏覽器的字型大小,您的媒體查詢會對它作出反應和調整您的佈局。

例如,如果使用者縮放文字非常高,您的佈局可能需要從兩列到單個列調整,因為它可能會在較小的移動裝置上顯示。

如果您的斷點在固定的畫素寬度,只有不同的視口的大小可以觸發它們。 但是基於rem的斷點他們將響應不同的字型大小。

不要使用 em 或 rem :

多列布局

佈局中的列寬通常應該是%,因此他們可以流暢適應無法預知大小的視區。

然而單一列一般仍然應使用rem值來設定最大寬度。

例如:

.container { width: 100%; max-width: 75rem; } 

這保持列的靈活,可擴充套件。又能防止變得太寬了。

當元素應該是嚴格不可縮放的時候

在一個典型的 Web 設計的過程中,不會有很多部分的你不能使用伸縮性設計的佈局。 不過偶爾你會遇到真的需要使用顯式的固定的值,以防止縮放的元素。

採用固定的尺寸值的前提應該是,如果被縮放的話,它的結構會被打碎。 這真的不常出現,所以你想拿出那些px單位之前,問問自己是否使用它們是絕對必要的。

總結

讓我們以一個快速符號點概括我們介紹的內容:

  • rem和em單位是由瀏覽器基於你的設計中的字型大小計算得到的畫素值。
  • em單位基於使用他們的元素的字型大小。
  • rem單位基於html元素的字型大小。
  • em單位可能受任何繼承的父元素字型大小影響
  • rem單位可以從瀏覽器字型設定中繼承字型大小。
  • 使用em單位應根據元件的字型大小而不是根元素的字型大小。
  • 在不需要使用em單位,並且需要根據瀏覽器的字型大小設定縮放的情況下使用rem。
  • 使用rem單位,除非你確定你需要em單位,包括對字型大小。
  • 媒體查詢中使用rem單位
  • 不要在多列布局中使用em或rem,改用%。
  • 不要使用em或rem,如果縮放會不可避免地導致要打破布局元素。

我希望你現在已經建立了強健的、 完整的圖片,到底em和rem的單位如何工作,並通過,知道如何最好地利用他們在你的設計中。