2018-08-16

如何更愉快地使用rem



em和rem

對(duì)font-size使用rem

當(dāng)瀏覽器解析HTML文檔時(shí)尊浪,創(chuàng)建了一個(gè)用來(lái)代表頁(yè)面元素的集合,叫做DOM。樹(shù)狀結(jié)構(gòu),每一個(gè)節(jié)點(diǎn)代表一個(gè)元素茅坛。<html>就是頂層節(jié)點(diǎn)(根節(jié)點(diǎn)),在下面的是它的子節(jié)點(diǎn)<head>和<body>盆色,再往下的就是它們的子節(jié)點(diǎn)灰蛙,還有其后代節(jié)點(diǎn)祟剔,如此類推隔躲。

根節(jié)點(diǎn)是文檔里所有其他元素的祖先。它有一個(gè)特別的偽類選擇器(:root)物延,在樣式表里可以用這個(gè)選擇器表示宣旱。使用帯類名的類型選擇器html,或者直接用標(biāo)簽選擇器叛薯,效果是一樣的浑吟。

rem是根em(root em)的縮寫(xiě)。rem是和根元素關(guān)聯(lián)的耗溜,不依賴當(dāng)前元素组力。不管你在文檔中的什么地方使用這個(gè)單位,1.2rem的計(jì)算值是相等的抖拴,等于1.2倍的根元素的字號(hào)大小燎字。下面的示例代碼中腥椒,聲明了根元素的字號(hào)大小,并在嵌套的無(wú)序列表中使用rem聲明字號(hào)大小候衍。

圖1

.1 偽類 :root 等價(jià)于 html 選擇器笼蛛;2 使用瀏覽器的默認(rèn)字號(hào)大小(16px)

在這個(gè)示例里蛉鹿,根字號(hào)大小是瀏覽器的默認(rèn)大小16px(根元素的1em等于瀏覽器的默認(rèn)字號(hào)大斜蹩场)。無(wú)序列表的字號(hào)大小為0.8rem妖异,計(jì)算結(jié)果是12.8px惋戏。因?yàn)檫@只跟根元素相關(guān),盡管你在列表里嵌套了列表随闺,嵌套子列表的字號(hào)仍然保持不變日川。

可用性:對(duì)font-size使用相對(duì)長(zhǎng)度單位

一些瀏覽器會(huì)提供給用戶2種方式定制文字的大小:縮放和設(shè)置一個(gè)默認(rèn)的字號(hào)大小矩乐。通過(guò)按Ctrl+或者Ctrl-龄句,用戶可以對(duì)頁(yè)面進(jìn)行縮放。這在視覺(jué)上會(huì)把整個(gè)頁(yè)面的文字或圖片(其實(shí)是所有元素)都放大或縮小了散罕。在一些瀏覽器分歇,這個(gè)改變只針對(duì)當(dāng)前的標(biāo)簽頁(yè)且是臨時(shí)的,不會(huì)影響到新開(kāi)的標(biāo)簽頁(yè)欧漱。

設(shè)置默認(rèn)字號(hào)大小职抡,會(huì)有點(diǎn)不一樣。不僅僅是設(shè)置的入口比較難找(一般在瀏覽器的設(shè)置頁(yè))误甚,而且這個(gè)設(shè)置是永久的缚甩,直到用戶把默認(rèn)值還原。值得注意的是窑邦,這個(gè)設(shè)置對(duì)使用px或其他絕對(duì)單位定義的字號(hào)大小無(wú)效擅威。因?yàn)槟J(rèn)字號(hào)大小對(duì)一些用戶是必要的,尤其是弱視的群體冈钦,你應(yīng)該用相對(duì)單位或百分比來(lái)定義字號(hào)的大小郊丛。

rem簡(jiǎn)化了很多em帶來(lái)的復(fù)雜度。事實(shí)上瞧筛,rem提供了一個(gè)在px和em間的相對(duì)單位折中解決方案厉熟,而且更易于使用。那么较幌,是不是意味著你應(yīng)該在對(duì)所有元素都使用rem揍瑟,去掉其他長(zhǎng)度單位呢?當(dāng)然不是乍炉。

在CSS的世界里绢片,這個(gè)答案通常是嘁字,看情況。rem只是你的工具箱中的其中一個(gè)杉畜。掌握CSS很重要的一點(diǎn)纪蜒,就是學(xué)會(huì)分辨在什么場(chǎng)景下該使用什么工具。我的選擇是此叠,對(duì)font-size使用rem纯续,對(duì)border使用px,對(duì)其他的度量方式如padding灭袁、margin猬错、border-radius等使用em。然而在必要時(shí)茸歧,需要聲明容器的寬度的話倦炒,我更喜歡使用百分比。

這樣软瞎,字號(hào)大小就變得可預(yù)測(cè)逢唤,而當(dāng)其他因素影響到元素的字號(hào)大小時(shí),你也可以借助em去縮放元素的padding和margin涤浇。在border上使用像素是很合適的鳖藕,尤其當(dāng)你想要一根漂亮的線的時(shí)候。以上就是我對(duì)不同屬性使用不同單位的理想方案只锭,不過(guò)我要再次聲明著恩,這些都是工具,在某些特定場(chǎng)景下蜻展,利用不同的工具可能取到更好的效果喉誊。

提示:當(dāng)你不確定的時(shí)候,對(duì)font-size使用rem纵顾,對(duì)border使用px伍茄,以及對(duì)其他大多數(shù)屬性使用em。

停止使用像素思維去思考

把頁(yè)面的根元素字號(hào)大小定義為0.625em或者62.5%片挂,在最近幾年來(lái)幻林,這樣的用法很常見(jiàn)贞盯,這是一種模式音念,或者更貼切地說(shuō),這是一種反模式躏敢。

[ 代碼片段 2.11 反模式:全局地把font-size定義為10px ]

圖2

.我并不推薦這種用法闷愤。這個(gè)用法把瀏覽器默認(rèn)的字號(hào)大小16px縮小到10px。這樣做的好處是簡(jiǎn)化了計(jì)算件余,如果設(shè)計(jì)師告訴你字號(hào)大小應(yīng)該是14px讥脐,那你可以很輕易地計(jì)算出1.4rem遭居,畢竟我們還是在使用相對(duì)單位。

一開(kāi)始旬渠,這看起來(lái)很方便俱萍,但事實(shí)上這樣的實(shí)現(xiàn)方式有兩個(gè)問(wèn)題。第一告丢,強(qiáng)制你寫(xiě)了很多重復(fù)的樣式代碼枪蘑。10px對(duì)于大多數(shù)文本來(lái)說(shuō)太小了,你需要在整個(gè)頁(yè)面中岖免,來(lái)來(lái)回回地覆蓋它岳颇。你會(huì)發(fā)現(xiàn),自己把一段段落(<p>)的字號(hào)大小聲明為1.4rem颅湘,然后又把導(dǎo)航(<nav>)的鏈接字號(hào)大小聲明為1.4rem话侧,樣式代碼中還有很多這樣的用法。這樣引入了更高的錯(cuò)誤風(fēng)險(xiǎn)闯参,當(dāng)你需要修改時(shí)發(fā)現(xiàn)代碼耦合程度比較高瞻鹏,同時(shí)也會(huì)讓樣式文件變大。

第二個(gè)問(wèn)題是鹿寨,你這么做的時(shí)候乙漓,其實(shí)你還是在用像素的思維在思考。雖然在代碼里寫(xiě)的是1.4rem释移,但是在你的腦子里叭披,其實(shí)還是想的是14px。在響應(yīng)式網(wǎng)頁(yè)開(kāi)發(fā)中玩讳,你應(yīng)該學(xué)會(huì)適應(yīng)那些“模糊”的值涩蜘。1.2em實(shí)際等于多少像素,并不重要熏纯,你只需要知道這是比繼承的字號(hào)大一點(diǎn)點(diǎn)同诫,那就足夠了。而且樟澜,如果在屏幕上這不是你想要的效果误窖,那就改吧。這是需要時(shí)間實(shí)驗(yàn)和試錯(cuò)的秩贰,但事實(shí)上霹俺,使用px的時(shí)候我們也需要這樣做。(在第13章毒费,我們會(huì)有更具體的方式來(lái)優(yōu)化這個(gè)實(shí)現(xiàn)方式丙唧。)

當(dāng)使用em時(shí),我們很容易陷入糾結(jié)觅玻,這個(gè)值轉(zhuǎn)化成像素值會(huì)是多少呢想际?尤其對(duì)于字號(hào)大小培漏。你一直在乘和除以em值,這樣你很快就會(huì)瘋掉了胡本。相反牌柄,我希望你可以接受一項(xiàng)挑戰(zhàn),嘗試培養(yǎng)先開(kāi)始使用em的習(xí)慣侧甫。如果你習(xí)慣使用像素友鼻,那轉(zhuǎn)成em是需要一定時(shí)間和練習(xí)的,但相信我闺骚,這很值得彩扔。

這不是在說(shuō)你再也不使用像素了。如果你跟一個(gè)設(shè)計(jì)師合作僻爽,你可能需要用更精確的像素值去溝通虫碉,這沒(méi)問(wèn)題的。在項(xiàng)目的開(kāi)始胸梆,你需要聲明一個(gè)基礎(chǔ)的字號(hào)大卸嘏酢(通常是對(duì)標(biāo)題或者標(biāo)注的常用字號(hào))。使用絕對(duì)值去描述大小碰镜,往往會(huì)更加容易兢卵。

設(shè)置一個(gè)合理的字號(hào)默認(rèn)值

先假設(shè)你想把默認(rèn)字號(hào)設(shè)定為14px。把10px設(shè)定為基準(zhǔn)值绪颖,再在頁(yè)面中去覆蓋它的寫(xiě)法秽荤,我們不推薦這種寫(xiě)法,相反柠横,你應(yīng)該在根元素上直接聲明一個(gè)值窃款。

在這個(gè)代碼片段里,目標(biāo)字號(hào)值是繼承的牍氛,瀏覽器的默認(rèn)值16px晨继,那么14/16 = 0.875。

把下面的代碼添加到一個(gè)新的樣式表的最上面搬俊,我們會(huì)在這上面添加其他代碼紊扬。這里設(shè)定根元素()的默認(rèn)字號(hào)大小。

圖3

現(xiàn)在唉擂,你的期望基準(zhǔn)字號(hào)14px對(duì)整個(gè)頁(yè)面的元素有效餐屎,你不需要在其他地方重新聲明了。你只需要在設(shè)計(jì)不一樣的地方修改成新的字號(hào)楔敌,譬如標(biāo)題啤挎。

關(guān)于本文

譯者:@Yuying?Wu

譯文:

http://wuyuying.com/blog/archives/css-in-depth-stop-thinking-in-px/

作者:@Keith?J.Grant

原文:

https://livebook.manning.com/#!/book/css-in-depth/chapter-2

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末驻谆,一起剝皮案震驚了整個(gè)濱河市卵凑,隨后出現(xiàn)的幾起案子庆聘,更是在濱河造成了極大的恐慌,老刑警劉巖勺卢,帶你破解...
    沈念sama閱讀 221,273評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件伙判,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡黑忱,警方通過(guò)查閱死者的電腦和手機(jī)宴抚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)甫煞,“玉大人菇曲,你說(shuō)我怎么就攤上這事「Х停” “怎么了常潮?”我有些...
    開(kāi)封第一講書(shū)人閱讀 167,709評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)楷力。 經(jīng)常有香客問(wèn)我喊式,道長(zhǎng),這世上最難降的妖魔是什么萧朝? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,520評(píng)論 1 296
  • 正文 為了忘掉前任岔留,我火速辦了婚禮,結(jié)果婚禮上检柬,老公的妹妹穿的比我還像新娘献联。我一直安慰自己,他們只是感情好何址,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,515評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布酱固。 她就那樣靜靜地躺著,像睡著了一般头朱。 火紅的嫁衣襯著肌膚如雪运悲。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,158評(píng)論 1 308
  • 那天项钮,我揣著相機(jī)與錄音班眯,去河邊找鬼。 笑死烁巫,一個(gè)胖子當(dāng)著我的面吹牛署隘,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播亚隙,決...
    沈念sama閱讀 40,755評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼磁餐,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起诊霹,我...
    開(kāi)封第一講書(shū)人閱讀 39,660評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤羞延,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后脾还,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體伴箩,經(jīng)...
    沈念sama閱讀 46,203評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,287評(píng)論 3 340
  • 正文 我和宋清朗相戀三年鄙漏,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了嗤谚。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,427評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡怔蚌,死狀恐怖巩步,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情桦踊,我是刑警寧澤渗钉,帶...
    沈念sama閱讀 36,122評(píng)論 5 349
  • 正文 年R本政府宣布,位于F島的核電站钞钙,受9級(jí)特大地震影響鳄橘,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜芒炼,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,801評(píng)論 3 333
  • 文/蒙蒙 一瘫怜、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧本刽,春花似錦鲸湃、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,272評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至斜友,卻和暖如春炸裆,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背鲜屏。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,393評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工烹看, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人洛史。 一個(gè)月前我還...
    沈念sama閱讀 48,808評(píng)論 3 376
  • 正文 我出身青樓惯殊,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親也殖。 傳聞我的和親對(duì)象是個(gè)殘疾皇子土思,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,440評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容