用 rem 實現(xiàn)移動設備頁面元素適配

目錄

  • 1 什么是 rem
  • 2 rem 適配算法
  • 3 適配舉例
  • 4 實際開發(fā)




1 什么是 rem

rem (font size of the root element) 表示的是根元素的字體大小,如下:

html {
    font-size: 16px;
}

根元素字體大小為 16px,那么 1rem = 16px。




2 rem 適配算法

rem 作為一個長度單位,除了可以作為字體大小來設置,還可以設置 html 的任何元素的尺寸。一般來說,移動設備大小不一,同一個頁面元素要在不同的設備上進行適配,以保證視覺效果。

一個總的原則是 將元素的尺寸大小基于設備的屏幕寬度進行重新計算 。我們設屏幕寬度為 W (單位:px);該設備 1 個單位 rem 的值為 R (單位:px);目標元素要設置的尺寸大?。ū热缭氐拈L或者寬)為 Sp (單位:px) 或 Sr (單位:rem)。

首先,WSp 都有一個初始值,它們的值等于設計師給定的設計圖標注。一般來說設計師會根據(jù)某一種設備的屏幕尺寸來進行設計,比如 iPhone6,其屏幕寬度為 375px。假設初始值分別為:w s,于是有:

第一步,初始化 WSp;

W = w // =375px for iPhone6
Sp = s // 設計稿實際標注的值

第二步,計算 R 以及 Sr;

R = W / 10
Sr = Sp / R // 此為 Sr 的最終值

第三步,在不同尺寸設備上重新計算 R,并將其值設置為根元素的字體大小,并更新 Sp

R = W / 10 // 同時設置:document.getElementsByTagName('html')[0].style.fontSize = R + 'px'
Sp = Sr * R // 重新計算出 px 值

注意:

  • 為什么 R 的計算是屏幕寬度除以 10 呢? 其實理論上直接設置 R = W 也是可以的,但是這樣一來,默認的字體大小就顯得過大,除以 10 可以當做是一種約定俗成的規(guī)定。
  • 實際上 Sp 的計算并不是必要的。 當在第二步計算出 Sr 之后,就可以直接將目標元素的尺寸設置為 element.style.width/height = Sr + 'rem',之所以每次計算 Sp 是為了便于說明它的實際像素值。




3 適配舉例

作為以上算法的一個例子。我們假設設計稿是按照 iPhone6 的尺寸給出的,某個 div 元素的寬度在設計中標注為 60px,于是:

第一步:

W = 375
Sp = 60

第二步:

R = W / 10 = 375 / 10 = 37.5
Sr = Sp / R = 60 / 37.5 = 1.6

這一步,我們將直接設置 div 的寬度為 1.6rem 就可以了。

第三步,我們假設新的需要適配的設備為 iPhone6 Plus,寬度為 414px:

R = W / 10 = 414 / 10 = 41.4
Sp = Sr * R = 1.6 * 41.4 = 66.24

所以在 iPhone6 Plus 上,其寬度實際為 66.24px。




4 實際開發(fā)

在實際開發(fā)中,我們要執(zhí)行以下兩步:

  1. 根據(jù)設計稿,我們要先完成算法的前兩步。即按照設計基于的設備,計算出一個初始的 R 值,然后將每個目標元素的尺寸換算成 Sr;
  2. 最后,在頁面渲染之前,需要重新計算根元素的字體大小,即 W
document.getElementsByTagName('html')[0].style.fontSize = window.innerWidth / 10 + 'px';

以上的第一步往往比較繁瑣,因為每一個元素都需要手動換算成 rem 值。一種可行的辦法是,在 css 的實際設置中,仍然按照設計稿給出的像素值直接設置,然后寫一個腳本程序,其功能是將所有的 css 文件中的尺寸大小都按照上述的算法換算成對應的 Sr 值。在測試頁面之前,先執(zhí)行該腳本即可。

實際上,已經(jīng)有相應的插件實現(xiàn)了此腳本的功能了—— PxToRem,我們可以在 webpack 的 postcss-loader 里包含這個插件,具體的用法,可以參考 webpack 官網(wǎng)指南以及 PxToRem 插件說明




加入技術(shù)交流群

準備建立一個技術(shù)交流群,大家可以討論技術(shù)、內(nèi)推工作、互相幫助。因為二維碼容易失效,個人微信號加太多容易被封,所以請大家先關(guān)注公眾號——小舍,然后在公眾號給我發(fā)送消息,我拉大家入群。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容