前端移动端适配方案

122 阅读1分钟
# 注释:rem适配,基于iphone6,一倍设计稿 计算方式 1rem = 根元素字体大小 
1、根据分辨率动态计算根元素尺寸
(function (doc, win) {
        var dpr = win.devicePixelRatio,
            scale = 1;
        var metaEl = doc.querySelector('meta[name="viewport"]');
        //动态改写meta:viewport标签
        if (!metaEl) {
            metaEl = doc.createElement('meta');
            metaEl.setAttribute('name', 'viewport');
            metaEl.setAttribute('content', 'width=device-width,initial-scale=' + scale + ',maximum-scale=' + scale + ',minimum-scale=' + scale + ',user-scalable=no');
            document.documentElement.firstElementChild.appendChild(metaEl);
        } else {
            metaEl.setAttribute('content', 'width=device-width,initial-scale=' + scale + ',maximum-scale=' + scale + ',minimum-scale=' + scale + ',user-scalable=no');
        }
        var fn = function () {
            //获取的是物理像素,设备横向分辨率
            var deviceWidth = doc.documentElement.clientWidth;
            var fontSize = deviceWidth * 10 / 37.5;
            doc.documentElement.setAttribute('style', 'font-size:' + fontSize + 'px!important');
        }
        window.addEventListener('orientationchange' in win ? 'orientationchange' : 'resize', fn, false);
        doc.addEventListener('DOMContentLoaded', fn, false);

    })(document, window)
2、根据dpr设置不同的更元素字体大小
以下是dpr相关的js:
(function(doc,win){
        var docEl=win.document.documentElement;
        var metaEl=doc.querySelector('meta[name="viewport"]');
        var dpr=win.devicePixelRatio;
        var scale=1/dpr;
        //对iOS设备进行dpr的判断,对于Android系列,始终认为其dpr为1,安卓dpr bug较多
        if(!dpr&&!scale){
            var isIPhone=win.navigator.appVersion.match(/[iphone|ipad]/gi);
            var devicePixelRatio=win.devicePixelRatio;
            if(isIPhone){
                dpr=devicePixelRatio;
            }else{
                dpr=1;
            }
            scale=1/dpr;
        }
        /**
         *================================================
         *设置data-dpr和viewport
         ×================================================
         */
        docEl.setAttribute('data-dpr',dpr);
        //动态改写meta:viewport标签
        if(!metaEl){
            metaEl=doc.createElement('meta');
            metaEl.setAttribute('name','viewport');
            metaEl.setAttribute('content','width=device-width,initial-scale='+scale+',maximum-scale='+scale+',minimum-scale='+scale+',user-scalable=no');
            document.documentElement.firstElementChild.appendChild(metaEl);
        }else{
            metaEl.setAttribute('content','width=device-width,initial-scale='+scale+',maximum-scale='+scale+',minimum-scale='+scale+',user-scalable=no');
        }
    })(document,window);
以下是dpr相关的css:
html[data-dpr=2] { font-size: 32px }
html[data-dpr=3] { font-size: 48px }

其他移动适配方案

1、可使用媒体查询,在不同尺寸设置根元素(html)的字体大小 2、可使用vw和vh,也可实现适配,配合rem更好;使用vw设置根元素字体大小,其他元素使用rem