淘宝移动端适配

;(functionwinlib){
    var doc =  win。文件 ; // win = window,lib = window.lib;
    var docEl =  doc。documentElement ;
    var metaEl =  doc。querySelector(' meta [name =“viewport”] ');
    var flexibleEl =  doc。querySelector(' meta [name =“flexible”] '); //这样的写法没有尝试过
    var dpr =  0 ;
    var scale =  0 ;
    VAR TID;
    var flexible =  lib。灵活 || (LIB。灵活 = {});

    //创建元:vp,并根据设备屏幕像素比来设置dpr的值,设置scale = 1 / dpr,保留小数点后2位;
    //当设置过的元标签之后,其根据其自定义的缩放放比来设置
    if(metaEl){
        控制台。警告('将根据已有的元标签来设置缩放比例');
        var match =  metaEl。getAttribute(' content ')。match(/ initial \  - scale =([ \ d \。 ] +)/);
        if(match){
            scale =  parseFloat(match [ 1 ]);
            dpr =  parseInt(1  / scale); //获取屏幕像素比
        }
    } else  if(flexibleEl){
        var content =  flexibleEl。getAttribute(' content ');
        if(content){
            var initialDpr =  content。match(/ initial \  - dpr =([ \ d \。 ] +)/);
            var maximumDpr =  content。match(/ maximum \  - dpr =([ \ d \。 ] +)/);
            if(initialDpr){
                dpr =  parseFloat(initialDpr [ 1 ]);
                规模=  parseFloat((1  / DPR)。toFixed(2));   
                // 3.1415.toFixed(2),保留2位小数点
            }
            if(maximumDpr){
                dpr =  parseFloat(maximumDpr [ 1 ]);
                规模=  parseFloat((1  / DPR)。toFixed(2));    
            }
        }
    }

    //当没有设置的元标签之后,根据设备信息来设置屏幕缩放比
    if(! dpr &&  ! scale){
        var isAndroid =  win。导航仪。appVersion。match(/ android / gi);
        var isIPhone =  win。导航仪。appVersion。比赛(/ iphone / gi);
        var devicePixelRatio =  win。devicePixelRatio ;
        if(isIPhone){
            // iOS下,对于2和3的屏,用2倍的方案,其余的用1倍方案
            if(devicePixelRatio > =  3  &&(! dpr || dpr > =  3)){                
                dpr =  3 ;
            } else  if(devicePixelRatio > =  2  &&(! dpr || dpr > =  2)){
                dpr =  2 ;
            } else {
                dpr =  1 ;
            }
        } else {
            //其他设备下,仍旧使用1倍的方案,但是FS并不是固定的
            dpr =  1 ;
        }
        scale =  1  / dpr;
    }


    //给文档设置自定义属性,保存DPR的值
    docEl。setAttribute(' data-dpr ',dpr);

    //创建的元标签,设置初始比,最小比和最大比均为规模值,并将其插入到页面
    //设置了缩放比,那么相当于这个屏幕渲染在一个被放大的画布之上。
    if(! metaEl){
        metaEl =  doc。createElement(' meta ');
        metaEl。setAttribute(' name '' viewport ');
        metaEl。的setAttribute('内容''初始规模= '  +规模+  '最大尺度= '  +规模+  '最小刻度= '  +规模+  '用户可扩展=无');
        如果(docEl。firstElementChild){
            docEl。firstElementChild。appendChild(metaEl);
        } else { //并没有什么作用
            var wrap =  doc。createElement(' div ');
            包裹。appendChild(metaEl);
            doc。写(涡卷。innerHTML的);
        }
    }

    //自定义页面元素的字体大小,方便REM的配置
    function  refreshRem(){
        var width =  docEl。getBoundingClientRect()。宽度 ;
        //屏幕信息,屏幕宽度,结合:绑定; RECT:矩形
        if(width / dpr >  640){
            width =  640  * dpr;
        }
        var rem = width /  10 ;
        docEl。风格。fontSize  = rem +  ' px ' ;
        灵活。rem  =  win。rem  = rem
    }

    / **
     *对于设计稿为320px的,根元素fontsize = 32px;
     *对于设计稿为1080px的,根元素fontsize = 108px;
     *设屏幕的宽度为w(rem * 10),设计稿尺寸为w,那么有比例关系w:rem * 10 = x:1;
     * ==> x = w /(rem * 10);(单位)
     *那么任意设计稿尺寸L转化为相应的尺寸就为:L / x =(L * rem * 10)/ w;
     *由于rem设置给根元素了,那么所有的尺寸均可以用rem单位来操作;
     * xrem =(L * rem * 10)/ w * fontsize =(L * 10)/ w;
     *那么在设计稿中量取L长度的,在编辑器中就为(L * 10 / w)rem;
     *如此便完成了rem的自动适配
     * / 

    双赢。addEventListener(' resize 'function(){
        clearTimeout(tid);
        tid =  setTimeout(refreshRem,300);
    },false);
    双赢。addEventListener(' pageshow 'functione){
        如果(Ë。坚持){
            clearTimeout(tid);
            tid =  setTimeout(refreshRem,300);
        }
    },false);

    //设置页面的身体的大小,目前发现有何用
    如果(DOC。readyState的 ===  '完整'){
        doc。身体。风格。fontSize  =  12  * dpr +  ' px ' ;
    } else {
        doc。addEventListener(' DOMContentLoaded 'functione){
            doc。身体。风格。fontSize  =  12  * dpr +  ' px ' ;
        },false);
    }

    //页面初始化
    refreshRem();

    //提供一些方法
    灵活。dpr  =  win。dpr  = dpr
    灵活。refreshRem  = refreshRem;
    灵活。rem2px  =  functiond){
        var val =  parseFloat(d)*  this。REM ;
        如果(typeof运算 ð ===  '字串'  &&  ð。匹配(/ REM $ /)){
            val + =  ' px ' ;
        }
        返回 VAL;
    }
    灵活。px2rem  =  functiond){
        var val =  parseFloat(d)/  this。REM ;
        如果(typeof运算 ð ===  '字串'  &&  ð。匹配(/ PX $ /)){
            val + =  ' rem ' ;
        }
        返回 VAL;
    }

})(window,window [ ' lib ' ] ||(window [ ' lib ' ] = {}));
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值