1. 程式人生 > >html中rem的理解&簡單運用示例

html中rem的理解&簡單運用示例

作為一名前端開發工程師,很有必要梳理並記錄下自己成長過程中的問題,以溫故知新。

儘量做到:

  1. 把前端開發成長中遇到的概念,原子性的拆分開,單獨的去理解學習;
  2. 不新增太多個人情感化詞句,以知識為中心;
  3. 會運用,不等於理解,文章側重於理解
?rem是什麼

rem是css中的單位。

類同舉例:

height: 1px

表示height的值為1個css畫素;

vertial-align: 50%

表示vertial-align的值為設定該樣式的元素的當前line-height 的高度的一半;

width: 1rem

表示width的值為1 倍的dom文件的html標籤上font-size的值,即如果html的font-size為14px,那麼width的值就是1倍的14px,即14px.
 
px, %, rem均表示一種單位

? 進一步理解rem

一些效果需要根據外部盒子的大小自適應,是一個因變數。

div {
	width: 50%;
}

例如設定div寬度為50%,表示匹配的div會是外部盒子寬度的一半,通過這種設定,改變了外部盒子寬度後,這些div會跟著調整寬度,即這些div表示為響應式的。
可以理解為:響應的佈局需要有一個參照點,對於上面的例子,該參照點為父級元素


響應式頁面中,通常整個頁面的大部分元素都要根據參照點表現為響應式的,而統一的參考點的最好選擇就是dom最外層的html。
至此,應該不難理解rem的存在意義了。

?如何使用rem

通常設計師提供的效果圖都是指定寬度的效果,如750px等,因此可以在編寫html時,一開始就設定整個dom文件html標籤的font-size,假設設定的font-size為x,然後頁面的其他元素便可以根據這個參照點,計算出大小並以rem作為單位。

?如何適配解析度不同的裝置

可以動態的改變上述中的x值,即可使得頁面中設定了rem的元素大小對應變化。
因此可以在html文件中新增javascript指令碼,動態設定x

。相關程式碼:

;(function(win, doc) {
    'use strict';
    var options = { width: 750, dpr: win.devicePixelRatio };
    var html = doc.documentElement,
        width = html.getAttribute('data-width') || options.width,
        dpr = html.getAttribute('data-dpr') || options.dpr,
        viewPort = doc.querySelector('meta[name="viewport"]'),
        rotate = win.onorientationchange ? 'orientationchange' : 'resize';

    // 設定html fontSize
    function setSize() {
        var winWidth = win.innerWidth || html.clientWidth;
        html.style.fontSize = 100 * winWidth / width + 'px';
    };

    // 設定 initial-scale
    function setScale() {
        setSize();
        var viewContent = viewPort.getAttribute('content');
        var reg = /initial-scale=(\d(.\d+)?)/i;
        var matchRes = viewContent.match(reg);
        var scale = 1 / parseInt(dpr);
        if (matchRes && matchRes[1] == scale) {
            return;
        }
        var newContent = viewContent.replace(reg, function(a, b) {
            return a.replace(/\d(.\d+)?/i, scale);
        });
        viewPort.setAttribute('content', newContent);
    };
    
    win.addEventListener(rotate, setSize);
    window.requestAnimationFrame = window.requestAnimationFrame || window.webkitRequestAnimationFrame;
    requestAnimationFrame(setScale);
}(window, document));

至此,結束。