摘要:但問題是究竟該用還是呢關(guān)于這個問題一直存在比較大的爭議。上述現(xiàn)象的出現(xiàn),是因?yàn)槭窍鄬τ诋?dāng)前元素字體的大小。什么是表示,它是相對于根元素的長度單位。還是在項(xiàng)目開發(fā)中究竟是選用還是一直以來爭議不斷。這就是前述規(guī)則中的第一條規(guī)則。
簡言
應(yīng)用象EM 和 REM這種相對長度單位進(jìn)行頁面排版是WEB開發(fā)中的最佳實(shí)踐。在頁面排版中較好應(yīng)用EM 和 REM,根據(jù)設(shè)備尺寸縮放顯示元素的大小。這就使得組件在不同設(shè)備上都達(dá)到最佳的顯示效果成為可能。
但問題是究竟該用 EM 還是 REM 呢?關(guān)于這個問題一直存在比較大的爭議。本文將會給大家介紹究竟什么是 EM 和 REM 和如何進(jìn)行兩者的選擇,以及結(jié)合兩者優(yōu)勢構(gòu)建模塊化的WEB組件。
注:本文內(nèi)容簡單,只面向初級開發(fā)人員,約2500字,閱讀時間5分鐘。
1 什么是EM?em 是相對長度單位。它相對于當(dāng)前元素字體尺寸,即font-size。舉例來說,如果當(dāng)前元素的字體是20px,那么當(dāng)前元素中的1em就等于20px。
h1 { font-size: 20px } /* 1em = 20px */ p { font-size: 16px } /* 1em = 16px */
實(shí)際開發(fā)中,用相對長度單位(如 em)表示字體大小是WEB開發(fā)中的最佳實(shí)踐。
考慮下面的代碼:
h1 { font-size: 2em }
這里的h1元素字體大小究竟是多少呢?
這時,我們需要根據(jù)父元素字體的大小,來計(jì)算字體的尺寸大小。如果父元素是,而且的字體大小是16px。就可以計(jì)算出的字體大小是32px,即2*16px。
用代碼表示如下:
html { font-size: 16px } h1 { font-size: 2em } /* 16px * 2 = 32px */
設(shè)置字體的大小一般來說都不是一個好主意,因?yàn)檫@樣重寫了用戶瀏覽器的默認(rèn)設(shè)置。相反,可以使用百分比值或者根本不聲明字體大小。
html { font-size: 100% } /* 缺省 16px */
對于大多數(shù)用戶或?yàn)g覽器,字體缺省大小是16px(未做瀏覽器缺省字體尺寸設(shè)置)。
em 還能用來指定除字體大小外的其它屬性,象margin或padding等屬性都可以用em來表示。
考慮下面的代碼, 對于和
元素,margin-bottom值應(yīng)該是多少? (假設(shè)的字號被設(shè)置為100%)。
h1 { font-size: 2em; /* 1em = 16px */ margin-bottom: 1em; /* 1em = 32px */ } p { font-size: 1em; /* 1em = 16px */ margin-bottom: 1em; /* 1em = 16px */ }
上述和
的margin-bottom都是1em,但是外邊距結(jié)果值卻不相同。上述現(xiàn)象的出現(xiàn),是因?yàn)?b>em是相對于當(dāng)前元素字體的大小。由于中的字體大小現(xiàn)在設(shè)置為2em, 因此中其它屬性的1em值就是 1em = 32px。這里比較容易引起誤解的地方。
2 什么是REM?rem表示 root em,它是相對于根元素的長度單位。這里根元素就是中定義的字體大小。這意味著任何地方的1rem總是等于中定義的字體大小。
利用上述相同的代碼,我們用 rem 來代替 em,查看margin-bottom的計(jì)算值究竟是多少?
h1 { font-size: 2rem; margin-bottom: 1rem; /* 1rem = 16px */ } p { font-size: 1rem; margin-bottom: 1rem; /* 1rem = 16px */ }
如上述代碼所示,1rem總是等于16px(除非變更了字體的大?。?b>rem的大小相較于em來說意義更直接明確,也很容易理解。
3 REM 還是 EM?在項(xiàng)目開發(fā)中究竟是選用 rem 還是 em 一直以來爭議不斷。一些開發(fā)人員不使用rem,因?yàn)?b>rem使組件不那么模塊化。而另一些開發(fā)人員喜歡rem的簡單性,使用rem處理所有元素。
其實(shí) em和rem都有各自的優(yōu)勢和劣勢,在實(shí)際項(xiàng)目開發(fā)中,應(yīng)該結(jié)合使用兩者,利用各自的優(yōu)勢,從而實(shí)現(xiàn)較好代碼質(zhì)量和顯示效果。
那么在具體的應(yīng)用中如何在兩者中做選擇呢?有兩條簡單的指導(dǎo)原則:
如果屬性尺寸要根據(jù)元素字體進(jìn)行縮放,則使用em
其它情況下都使用rem
上述規(guī)則太簡單了。 為了更好的理解上述規(guī)則,我們就以一個簡單的header組件為例,說明多帶帶使用兩者來實(shí)現(xiàn)組件遇到的問題,并體會結(jié)合使用兩者所帶來的優(yōu)勢。
3.1 只使用REM這里我們只使用rem來編寫一個header組件,代碼及運(yùn)行結(jié)果如下:
.header { font-size: 1rem; padding: 0.5rem 0.75rem; background: #7F7CFF; }
接下來,網(wǎng)站需要一個尺寸更大的header組件。
變更CSS代碼如下:
.header { font-size: 1rem; padding: 0.5rem 0.75rem; background: #7F7CFF; } .header-large { font-size: 2rem; }
運(yùn)行結(jié)果如下:
從上述運(yùn)行結(jié)果可以看出,文字的內(nèi)邊距(padding)過小,顯示效果不協(xié)調(diào)。如果我們堅(jiān)持只使用rem,只能變更c(diǎn)ss代碼如下:
.header { font-size: 1rem; padding: 0.5rem 0.75rem; background: #7F7CFF; } .header-large { font-size: 2rem; padding: 1rem 1.5rem; }
變更后運(yùn)行結(jié)果如下:
上述代碼及運(yùn)行結(jié)果,雖然達(dá)到了預(yù)期的顯示效果,但卻違背了代碼復(fù)用的原則。如果網(wǎng)站有多種尺寸的.header樣式,就要多次重復(fù)的定義內(nèi)邊距。重復(fù)的代碼增加了項(xiàng)目復(fù)雜度,降低了可維護(hù)性。
這時可以利用em可以變更上述代碼如下:
.header { font-size: 1rem; padding: 0.5em 0.75em; background: #7F7CFF; } .header-large { font-size: 2rem; }
運(yùn)行結(jié)果請查看演示程序:
演示代碼
如上述演示程序所示,當(dāng)元素屬性值的大小需要根據(jù)元素字體尺寸縮放時,就應(yīng)該應(yīng)用 em 來定義屬性尺寸。這就是前述規(guī)則中的第一條規(guī)則。
3.2 只使用EM如果只使用em來定義上述組件,結(jié)果會怎樣呢?
我們變更上述代碼如下(em替換rem):
.header { font-size: 1em; padding: 0.5em 0.75em; background: #7F7CFF; } .header-large { font-size: 2em; }
為更接近實(shí)際,我們引入了
元素,并變更html代碼如下:
名人名言簡單是穩(wěn)定的前提
名人名言簡單是穩(wěn)定的前提
增加p元素css代碼如下:
p { padding: 0.5em 0.75em; }
運(yùn)行結(jié)果如下:
從上述運(yùn)行經(jīng)果中,不難看出.header-large部分的標(biāo)題并沒有和文本左對齊。而如果只使用em實(shí)現(xiàn)左對齊,則需要變更CSS代碼如下:
.header { font-size: 1em; padding: 0.5em 0.75em; background: #7F7CFF; } .header-large { font-size: 2em; padding-left: 0.375em; padding-right: 0.375em; }
變更后運(yùn)行結(jié)果如下:
上述代碼及運(yùn)行結(jié)果,雖然達(dá)到了預(yù)期的顯示效果,但卻違背了代碼復(fù)用的原則。如果網(wǎng)站有多種尺寸的.header樣式,就要多次重復(fù)的定義左右邊距。重復(fù)的代碼增加了項(xiàng)目復(fù)雜度,降低了可維護(hù)性。
解決上述問題的辦法是結(jié)合使用em和rem,即使用em定義上下邊距,使用rem定義左右邊距。變更后代碼如下:
.header { padding: 0.5em 0.75rem; font-size: 1em; background: #7F7CFF; } .header-large { font-size: 2em; }
運(yùn)行結(jié)果請查看演示程序:
演示代碼
3.3 EM還是REM總結(jié)究竟是該使用em還是rem呢?答案應(yīng)該是結(jié)合使用em和rem。當(dāng)屬性值的大小需要根據(jù)當(dāng)前元素字體尺寸縮放時,就選用em,其它的情況都使用更簡單的rem。
4 em及rem值的設(shè)定em和rem 屬性值都要經(jīng)過計(jì)算轉(zhuǎn)化成絕過長度單位。常用的字體尺寸用相對長度單位表示會很困難??聪旅娉S米煮w值的rem表示(基本字體尺寸是16px):
10px = 0.625rem
12px = 0.75rem
14px = 0.875rem
16px = 1rem (base)
18px = 1.125rem
20px = 1.25rem
24px = 1.5rem
30px = 1.875rem
32px = 2rem
如上述列表所示,上述尺寸值的表示及計(jì)算都不分的不便。為了解決上述問題要用到一個小技巧,即著名的 "62.5%"技術(shù)。具體請查看下述代碼:
body { font-size:62.5%; } /* =10px */ h1 { font-size: 2.4em; } /* =24px */ p { font-size: 1.4em; } /* =14px */
通過62.5%的設(shè)定,就可以很容易用em來定義具體屬性的尺寸了(10倍的關(guān)系)。
而rem,則需要采用如下的方式:
html { font-size: 62.5%; } /* =10px */ body { font-size: 1.4rem; } /* =14px */ h1 { font-size: 2.4rem; } /* =24px */5 響應(yīng)式例子
一個簡單的響應(yīng)式的例子,調(diào)整瀏覽器寬度查看演示效果。
演示代碼
6 參考資料W3C:CSS Values and Units Module Level 3
zellwk:REM vs EM – The Great Debate
sitepoint:Understanding and Using rem Units in CSS
tutsplus:Comprehensive Guide: When to Use Em vs. Rem
css-tricks:Confused About REM and EM?
7 說明文中所述文字及代碼部分匯編于網(wǎng)絡(luò)。因時間不足,能力有限等原因,存在文字闡述不準(zhǔn)及代碼測試不足等諸多問題。因此只限于學(xué)習(xí)范圍,不適用于實(shí)際應(yīng)用。另em和rem在較老的瀏覽器中存在兼容性問題。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/113111.html
摘要:值得注意的是,這個設(shè)置對使用或其他絕對單位定義的字號大小無效。事實(shí)上,提供了一個在和間的相對單位折中解決方案,而且更易于使用。圖使用相對單位和繼承字號的面板下面是模板,加到你的頁面吧。 showImg(https://segmentfault.com/img/bVbdOMr?w=920&h=450); 前段時間試譯了Keith J.Grant的CSS好書《CSS in Depth》,其...
摘要:相對單位的值會根據(jù)外部影響因素的變化而變化。很自然,相對單位使用起來會比較困難。在本章中,我將揭開相對單位的神秘面紗。重點(diǎn)來了,使用相對單位聲明的值會由瀏覽器轉(zhuǎn)化為一個絕對值,我們稱之為計(jì)算值。 showImg(https://segmentfault.com/img/bVbdtsA); 前段時間試譯了Keith J.Grant的CSS好書《CSS in Depth》,其中的第二章《W...
摘要:還有視口相關(guān)單位,依賴瀏覽器的視口大小來定義長度的。如果你不熟悉視口相關(guān)單位的話,在這里簡單介紹一下。筆記視口相關(guān)單位對于大多數(shù)瀏覽器還是一項(xiàng)比較新的特性,所以當(dāng)你試圖把這個特性和其他樣式混搭時,有可能會有一些很奇怪的。 前段時間試譯了Keith J.Grant的CSS好書《CSS in Depth》,其中的第二章《Working with relative units》,書中對rel...
摘要:寫了一篇文章,里面記錄了他在實(shí)際使用單位過程中的一些感受。他的解決方式充分利用了到目前為止我們遇到的三種單位。根元素的長度單位依舊采用,模塊用單位,模塊內(nèi)的元素使用單位。隨后在中單位的強(qiáng)大之處提出了他的觀點(diǎn)。 什么是 rem 可能在你使用收音機(jī)或者用其他音樂播放器之前,就已經(jīng)聽過R.E.M.這個詞了。在這個樂隊(duì)眼中,這個詞是淺睡眠時眼球的快速轉(zhuǎn)動的縮寫,而在 css 中,rem 代表著...
摘要:正文概念本次要談的移動不是,只是很普通的移動端的界面。默認(rèn)行為作為之前開發(fā)端的人員,第一反應(yīng)就是如何把那么大的界面內(nèi)容展現(xiàn)到手機(jī)小小的屏幕上。就是在顯示多行文字的時候,可能需要在自己期望顯示多少行之后,省略后面的文字,然后以。。。 前言 開發(fā)生涯總是豐富多采,工作多年,不同領(lǐng)域還是逃不過雨露均沾,之前開發(fā)過android,微信,ios,web網(wǎng)站也玩過。但是對于移動web這一塊,確實(shí)沒...
閱讀 1281·2021-11-15 18:14
閱讀 3167·2021-08-25 09:38
閱讀 2673·2019-08-30 10:55
閱讀 2704·2019-08-29 16:39
閱讀 1316·2019-08-29 15:07
閱讀 2457·2019-08-29 14:14
閱讀 821·2019-08-29 12:36
閱讀 921·2019-08-29 11:21