主頁 > 企業開發 > rem與em的使用和區別詳解【轉】

rem與em的使用和區別詳解【轉】

2020-09-22 18:21:49 企業開發

目錄
  • 最大的問題是
  • 主要區別

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

Em 和 rem都是靈活、 可擴展的單位,由瀏覽器轉換為像素值,具體取決于您的設計中的字體大小設定, 如果你使用值 1em 或 1rem,它可以被瀏覽器翻譯成 從16px到 160px 或其他任意值,

CSS 邊距設定為 1em

瀏覽器翻譯成16px

CSS padding設為 16px

瀏覽器翻譯成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 單位,并且根據瀏覽器的字體大小設定縮放的任何尺寸,

這幾乎在一個標準的設計中占據了一切,包括heights,widths,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 的單位如何作業,并通過,知道如何最好地利用他們在你的設計中,

我鼓勵您嘗試為你自己使用本教程指南,它們會為您創建完全成熟的可伸縮性和回應性布局,

原文鏈接:https://webdesign.tutsplus.com/zh-hans/tutorials/comprehensive-guide-when-to-use-em-vs-rem--cms-23984

轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/106447.html

標籤:Html/Css

上一篇:用canvas寫一個簡易畫圖工具

下一篇:CSS揭秘-半透明邊框與多重邊框

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • IEEE1588PTP在數字化變電站時鐘同步方面的應用

    IEEE1588ptp在數字化變電站時鐘同步方面的應用 京準電子科技官微——ahjzsz 一、電力系統時間同步基本概況 隨著對IEC 61850標準研究的不斷深入,國內外學者提出基于IEC61850通信標準體系建設數字化變電站的發展思路。數字化變電站與常規變電站的顯著區別在于程序層傳統的電流/電壓互 ......

    uj5u.com 2020-09-10 03:51:52 more
  • HTTP request smuggling CL.TE

    CL.TE 簡介 前端通過Content-Length處理請求,通過反向代理或者負載均衡將請求轉發到后端,后端Transfer-Encoding優先級較高,以TE處理請求造成安全問題。 檢測 發送如下資料包 POST / HTTP/1.1 Host: ac391f7e1e9af821806e890 ......

    uj5u.com 2020-09-10 03:52:11 more
  • 網路滲透資料大全單——漏洞庫篇

    網路滲透資料大全單——漏洞庫篇漏洞庫 NVD ——美國國家漏洞庫 →http://nvd.nist.gov/。 CERT ——美國國家應急回應中心 →https://www.us-cert.gov/ OSVDB ——開源漏洞庫 →http://osvdb.org Bugtraq ——賽門鐵克 →ht ......

    uj5u.com 2020-09-10 03:52:15 more
  • 京準講述NTP時鐘服務器應用及原理

    京準講述NTP時鐘服務器應用及原理京準講述NTP時鐘服務器應用及原理 安徽京準電子科技官微——ahjzsz 北斗授時原理 授時是指接識訓通過某種方式獲得本地時間與北斗標準時間的鐘差,然后調整本地時鐘使時差控制在一定的精度范圍內。 衛星導航系統通常由三部分組成:導航授時衛星、地面檢測校正維護系統和用戶 ......

    uj5u.com 2020-09-10 03:52:25 more
  • 利用北斗衛星系統設計NTP網路時間服務器

    利用北斗衛星系統設計NTP網路時間服務器 利用北斗衛星系統設計NTP網路時間服務器 安徽京準電子科技官微——ahjzsz 概述 NTP網路時間服務器是一款支持NTP和SNTP網路時間同步協議,高精度、大容量、高品質的高科技時鐘產品。 NTP網路時間服務器設備采用冗余架構設計,高精度時鐘直接來源于北斗 ......

    uj5u.com 2020-09-10 03:52:35 more
  • 詳細解讀電力系統各種對時方式

    詳細解讀電力系統各種對時方式 詳細解讀電力系統各種對時方式 安徽京準電子科技官微——ahjzsz,更多資料請添加VX 衛星同步時鐘是我京準公司開發研制的應用衛星授時時技術的標準時間顯示和發送的裝置,該裝置以M國全球定位系統(GLOBAL POSITIONING SYSTEM,縮寫為GPS)或者我國北 ......

    uj5u.com 2020-09-10 03:52:45 more
  • 如何保證外包團隊接入企業內網安全

    不管企業規模的大小,只要企業想省錢,那么企業的某些服務就一定會采用外包的形式,然而看似美好又經濟的策略,其實也有不好的一面。下面我通過安全的角度來聊聊使用外包團的安全隱患問題。 先看看什么服務會使用外包的,最常見的就是話務/客服這種需要大量重復性、無技術性的服務,或者是一些銷售外包、特殊的職能外包等 ......

    uj5u.com 2020-09-10 03:52:57 more
  • PHP漏洞之【整型數字型SQL注入】

    0x01 什么是SQL注入 SQL是一種注入攻擊,通過前端帶入后端資料庫進行惡意的SQL陳述句查詢。 0x02 SQL整型注入原理 SQL注入一般發生在動態網站URL地址里,當然也會發生在其它地發,如登錄框等等也會存在注入,只要是和資料庫打交道的地方都有可能存在。 如這里http://192.168. ......

    uj5u.com 2020-09-10 03:55:40 more
  • [GXYCTF2019]禁止套娃

    git泄露獲取原始碼 使用GET傳參,引數為exp 經過三層過濾執行 第一層過濾偽協議,第二層過濾帶引數的函式,第三層過濾一些函式 preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'] (?R)參考當前正則運算式,相當于匹配函式里的引數 因此傳遞 ......

    uj5u.com 2020-09-10 03:56:07 more
  • 等保2.0實施流程

    流程 結論 ......

    uj5u.com 2020-09-10 03:56:16 more
最新发布
  • 使用Django Rest framework搭建Blog

    在前面的Blog例子中我們使用的是GraphQL, 雖然GraphQL的使用處于上升趨勢,但是Rest API還是使用的更廣泛一些. 所以還是決定回到傳統的rest api framework上來, Django rest framework的官網上給了一個很好用的QuickStart, 我參考Qu ......

    uj5u.com 2023-04-20 08:17:54 more
  • 記錄-new Date() 我忍你很久了!

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 大家平時在開發的時候有沒被new Date()折磨過?就是它的諸多怪異的設定讓你每每用的時候,都可能不小心踩坑。造成程式意外出錯,卻一下子找不到問題出處,那叫一個煩透了…… 下面,我就列舉它的“四宗罪”及應用思考 可惡的四宗罪 1. Sa ......

    uj5u.com 2023-04-20 08:17:47 more
  • 使用Vue.js實作文字跑馬燈效果

    實作文字跑馬燈效果,首先用到 substring()截取 和 setInterval計時器 clearInterval()清除計時器 效果如下: 實作代碼如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta ......

    uj5u.com 2023-04-20 08:12:31 more
  • JavaScript 運算子

    JavaScript 運算子/運算子 在 JavaScript 中,有一些運算子可以使代碼更簡潔、易讀和高效。以下是一些常見的運算子: 1、可選鏈運算子(optional chaining operator) ?.是可選鏈運算子(optional chaining operator)。?. 可選鏈操 ......

    uj5u.com 2023-04-20 08:02:25 more
  • CSS—相對單位rem

    一、概述 rem是一個相對長度單位,它的單位長度取決于根標簽html的字體尺寸。rem即root em的意思,中文翻譯為根em。瀏覽器的文本尺寸一般默認為16px,即默認情況下: 1rem = 16px rem布局原理:根據CSS媒體查詢功能,更改根標簽的字體尺寸,實作rem單位隨螢屏尺寸的變化,如 ......

    uj5u.com 2023-04-20 08:02:21 more
  • 我的第一個NPM包:panghu-planebattle-esm(胖虎飛機大戰)使用說明

    好家伙,我的包終于開發完啦 歡迎使用胖虎的飛機大戰包!! 為你的主頁添加色彩 這是一個有趣的網頁小游戲包,使用canvas和js開發 使用ES6模塊化開發 效果圖如下: (覺得圖片太sb的可以自己改) 代碼已開源!! Git: https://gitee.com/tang-and-han-dynas ......

    uj5u.com 2023-04-20 08:01:50 more
  • 如何在 vue3 中使用 jsx/tsx?

    我們都知道,通常情況下我們使用 vue 大多都是用的 SFC(Signle File Component)單檔案組件模式,即一個組件就是一個檔案,但其實 Vue 也是支持使用 JSX 來撰寫組件的。這里不討論 SFC 和 JSX 的好壞,這個仁者見仁智者見智。本篇文章旨在帶領大家快速了解和使用 Vu ......

    uj5u.com 2023-04-20 08:01:37 more
  • 【Vue2.x原始碼系列06】計算屬性computed原理

    本章目標:計算屬性是如何實作的?計算屬性快取原理以及洋蔥模型的應用?在初始化Vue實體時,我們會給每個計算屬性都創建一個對應watcher,我們稱之為計算屬性watcher ......

    uj5u.com 2023-04-20 08:01:31 more
  • http1.1與http2.0

    一、http是什么 通俗來講,http就是計算機通過網路進行通信的規則,是一個基于請求與回應,無狀態的,應用層協議。常用于TCP/IP協議傳輸資料。目前任何終端之間任何一種通信方式都必須按Http協議進行,否則無法連接。tcp(三次握手,四次揮手)。 請求與回應:客戶端請求、服務端回應資料。 無狀態 ......

    uj5u.com 2023-04-20 08:01:10 more
  • http1.1與http2.0

    一、http是什么 通俗來講,http就是計算機通過網路進行通信的規則,是一個基于請求與回應,無狀態的,應用層協議。常用于TCP/IP協議傳輸資料。目前任何終端之間任何一種通信方式都必須按Http協議進行,否則無法連接。tcp(三次握手,四次揮手)。 請求與回應:客戶端請求、服務端回應資料。 無狀態 ......

    uj5u.com 2023-04-20 08:00:32 more