何時使用 Em 與 Rem
你可能已經很熟練使用這兩個靈活的單位,但你可能不完全了解何時使用rem,何時使用em。 本教程將幫你弄清楚!
em和rem都是相對單位,由瀏覽器轉換為像素值,具體取決于您的設計中的字體大小設置。 如果你使用值1em或1rem,它可以被瀏覽器解析成 從16px到160px或其他任意值。
padding設置了1em
解析出來的值為16px
padding設置了1em
解析出來的值為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。
CSS設置padding為10rem
瀏覽器解析出來的值為160px
em 單位如何轉換為像素值
當使用em單位時,像素值將是em值乘以使用em單位的元素的字體大小。
例如,如果一個div有18px字體大小,10em將等同于180px,即10 × 18 = 180。
CSS設置padding為10em
瀏覽器解析出來的值為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的任何值。
你需要知道的:
根html元素將繼承瀏覽器中設置的字體大小,除非顯式設置固定值去覆蓋。
所以html元素的字體大小雖然是直接確定rem值,但字體大小可能首先來自瀏覽器設置。
因此瀏覽器的字體大小設置可以影響每個使用rem單元以及每個通過em單位繼承的值。
沒有設置 HTML 字體大小時,瀏覽器設置起作用
除非重寫,否則它將繼承瀏覽器默認設置的字體大小。 例如,讓我們把網站的html元素沒有設置font-size值。
如果用戶讓他們的瀏覽器默認字體大小為16px,那么根元素字體大小將為16px。 在 Chrome 開發工具下,你可以在已計算選項卡下看到一個元素繼承的屬性。
在這種情況下10rem等于160px,即10 x 16 = 160。
如果用戶將其瀏覽器中的默認字體大小調為18px,根字體大小變成18px。 現在10rem轉換為180px,即10 × 18 = 180。
瀏覽器將調整使用 em 單位的 HTML 元素字體大小
當em單位設置在html元素上時,它將轉換為em值乘以瀏覽器字體大小的設置。
例如,如果網站的html元素的字體大小屬性設置為1.25em,根元素字體大小將為1.25倍的瀏覽器的字體大小設置。
如果瀏覽器字體大小被設置為16px,根字體大小會出來為20px,即1.25 x 16 = 20。
在這種情況下10rem將等于200px,即10 × 20 = 200。
所以,如果瀏覽器字體大小被設置為20px,根元素字體大小會解析成25px,即1.25 × 20 = 25。
現在10rem將等于250px,即10 × 25 = 250。
總結 rem與 em 差異
上述所有歸結如下:
- rem單位翻譯為像素值是由html元素的字體大小決定的。 此字體大小會被瀏覽器中字體大小的設置影響,除非顯式重寫一個具體單位。
- em單位轉為像素值,取決于他們使用的字體大小。 此字體大小受從父元素繼承過來的字體大小,除非顯式重寫與一個具體單位。
為什么使用 rem 單位:
rem單位提供最偉大的力量并不僅僅是他們提供一致尺寸而不是繼承。 相反,它給我們的一個途經去獲取用戶的偏好來影響網站中每一處使用rem的元素大小,不再是使用固定的px單位。
為此,使用rem單位的主要目的應該是確保無論用戶如何設置自己的瀏覽器,我們的布局都能調整到合適大小。
一個站點最初設計可以專注于最常見的默認瀏覽器中字體大小16px。
使用瀏覽器默認字號16px
但是,通過使用rem單位,如果用戶調整其字體大小,我們也能保證布局的完整性,使用較小的文本避免文本空間被壓扁了。
瀏覽器解析的字號為34px。
如果用戶縮小其字體大小,整個布局掉下來,空白區域中的文本也不會想得很無力。
瀏覽器字體大小 9px
用戶會因為各種各樣的原因更改字體大小設置。 容納這些設置可以獲得更好的用戶體驗。
重要的是:
一些設計師使用結合rem單位的方式給html元素設置了一個固定的px單位。 這是很普遍的做法,所以改變html元素的字體大小時,可以使整個頁面做相應調整
我強烈反對種做法,因為它重寫繼承了用戶設置的瀏覽器字體大小。 更夸張的說,這剝削了用戶自行調整以獲得最佳視覺效果的能力。
如果您確實需要更改 html 元素的字體大小,那么就使用em,rem單位,這樣根元素的值還會是用戶瀏覽器字體大小的乘積。
這將允許您通過更改您的html元素的字體大小,調整你的設計,但仍會保留用戶的瀏覽器設置的效果。
為什么使用 em 單位
em單位取決于一個font-size值而非html元素的字體大小。
為此,em單位的主要目的應該是允許保持在一個特定的設計元素范圍內的可擴展性。
例如,您可能使用em值設置導航菜單項的padding、margin,line-height等值。
帶有0.9rem字體大小的菜單
通過這種方式,如果您更改菜單的字體大小菜單項周圍的間距將在剩余的空間按比例縮放。
帶有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單位。
你可以使用預處理比如 Stylus / Sass / Less , 來自動轉換單位 或 PostCSS 之類的插件。
或者,您可以使用 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的單位如何工作,并通過,知道如何最好地利用他們在你的設計中。
我鼓勵您嘗試為你自己使用本教程指南,它們會為您創建完全成熟的可伸縮性和響應性布局。
本文根據 @Kezz Bracey 的《 Comprehensive Guide: When to Use Em vs. Rem 》所譯,整個譯文帶有我們自己的理解與思想,如果譯得不好或有不對之處還請同行朋友指點。如需轉載此譯文,需注明英文出處: http://webdesign.tutsplus.com/tutorials/comprehensive-guide-when-to-use-em-vs-rem--cms-23984 。

HelKyle
我是周曉楷,華南師范大學在校本科生,有輕微強迫癥,拖延癥,正在努力學習前端知識!微博@Helkyle。