%
)in
)cm
)mm
)pt
)pc
)ex
)em
)px
)rem
)vw
)vh
)vmax
)vmin
)使用前能夠在 http://caniuse.com/ 查看各個單位的瀏覽器兼容性
ppi
(pixels per inch
)設備像素表示每英寸所擁有的像素(pixel
)數目,數值越高,表明屏幕能以更高的密度顯示圖像。css
計算公式:ppi=像素數量/物理尺寸(英寸數)
html
dips
(device-independent pixels
)設備獨立像素。html5
咱們但願不一樣屏幕顯示圖片的大小要一致,咱們要計算圖片縮放比例。git
計算公式:圖片邏輯像素大小px1 / 圖片縮放後實際像素大小px2 = 設備像素dp / 設備獨立像素dips px2 = px1 * (dp / dips) px2 = px1 * dpr
dpr
(devicePixelRatio
)是設備像素dp
和設備獨立像素dips
的比例。dpr = dp / dips
github
css
像素是一個相對單位。相對不一樣屏幕,其實際像素大小不一樣。
咱們定義時,是定義其邏輯像素。即該圖要用多少個像素來顯示。segmentfault
rem
(root element
),這個是一個相對的單位。
與em
的差異在於rem
相對的是根節點html
的font-size
,em
相對的是父元素font-size
。瀏覽器
動態修改html
的font-size
,那麼使用rem
的元素的對應單位實際像素也會相應的改變,因此咱們只要寫一份css
就能夠適配全部手機的屏幕了。雖然rem
在某些瀏覽器下面不夠精準,但那也只是少數,若是須要很是精準的適配,那麼可使用js
來計算html
的font-size
。sass
如今設計師給的移動端視覺稿,通常都是按照750px
來設計的。當咱們拿到視覺稿時,首先把視覺稿的寬度轉換爲rem
,咱們並不須要考慮設備的分辨率,只須要按照 佈局
計算公式:視覺稿寬度 = font-size * rem
字體
這個公式來計算就行了。視覺稿的寬度是咱們以750px
爲例,font-size
與 rem
是兩個變量,咱們只須要它們的乘積等於750
便可。咱們採用 定一變一的方式,假定rem=7.5
,那麼初始值font-size
就必須等於 100px
,咱們就能夠根據須要適配的屏幕寬度來等比例調整font-size
。那麼若是咱們750px
的視覺稿須要顯示成640px
呢,咱們只須要把font-size
對應的縮小就能夠了。其餘的各類的屏幕,只須要等比例縮放就行了。
JS
動態設置font-size
(簡單demo
,若有須要最好加上DomContentLoaded
和orientationchange
的監聽):
fnResize(); window.addEventListener("resize", function() { fnResize() }, false); function fnResize(){ var docWidth = document.documentElement.clientWidth, body = document.getElementsByTagName('html')[0]; body.style.fontSize = docWidth / 32 + 'px'; }
sass:
@function rem($px){ @return $px*(1/20)*1rem; } .ty_con{ minwidth: rem(300); /* 15rem */ }
問題:
部分安卓機rem
計算出來的font-size
老是要比預期要大一些或者小一些:華爲,魅族......(小數保留問題)這樣會致使最後的計算是不許確的。
解決方案1:
css
的使用上寬度佈局儘可能使用百分比,flex
和box-sizing
來作,減小寬度計算偏差產生的問題。icon
雪碧圖的圖標之間留白,在寫寬度的時候多寫幾像素使圖標居中。解決方案2:
在每次計算完頁面的fontSize
後,對某個實際元素的大小進行判斷,若是對比原來的比例有0.2
以上的出入,那就用這個比例去從新設置頁面的fontSize
。若是是正常狀況,就不會執行頁面fontSize
從新這一步。至此,問題也算是解決了。
解決方案3:
直接使用Flexible
實現H5
的終端適配
有興趣的小夥伴能夠看下Flexible
的解決方案:
使用Flexible實現手淘H5頁面的終端適配: http://www.w3cplus.com/mobile...
github地址: https://github.com/amfe/lib-f...
移動端Web適配單位rem的坑你知道多少 : http://www.jianshu.com/p/8300...
關於移動端 rem 佈局的一些總結: https://segmentfault.com/a/11...