rem詳解

rem的定義:相對(duì)長(zhǎng)度單位。相對(duì)于根元素(即html元素)[font-size]計(jì)算值的倍數(shù)

一硕舆、rem的誕生

為什么出現(xiàn)rem?傳統(tǒng)的絕對(duì)單位px骤公,你設(shè)置多少px抚官,網(wǎng)頁(yè)就給你顯示多少px,但是手機(jī)的屏幕大小寬度不同阶捆。例如一個(gè)手機(jī)的寬度為375px,此時(shí)網(wǎng)頁(yè)中恰好有個(gè)div的的寬度也是375px,那么這div正好占滿(mǎn)手機(jī)寬度凌节,假如另一個(gè)手機(jī)的寬度是320px,那么這個(gè)div就會(huì)超出手機(jī)屏幕55px洒试,這樣網(wǎng)頁(yè)會(huì)出現(xiàn)橫向滾動(dòng)條倍奢。這這種情況顯然是我們所不希望看到的,我們想要的是這個(gè)div也在這個(gè)小手機(jī)上恰好占滿(mǎn)手機(jī)寬度垒棋,也就是說(shuō)手機(jī)寬卒煞,div就寬,手機(jī)窄叼架,div就窄畔裕,實(shí)現(xiàn)自適應(yīng)大小。px顯然已經(jīng)不滿(mǎn)足這種要求乖订,rem就孕育而生了扮饶。

二、rem是如何實(shí)現(xiàn)自適應(yīng)大小的

由定義可以看出:rem(倍數(shù)) = width / (html的font-size)=> width = (html的font-size) * rem(倍數(shù))乍构,只要html的font-size的大小變了甜无,width就會(huì)自動(dòng)變,所以rem是通過(guò)動(dòng)態(tài)設(shè)置html的font-size來(lái)改變width的大小哥遮,以達(dá)到網(wǎng)頁(yè)自適應(yīng)大小的目的

三岂丘、如何動(dòng)態(tài)設(shè)置html的font-size

定義公式:rem(倍數(shù)) = width / (html的font-size),根據(jù)公式我們可以得出:
rem(倍數(shù)) = 設(shè)計(jì)稿寬度( imgWidth ) / 你設(shè)置的font-size( defalutSize )
rem(倍數(shù)) = 網(wǎng)頁(yè)的實(shí)際寬度(screenWidth) / 你需要?jiǎng)討B(tài)設(shè)置的font-size( x ) ,那么得出設(shè)置html的font-size的公式為:

imgWidth  / defalutSize = screenWidth / x
x = defalutSize * screenWidth / imgWidth

那么我們來(lái)定義一個(gè)函數(shù)來(lái)設(shè)置不同屏幕大小的html的font-size

function setSize() {
    //獲取html元素
    var html = document.documentElement;
    //獲取網(wǎng)頁(yè)寬度
    var screenWidth = html.clientWidth;
    //設(shè)置默認(rèn)的fontSize昔善,可以設(shè)置任何大小元潘,為了好計(jì)算在這里我設(shè)置為100
    var defalutSize = 100;
    //設(shè)計(jì)圖寬度為750
    var imgWidth = 750;
    //計(jì)算實(shí)際的font-size
    var currentFontSize = defalutSize * screenWidth / imgWidth
    //設(shè)置html的font-size
    var html.style.fontSize = currentFontSize + 'px';
}

那么當(dāng)網(wǎng)頁(yè)窗口大小發(fā)生變化(onresize)或者網(wǎng)頁(yè)dom元素加載完成(DOMContentLoaded)的這兩個(gè)事件發(fā)生時(shí)執(zhí)行setSize

//監(jiān)聽(tīng)窗口大小發(fā)生變化的事件
window.onresize = function(){
   setSize();
}
window.onDOMContentLoaded = function() {
   setSize();
}

很顯然上面的寫(xiě)法不夠優(yōu)雅,而且定義的setSize函數(shù)是全局的君仆,大部分開(kāi)發(fā)后面會(huì)有很多js翩概,說(shuō)不定就重名了,這樣一來(lái)會(huì)造成沖突返咱,所以我們寫(xiě)公共的js的時(shí)候應(yīng)該用閉包來(lái)包住钥庇,使其變量不會(huì)成為全局變量,那么上面綜合起來(lái):

  <script type="text/javascript">
    (function(w,d) {
        function setSize() {
            var screenWidth = d.documentElement.clientWidth;
            var currentFontSize = screenWidth * 100 / 750;
            d.documentElement.style.fontSize = currentFontSize + 'px';
        }
        w.addEventListener('resize',setSize);
        w.addEventListener('pageShow',setSize)
        w.addEventListener('DOMContentLoaded',setSize)

    })(window,document)
  </script>

現(xiàn)在已經(jīng)根據(jù)不同屏幕大小設(shè)置了根元素html的font-size,那么如何去用呢咖摹?假如設(shè)計(jì)圖是750评姨,那么根據(jù)上面的默認(rèn)font-size,defalutSize = 100,如果設(shè)計(jì)圖上一個(gè)長(zhǎng)方形是寬度是750px,高度是32px,那么換算成rem應(yīng)該是:

width: 750 / 100  = 7.5rem;
height:32 / 100  = 0.32rem;
.box{
     width:7.5rem;
     height: 0.32rem;
    background:red;
}

很明顯這個(gè)長(zhǎng)方形等于設(shè)計(jì)圖寬度,那么在網(wǎng)頁(yè)中也應(yīng)該占滿(mǎn)屏幕吐句,如果紅色長(zhǎng)方形寬度占滿(mǎn)屏幕說(shuō)明胁后,設(shè)置的rem實(shí)例成功,可以復(fù)制文章最后的代碼試試結(jié)果嗦枢!

現(xiàn)在看來(lái)把,defalutSize設(shè)置為100攀芯,大大的方便了計(jì)算,當(dāng)然可以設(shè)置為任意非負(fù)正整數(shù)文虏,因?yàn)椴徽撛O(shè)置多少侣诺,倍數(shù)rem永遠(yuǎn)是恒等的,也就是:

設(shè)計(jì)稿寬度( imgWidth )  /  你設(shè)置的font-size( defalutSize ) = 
網(wǎng)頁(yè)的實(shí)際寬度(screenWidth)  /  你需要?jiǎng)討B(tài)設(shè)置的font-size(currentFontSize) 

完整實(shí)例:

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">
        <title></title>
        <script type="text/javascript">
            (function(w,d) {
                function setSize() {
                    var screenWidth = d.documentElement.clientWidth;
                    var currentFontSize = screenWidth * 100 / 750;
                    d.documentElement.style.fontSize = currentFontSize + 'px';
                }
                w.addEventListener('resize',setSize);
                w.addEventListener('pageShow',setSize)
                w.addEventListener('DOMContentLoaded',setSize)

            })(window,document)
        </script>
        <style media="screen">
            *{
                padding: 0;
                margin:0;
            }
            div{
                width:7.5rem;
                height: 0.32rem;
                background: red;
            }
        </style>
    </head>
    <body>
        <div class="box">
        </div>
    </body>
</html>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末氧秘,一起剝皮案震驚了整個(gè)濱河市年鸳,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌丸相,老刑警劉巖搔确,帶你破解...
    沈念sama閱讀 221,273評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異已添,居然都是意外死亡妥箕,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門(mén)更舞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)畦幢,“玉大人,你說(shuō)我怎么就攤上這事缆蝉∮畲校” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 167,709評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵刊头,是天一觀的道長(zhǎng)黍瞧。 經(jīng)常有香客問(wèn)我,道長(zhǎng)原杂,這世上最難降的妖魔是什么印颤? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,520評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮穿肄,結(jié)果婚禮上年局,老公的妹妹穿的比我還像新娘。我一直安慰自己咸产,他們只是感情好矢否,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,515評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著脑溢,像睡著了一般僵朗。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,158評(píng)論 1 308
  • 那天验庙,我揣著相機(jī)與錄音顶吮,去河邊找鬼。 笑死壶谒,一個(gè)胖子當(dāng)著我的面吹牛云矫,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播汗菜,決...
    沈念sama閱讀 40,755評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼挑社!你這毒婦竟也來(lái)了陨界?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,660評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤痛阻,失蹤者是張志新(化名)和其女友劉穎菌瘪,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體阱当,經(jīng)...
    沈念sama閱讀 46,203評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡俏扩,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,287評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了弊添。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片录淡。...
    茶點(diǎn)故事閱讀 40,427評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖油坝,靈堂內(nèi)的尸體忽然破棺而出嫉戚,到底是詐尸還是另有隱情,我是刑警寧澤澈圈,帶...
    沈念sama閱讀 36,122評(píng)論 5 349
  • 正文 年R本政府宣布彬檀,位于F島的核電站,受9級(jí)特大地震影響瞬女,放射性物質(zhì)發(fā)生泄漏窍帝。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,801評(píng)論 3 333
  • 文/蒙蒙 一诽偷、第九天 我趴在偏房一處隱蔽的房頂上張望坤学。 院中可真熱鬧,春花似錦渤刃、人聲如沸拥峦。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,272評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)略号。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間玄柠,已是汗流浹背突梦。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,393評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留羽利,地道東北人宫患。 一個(gè)月前我還...
    沈念sama閱讀 48,808評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像这弧,于是被迫代替她去往敵國(guó)和親娃闲。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,440評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • 問(wèn)答題47 /72 常見(jiàn)瀏覽器兼容性問(wèn)題與解決方案匾浪? 參考答案 (1)瀏覽器兼容問(wèn)題一:不同瀏覽器的標(biāo)簽?zāi)J(rèn)的外補(bǔ)...
    _Yfling閱讀 13,756評(píng)論 1 92
  • rem是什么 rem(font size of the root element)是指相對(duì)于根元素的字體大小的單位...
    一只好奇的茂閱讀 4,751評(píng)論 1 25
  • 了解真實(shí)的『REM』手機(jī)屏幕適配rem 作為一個(gè)低調(diào)的長(zhǎng)度單位皇帮,由于手機(jī)端網(wǎng)頁(yè)的興起,在屏幕適配中得到重用蛋辈。 使用...
    張憲宇閱讀 2,246評(píng)論 0 5
  • 文:ShakespeareSky(莎士比亞斯基) 第十一節(jié) 收到日記本 元旦一過(guò)属拾,天氣就越發(fā)地冷了起來(lái),轉(zhuǎn)眼就期末...
    ShakespeareSky閱讀 831評(píng)論 0 0
  • 學(xué)習(xí)《AngularJS深度剖析與實(shí)踐》總結(jié) 在我們平時(shí)的開(kāi)發(fā)中冷溶,需要對(duì)某些數(shù)據(jù)進(jìn)行以樹(shù)的形式進(jìn)行展現(xiàn)渐白,比如:權(quán)限...
    focusOn閱讀 928評(píng)論 0 2