rem/em/px/pt的基友關係
px
畫素相對長度單位,相對於顯示器螢幕解析度而言
em
相對長度單位,根據其父元素來設定字型大小
pt
point,是印刷行業常用單位,等於1/72英寸
rem
CSS3新增的一個相對單位,是根據網頁的跟元素(html)來設定字型大小
rem應用於適配
rem的特性同樣適用於width和height,我們可以根據根元素的font-size值來改變元素的寬高值,由此我們應該可以聯想到我們可以根據螢幕大小動態地給html設定不同的值,從而達到我們css樣式中的適配效果。
rem的適配規則
1.選擇基準
雖然我們所寫出的頁面要在不同的螢幕大小裝置上執行,但是我們寫頁面的時候,必須要選擇其中一種螢幕大小作為初始的基準,而這個基準的選擇應該根據我們所拿到的視覺稿來決定,
2.rem數值計算
正常情況下rem的值預設為16px,這樣在整個頁面的css計算過程中太過繁瑣。比如,現在有個30px寬度的元素,就得寫成30/16rem。對於整個頁面來說工作量還是挺大的。所以這裡提供了倆種方法
- 可以將html的font-size設定成100px
這樣設定,在寫單位時直接將數值除以100在加上rem的單位就可以了。如果設計稿的字型是16px;我們就可以寫成1.6rem。- 這裡為什麼不用10?
因為google等瀏覽器對最小字型有限制,即最小為12px,所以設定10px會有問題。
- 這裡為什麼不用10?
-
使用sass
$rem : 16x; @function px_rem($px){ @return ($px/$rem) + rem; }
3.動態設定html的font-size
隨著螢幕大小的改變,html的font-size的值應該是基準rem*改變後的螢幕寬度 / 基準螢幕寬度
-
利用css的media query來設定(這種是一個寬度區間內一個rem)
@media (min-device-width : 375px) and (max-device-width : 667px) and (-webkit-min-device-pixel-ratio : 2){ $rem : 16x; }
-
利用javascript來動態設定(這種方法每一個寬度點都會有一個新的rem)
document.getElementsByTagName('html')[0].style.fontSize = 基準rem*window.innerWidth / 基準螢幕寬度 + 'px';
考慮dpr
一般我們獲取到的視覺稿大部分尺寸是雙倍大小的,我們一般會自覺的將標註/2,但是當我們配合rem使用時,完全可以按照視覺稿上的尺寸來設定。
-
設計給的稿子雙倍的原因是iphone等高清屏手機的存在,高清屏的畫素比(device pixel ratio)dpr比較大,所以顯示的畫素較為清晰。
-
一般手機的dpr是1,iphone4,iphone5這種高清屏是2,iphone6s plus這種高清屏是3,可以通過js的window.devicePixelRatio獲取到當前裝置的dpr,所以iphone6給的視覺稿大小是(*2)750×1334了。
-
拿到了dpr之後,我們就可以在viewport meta頭裡,取消讓瀏覽器自動縮放頁面,而自己去設定viewport的content
meta.setAttribute('content', 'initial-scale=' + 1/dpr + ', maximum-scale=' + 1/dpr + ', minimum-scale=' + 1/dpr + ', user-scalable=no');
這樣我們就直接可以使用視覺稿上的尺寸了。