谈谈rem移动端布局

使用rem实现自适应布局,应该算是当前移动前端的一大趋势,有些人对此还有点迷惑,搞不懂rem是如何实现自适应布局,如何根据设计稿来调整rem的值?rem布局如何用雪碧背景图片?rem必定要加载JS吗?rem的根html font-size设置为多少合适?看看这篇文章,也许能帮到你。css

若是对你有用,还请点个赞,谢谢!html

em自适应原理
rem是根据html的font-size大小来变化,正是基于这个出发,咱们能够在每个设备下根据设备的宽度设置对应的html字号,从而实现了自适应布局。更多介绍请看这篇文章:rem是如何实现自适应布局的。前端

rem的值
目前有两种,一种是根据js来调整html的字号,另外一种则是经过媒体查询来调整字号。git

使用jsgithub

;(function(designWidth, maxWidth) {
    var doc = document,
        win = window;
    var docEl = doc.documentElement;
    var tid;
    var rootItem,rootStyle;

    function refreshRem() {
        var width = docEl.getBoundingClientRect().width;
        if (!maxWidth) {
            maxWidth = 540;
        };
        if (width > maxWidth) {
            width = maxWidth;
        }
        //与淘宝作法不一样,直接采用简单的rem换算方法1rem=100px
        var rem = width * 100 / designWidth;
        //兼容UC开始
        rootStyle="html{font-size:"+rem+'px !important}';
        rootItem = document.getElementById('rootsize') || document.createElement("style");
        if(!document.getElementById('rootsize')){
        document.getElementsByTagName("head")[0].appendChild(rootItem);
        rootItem.id='rootsize';
        }
        if(rootItem.styleSheet){
        rootItem.styleSheet.disabled||(rootItem.styleSheet.cssText=rootStyle)
        }else{
        try{rootItem.innerHTML=rootStyle}catch(f){rootItem.innerText=rootStyle}
        }
        //兼容UC结束
        docEl.style.fontSize = rem + "px";
    };
    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);
    }})(640, 640);

你能够把上面的代码内嵌到html的head中,换算比例是1rem=100px,为了计算方便,你能够在个人一个github项目下载完整的结构和一个压缩的js。浏览器

项目主页app

上面代码中的关键代码是:布局

var width = docEl.getBoundingClientRect().width;
var rem = width * 100 / designWidth;
docEl.style.fontSize = rem + "px";

第一行代码,获取移动设备的宽度,第二行,rem的值等于(设备的宽度)x100/(设计稿宽度),第三行,设置html的字号为第二行的值。
有些人可能会注意到第二行代码跟淘宝的那个有所区别,区别就在于rem的换算比例,这里你能够任意改动为实际中的状况,好比有人喜欢用20px,那你能够将上面的100改成20,换算比例则改成1rem=20px。关于上面这段代码能够看以前的文章:Rem精简版实现自适应。
还有的人要用回淘宝的那个,那么第二行代码能够变为var rem = width/10; 换算比例则改成根据设计稿的宽度来调整了,假设咱们的设计稿宽是640的,则html的字体大小则被设为64px.则至关于1rem=64px。具体实现请看以前的文章:rem自适应布局-flexible。
使用媒体查询
说到底,上面的js代码不就是根据不一样的设备调整对应的html字号嘛,那么咱们根据实际的设备,来加上相应的字号不就好了吗?字体

咱们知道html的默认字号是16px,则对应的设备下能够经过设置对应的font-size使其有一致的缩放比例。flex

html {
font-size: 62.5%
}

@media only screen and (min-width: 481px) {
html {
font-size:94%!important
}
}

@media only screen and (min-width: 561px) {
html {
font-size:109%!important
}
}

@media only screen and (min-width: 641px) {
html {
font-size:125%!important
}

body {
max-width: 640px
}
}

上面的代码则是经过1rem=20px来换算的,从哪里看出来呢?从最大的一个值640出发,假如你的设计稿是750的话,那你还要设计更多的媒体 查询,换算比例保持一致就能够了。那若是我想要换算比例为1rem=100呢?按照上面的规则,最大的值为:html:font- size:100/16100%,其它的则按比例,好比480px,则为480/640(100/16*100%)。

其余适配方式 :https://blog.csdn.net/irokay/...

相关文章
相关标签/搜索