摘要:移動端的開發基本很少直接使用作為單位了,目前最常用的是。一般移動端頁面的開發流程是設計人員以某個機型作為標準,設計好。前端開發針對這個機型的做開發,然后其它機型相對的去等比例縮放。
移動端的開發基本很少直接使用px作為單位了,目前最常用的是rem。不過在這之前其實還有個em單位,和rem長得非常的像,那么它們有什么區別呢?又有什么不一樣的適用場景呢?
注意:無論使用em,還是rem,客戶端最終解析的值依舊是px!em:相對父級元素字體大小的倍數
從title的解釋就可以看出,em的基準是其父級元素,不過這個父級元素要求是設置有font-size值的,如下面的例子:
那么son的字體大小就是2 * 20px = 40px,此時,如果father的字體大小變化了,那么son的也會跟著變化。假如沒有父元素,則基準就是body(由于默認瀏覽器默認字體為16px,所以默認情況1em=16px)。
rem:相對 html 根元素字體大小的倍數跟上面解釋body基準時的差不多,默認情況下1rem=16px。此時,只要根元素字體大小不變,那么相對于它的rem就不會變。
對于移動端的各種機型來講,由于不同的機型屏幕尺寸、分辨率都不一樣,不太可能使用相同的根元素字體大小作為基準,所以所謂rem布局,就是通過js動態計算出不同機型的根元素字體大小值,來對頁面進行等比例的縮放,達到適配大部分機型的效果。
那么具體如何去設定這個基準呢?
假設把手機屏幕寬度均分成10等份(因為rem布局就是針對寬度去做設定的),規定其中的一份作為根元素的font-size值,那么根元素font-size值就可由下述公式獲得:
document.documentElement.style.fontSize = document.documentElement.clientWidth / 10 + "px";
在這個基準下,那么1rem的值也隨之得到了:
1rem = document.documentElementstyle..fontSize = document.documentElement.clientWidth / 10 + "px";
那么,不同屏幕的機型由于屏幕寬度不同,也就得到了在"屏幕寬度均分成10等份"這個標準下的rem相對值。比較完整的計算方式如下:
// set 1rem = viewWidth / 10 function setRemUnit () { var rem = docEl.clientWidth / 10 docEl.style.fontSize = rem + "px" } setRemUnit() // reset rem unit on page resize window.addEventListener("resize", setRemUnit) window.addEventListener("pageshow", function (e) { if (e.persisted) { setRemUnit() } })
注意:這里的標準 "10"可以是任一值,只要跟下面轉換公式中用到的標準值保持一致即可,這里只是為了計算方便才這么設定。
這樣,rem的基礎生態就搭建好了。那么如何基于這套標準應用到開發中去呢?
在繼續之前,先來了解下"像素"這個知識點,因為接下來都會用到它的概念。
像素分為兩種:設備像素和CSS像素
1、設備像素(device independent pixels): 設備屏幕的物理像素,任何設備的物理像素的數量都是固定的
2、CSS像素(CSS pixels): 又稱為邏輯像素,是為web開發者創造的,在CSS和javascript中使用的一個抽象的層
在pc端,css像素和物理像素是1:1的關系;而在移動端,由于類似retina的各種高清屏的出現,css像素和物理像素的關系一般是1:2或者1:3,即1個css像素容納2到3個物理像素,實現高清的效果。
一般移動端頁面的開發流程是:設計人員以某個機型作為標準,設計好UI。前端開發針對這個機型的UI做開發,然后其它機型相對的去等比例縮放。
這里以iphone6作為標準(因為實際開發中基本也是用它做設計),它的物理像素為750x1334,css像素為375*667,假設UI上圖片a的寬度為140,那么如何把它轉換成以rem為單位的值呢?
現在屏幕寬度是已知的10rem,要求UI上寬140的rem值,假設為X,由下圖可以很容易的得到比例關系:
屏幕寬度/UI寬度 = x/140 = 10rem / 750 =》 x = 140 / 750 * 10 rem
一般可以在sass中通過封裝預處理函數進行這個轉換過程:
$UI_WIDTH: 750; @function px2rem($px) { @return ${ $px / $UI_WIDTH * 10 }rem; //=>or @return ${ $px / 75 }rem; } img{ width: px2rem(140); }
這就是"rem布局"原理的整個實現過程!
而隨著社區各種工具的完善,現在也無需手動去使用如px2rem的這種預處理函數去轉換,比較流行的做法是使用postcss的postcss-px2rem插件去自動處理,開發時仍然按照px的方式去編程,postcss配置例:
postcss: function() { return [px2rem({remUnit: 75})]; //設置基準值,75是以iphone6的標準 }
這里的remUnit設置是有一定規則的,比如屏幕寬度等分成10份,當UI以iphone6(即物理像素寬度750)設計時,remUnit=75;當UI以iphone5(即物理像素寬度640)設計時,remUnit=64。可以看出它中遵循如下公式:
remUnit = 物理像素寬度 / 設定的屏幕寬度等分值;
至于具體的js等分邏輯封裝可以參看手淘的flexible。
em 還是 rem ?那么在實際開發中,究竟適用em還是rem呢?記住如下原則即可:
如果屬性值根據元素的font-size獲得,則使用em,如padding、margin、line-height等
其他情況都使用rem
本文收錄在個人的Github上https://github.com/kekobin/bl... ,覺得有幫助的,歡迎start哈。支持原創,未經本人同意,請勿轉載!
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/114906.html
摘要:移動端的開發基本很少直接使用作為單位了,目前最常用的是。一般移動端頁面的開發流程是設計人員以某個機型作為標準,設計好。前端開發針對這個機型的做開發,然后其它機型相對的去等比例縮放。 移動端的開發基本很少直接使用px作為單位了,目前最常用的是rem。不過在這之前其實還有個em單位,和rem長得非常的像,那么它們有什么區別呢?又有什么不一樣的適用場景呢? 注意:無論使用em,還是rem,客...
摘要:中是這樣定義的屬性指定一個元素應沿其容器的左側或右側放置,允許文本和內聯元素環繞它。其同樣適用于設置屬性為絕對定位或固定定位的內聯元素。至于為什么,可以理解為內聯元素沒有盒模型,其高度由內容決定。 白話:即上一篇我腦中飄來飄去的css魔幻屬性自己的文章推出之后,這是自己寫的第四篇CSS相關的文章,文章絕大部分是自己工作總結得來,另一部分是平日sf回答的與面試中向面試官交流學到的,都是一...
閱讀 3828·2021-10-08 10:12
閱讀 4325·2021-09-02 15:40
閱讀 935·2021-09-01 11:09
閱讀 1605·2021-08-31 09:38
閱讀 2543·2019-08-30 13:54
閱讀 2249·2019-08-30 12:54
閱讀 1243·2019-08-30 11:18
閱讀 1399·2019-08-29 14:06