Rem及其使用

2020-04-17  本文已影响0人  小龙虾Julian
1、rem是什么

(font size of the root element)是指相对于根元素的字体大小的单位

2、兼容性

目前,IE9+,Firefox、Chrome、Safari、Opera 的主流版本都支持了rem。即使浏览器不支持rem,就多写一个绝对单位的声明即可,浏览器会忽略用rem设定的字体大小。

3、62.5%的来源:

(1)首先浏览器的默认字体大小是16px

(2)100%=16px => 6.25%=1px => 62.5%=10px,因为rem是相对于根元素,因此在css的html中全局声明font-size=62.5%,此时的1rem就等于10px,这样一来rem和px之间的换算就比较简单,使用起来更方便

(3)使用JS根据浏览器宽度(或浏览器可视区域宽度(clienWidth))动态设置html的大小

$(function(){// 改变rem基准值(即设置html的大小)
    // 屏幕宽度 / 基准值 : 480px / 18px(自己设定的,480px是设计稿的宽度)
    var window_width = $(window).width();
    var rule_num = window_width * 18 / 480;
    if(window_width > 768){     //这里的判断根据项目实际情况而定
        $("html").css("font-size", 20 + "px");
    }else{
        $("html").css("font-size", rule_num + "px");
    }
})  

通过JS动态设置根元素的font-size,这样的好处是所有设备分辨率都能兼容适配,淘宝首页目前就是用的JS计算。如果不用JS也是可以做适配的,一般我们在做web app都会先统计自己网站有哪些主流的屏幕设备,然后去针对这些设备去做media query设置也可以实现适配,如:

(4)使用媒体查询设置根元素大小——rem和px在响应式中的应用对比,如:

@media only screen and (min-width: 480px){
    html {
                font-size: 62.5% !important;  //代表1rem=10px
    }
    #example-rem{
        font-size: 3rem;
        color: #900
    }
    #example-px{
        font-size: 30px;
        color: #9c9
    }
}
@media only screen and (min-width: 768px){
    html {
        font-size: 125% !important;  //代表1rem=20px
    }
    #example-rem{
        font-size: 3rem;
        color: #f90
    }
    #example-px{
        font-size: 60px;
        color: #9c9
    }
}
@media only screen and (min-width: 1280px){
    html {
        font-size: 150% !important;  //代表1rem=25px
    }
    #example-rem{
        font-size: 3rem;
        color: #9cf
    }
    #example-px{
        font-size: 75px;
        color: #9c9
    }
}
@media only screen and (min-width: 1680px){
    html {
        font-size: 187.5% !important;  //代表1rem=30px
    }
    #example-rem{
        font-size: 3rem;
        color: #0c9
    }
    #example-px{
        font-size: 90px;
        color: #9c9
    }
}   
<div id="example-rem">字体大小(rem)</div>
<div id="example-px">字体大小(px)</div>

(5)Rem自适应JS,现在也有封装好的JS供我们直接使用

//designWidth:设计稿的实际宽度值,需要根据实际设置
//maxWidth:制作稿的最大宽度值,需要根据实际设置
//这段js的最后面有两个参数记得要设置,一个为设计稿实际宽度,一个为制作稿最大宽度,例如设计稿为750,最大宽度为750,则为(750,750)
;(function(designWidth, maxWidth) {
    var doc = document,
    win = window,
    docEl = doc.documentElement,
    remStyle = document.createElement("style"),
    tid;

    function refreshRem() {
        var width = docEl.getBoundingClientRect().width;
        maxWidth = maxWidth || 540;
        width>maxWidth && (width=maxWidth);
        var rem = width * 100 / designWidth;
        remStyle.innerHTML = 'html{font-size:' + rem + 'px;}';
    }

    if (docEl.firstElementChild) {
        docEl.firstElementChild.appendChild(remStyle);
    } else {
        var wrap = doc.createElement("div");
        wrap.appendChild(remStyle);
        doc.write(wrap.innerHTML);
        wrap = null;
    }
    //要等 wiewport 设置好后才能执行 refreshRem,不然 refreshRem 会执行2次;
    refreshRem();

    win.addEventListener("resize", function() {
        clearTimeout(tid); //防止执行两次
        tid = setTimeout(refreshRem, 300);
    }, false);

    win.addEventListener("pageshow", function(e) {
        if (e.persisted) { // 浏览器后退的时候重新计算
            clearTimeout(tid);
            tid = setTimeout(refreshRem, 300);
        }
    }, false);

    if (doc.readyState === "complete") {
        doc.body.style.fontSize = "16px";
    } else {
        doc.addEventListener("DOMContentLoaded", function(e) {
            doc.body.style.fontSize = "16px";
        }, false);
    }
})(750, 750);

(6)屏幕适配还有一种简单粗暴的做法,即设置viewport进行缩放
天猫web app的首页就采用过这种方式,以320宽度为基准,进行缩放,最大缩放为320*1.3 = 416,基本缩放到416都就可以兼容iphone6 plus的屏幕了,这个方法简单粗暴,又高效。

<meta name="viewport" content="width=320,maximum-scale=1.3,user-scalable=no">
上一篇下一篇

猜你喜欢

热点阅读