轉換工具:
PX特點
1. IE無法調整那些使用px作為單位的字體大小;
2. 國外的大部分網站能夠調整的原因在於其使用了em或rem作為字體單位;
3. Firefox能夠調整px和em,rem,但是96%以上的中國網民使用IE瀏覽器(或內核)。
px像素(Pixel)。相對長度單位。像素px是相對於顯示器屏幕分辨率而言的。(引自CSS2.0手冊)
em是相對長度單位。相對於當前對象內文本的字體尺寸。如當前對行內文本的字體尺寸未被人為設置,則相對於瀏覽器的默認字體尺寸。(引自CSS2.0手冊)
任意瀏覽器的默認字體高都是16px。所有未經調整的瀏覽器都符合: 1em=16px。那么12px=0.75em,10px=0.625em。為了簡化font-size的換算,需要在css中的body選擇器中聲明Font-size=62.5%,這就使em值變為 16px*62.5%=10px, 這樣12px=1.2em, 10px=1em, 也就是說只需要將你的原來的px數值除以10,然后換上em作為單位就行了。
EM特點
1. em的值並不是固定的;
2. em會繼承父級元素的字體大小。
所以我們在寫CSS的時候,需要注意兩點:
1. body選擇器中聲明Font-size=62.5%;
2. 將你的原來的px數值除以10,然后換上em作為單位;
3. 重新計算那些被放大的字體的em數值。避免字體大小的重復聲明。
也就是避免1.2 * 1.2= 1.44的現象。比如說你在#content中聲明了字體大小為1.2em,那么在聲明p的字體大小時就只能是1em,而不是1.2em, 因為此em非彼em,它因繼承#content的字體高而變為了1em=12px。
rem特點
rem是CSS3新增的一個相對單位(root em,根em),這個單位引起了廣泛關注。這個單位與em有什么區別呢?區別在於使用rem為元素設定字體大小時,仍然是相對大小,但相對的只是HTML根元素。這個單位可謂集相對大小和絕對大小的優點於一身,通過它既可以做到只修改根元素就成比例地調整所有字體大小,又可以避免字體大小逐層復合的連鎖反應。目前,除了IE8及更早版本外,所有瀏覽器均已支持rem。對於不支持它的瀏覽器,應對方法也很簡單,就是多寫一個絕對單位的聲明。這些瀏覽器會忽略用rem設定的字體大小。下面就是
一個例子:
p {font-size:14px; font-size:.875rem;}
注意:
選擇使用什么字體單位主要由你的項目來決定,如果你的用戶群都使用最新版的瀏覽器,那推薦使用rem,如果要考慮兼容性,那就使用px,或者兩者同時使用。
寫這篇文章是因為自己被rem這個坑絆過腳,因此特意去研究了下rem這個單位。
簡單闡述下px、em、rem之前的關系(其實網上很多,我這里稍微提一下)。
先拋出一個問題:為什么要選擇rem?
px:像素是相對於顯示器屏幕分辨率而言的相對長度單位。pc端使用px倒也無所謂,可是在移動端,因為手機分辨率種類頗多,不可能一個個去適配,這時px就顯得非常無力,所以就要考慮em和rem。
em:繼承父級的,假設html的font-size默認為16px,body字體大小定義為50%,那么在body里字體大小就是1em=8px了。可當你又定義了一個div,然后把字體設置成了50%,請問,現在div下的1em等於多少?因為繼承了父級的值,現在這個div里的1em=4px,這么嵌套下去的話,抱歉,我數學不好!所有rem就出現了。
rem:是em的升級版,rem只會相對html的值,不會受到父級的影響,這樣的好處在於:從em里的例子來講,1rem始終會等於8px。使用的時候不需要重新計算rem此時的大小。rem因為是css3增加的,所以ie8或以下請無視(始終想不明白,為什么國人至今對微軟都放棄的ie這么戀戀不舍)。
以上也算是講清了他們之間的區別和關系,rem更多的運用於移動H5頁面的適配使用。
下面來說說怎么更方便的使用rem和自己開文處提到的坑!
之前遇到的坑是這樣的。瀏覽器默認的字體大小都是16px(注意這里),所以要使1rem=10px,那么只要在html選擇器中聲明Font-size=62.5%(10÷16*100%=62.5%)就可以直接使用1rem=10px單位進行換算,其實這個算法是沒有錯的。可是,哪里來的自信讓每個瀏覽器默認字體都是16px????反正我也不知道自信哪來。。現在Chrome默認大小可以是12px也可以是16px,那么問題來了,國內瀏覽器,有幾個不是用的谷歌內核。所以html選擇器中聲明Font-size=62.5%,1rem就等於10px的換算就有點坑爹了,對於我這種一個像素都糾結的人來說,很蛋疼。這坑是我當時買書學h5的時候預留下的后遺症,現在這個毛病還有,因為快和方便 T_T!真是矛盾。。。
坑可以填。rem單位還是可以變的容易換算和精准。所以就去找了些工具和資料。
因為rem是相對html的,那么只要將html選擇器設置一個絕對大小的值:比如在html選擇器設置font-size:20px;那么1rem=20px(解釋下為什么是20而不是其他的,首先10的倍數容易計算,那為什么不是10本身而是20?現在Chrome最小的字體是12px,所以10px是無效的,進一步就取20px);現在是不是和效果圖一個像素都不差?!!!
且要兼容手機各個分別率,使用媒體查詢media 可以設置不同的大小,這樣在常規的設備中都可以精准到每一個像素。
這么換算來換算去好麻煩有木有!!所有發現了下面的換算工具,媽媽再也不用說我數學題不會做了!
下面是我直接在工具復制過來的現成rem換算適配代碼↓(設計稿寬度:640,字體值:20)
@media only screen and (max-width: 1080px), only screen and (max-device-width:1080px) { html,body { font-size:16.875px; } } @media only screen and (max-width: 960px), only screen and (max-device-width:960px) { html,body { font-size:15px; } } @media only screen and (max-width: 800px), only screen and (max-device-width:800px) { html,body { font-size:12.5px; } } @media only screen and (max-width: 720px), only screen and (max-device-width:720px) { html,body { font-size:11.25px; } } @media only screen and (max-width: 640px), only screen and (max-device-width:640px) { html,body { font-size:10px; } } @media only screen and (max-width: 600px), only screen and (max-device-width:600px) { html,body { font-size:9.375px; } } @media only screen and (max-width: 540px), only screen and (max-device-width:540px) { html,body { font-size:8.4375px; } } @media only screen and (max-width: 480px), only screen and (max-device-width:480px) { html,body { font-size:7.5px; } } @media only screen and (max-width: 414px), only screen and (max-device-width:414px) { html,body { font-size:6.46875px; } } @media only screen and (max-width: 400px), only screen and (max-device-width:400px) { html,body { font-size:6.25px; } } @media only screen and (max-width: 375px), only screen and (max-device-width:375px) { html,body { font-size:5.859375px; } } @media only screen and (max-width: 360px), only screen and (max-device-width:360px) { html,body { font-size:5.625px; } } @media only screen and (max-width: 320px), only screen and (max-device-width:320px) { html,body { font-size:5px; } } @media only screen and (max-width: 240px), only screen and (max-device-width:240px) { html,body { font-size:3.75px; }
離線版本:https://github.com/leon776/grunt-px2rem
在線版本:http://mxd.tencent.com/wp-content/uploads/2014/11/rem.html
