關於 rem 這個單位的介紹,在此就不贅述,有興趣的同窗能夠閱讀一絲的《響應式十日談第一日:使用 rem 設置文字大小》,文章對 rem 進行了詳細的介紹。瀏覽器
在無線開發中,響應式佈局尤其重要,先不說屏幕尺寸愈來愈多樣化的 iPhone,單是安卓就有 N 多種尺寸要適配。佈局
在沒有使用 rem 以前,想要按照設計師的想法去適配不一樣 分辨率1 是一件很是難操做的事情。用了 rem 之後,一切簡單了許多,你能夠用它來設置元素的寬高、間距…,而後針對不一樣的分辨率計算並設置相對應的根字體大小,而後元素就好像縮放過同樣自動適應了當前的分辨率,大大的下降了適配工做量。字體
Demo:設計
上圖是同一個頁面在 Apple iPhone 5 和 Samsung Galaxy S4 兩款機器下的效果,能夠看出從 320px 寬的 iPhone 5 到 360px 寬的 S4,圖片像是等比放大了同樣,咱們分析下這個原理:cdn
假定2 width=320px 的分辨率下的根字體大小是 32px,由此推算:blog
根字體大小是 32px,該分辨率下寬 1rem 的元素在瀏覽器裏的真實寬度就是 1 * 32 = 32px;圖片
若是要達到等比放大的效果,寬 1rem 的元素在瀏覽器裏的真實寬度就應該是 32 * (360/320) = 36px,由此得出 width=360px 分辨率下的根字體大小爲 36px;開發
因而可知等比縮放是經過控制根字體大小來實現的,且根字體大小與屏幕寬度成正比。rem
剛纔舉的例子裏面 1rem 在 width=320px 分辨率下的真實尺寸爲 32px,在 width=360px 分辨率下的真實尺寸爲 36px,均爲整數。文檔
若是是 1.75rem 呢?
表明機型 瀏覽器寬 對應尺寸
iPhone 4/4s/5/5s 320px 56px
Samsung Note 3, Nexus 5… 360px 63px
iPhone 6 375px 65.625px
Google Nexus 6 412px 72.1px
iPhone 6 Plus 414px 72.45px
能夠看到部分機型下出現了小數像素,那麼瀏覽器是如何處理小數像素的呢?
如圖,第一組每一個色塊的大小爲 1.75rem x 1.75rem,第二組每一個色塊的大小爲 1.85rem x 1.85rem;
先看第一組色塊,在 iPhone 6 下,其在瀏覽器內的渲染尺寸應該是 1.75 * 37.5 = 65.625px;但真實渲染尺寸倒是另一種狀況:有的寬度是 66px,有的倒是 65px,並且順序上毫無規律。
這一結果讓我十分疑惑,若是瀏覽器統一作四捨五入處理,那麼全部的色塊尺寸也應該是同樣的,不會出現部分向上取整,部分向下取整。
思考許久無果,大膽設想了一下:瀏覽器在渲染時所作的舍入處理只是應用在元素的渲染尺寸上,其真實佔據的空間依舊是原始大小。
也就是說若是一個元素尺寸是 0.625px,那麼其渲染尺寸應該是 1px,空出的 0.375px 空間由其臨近的元素填充;一樣道理,若是一個元素尺寸是 0.375px,其渲染尺寸就應該是 0,可是其會佔據臨近元素 0.375px 的空間。因而就順着這個思路驗證瞭如下:
你能夠參考上述原理對第二組色塊進行驗證,而後比對結果。
目前遇到最多的問題就是 background-image 的問題,常常會由於小數像素致使背景圖被裁掉一部分。
上圖是同一組 icon 在不一樣機型下的效果,能夠看出這些 icon 在 iPhone 5 和 Galaxy S4 下或多或少的會被裁掉一部分,緣由就是因爲小數像素致使的,這點能夠從元素的 Computed Style 上看出。
如何避免這種問題呢?如下兩點建議:
小數像素產生的問題不僅僅只有 background-image,還會有其餘還沒有遇到的坑,然而在瞭解了瀏覽器是如何處理小數像素的原理之後,此類問題就變得很好解決,也很是可控。