;(function(win,lib){
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 ',function(e){
如果(Ë。坚持){
clearTimeout(tid);
tid = setTimeout(refreshRem,300);
}
},false);
//设置页面的身体的大小,目前发现有何用
如果(DOC。readyState的 === '完整'){
doc。身体。风格。fontSize = 12 * dpr + ' px ' ;
} else {
doc。addEventListener(' DOMContentLoaded ',function(e){
doc。身体。风格。fontSize = 12 * dpr + ' px ' ;
},false);
}
//页面初始化
refreshRem();
//提供一些方法
灵活。dpr = win。dpr = dpr
灵活。refreshRem = refreshRem;
灵活。rem2px = function(d){
var val = parseFloat(d)* this。REM ;
如果(typeof运算 ð === '字串' && ð。匹配(/ REM $ /)){
val + = ' px ' ;
}
返回 VAL;
}
灵活。px2rem = function(d){
var val = parseFloat(d)/ this。REM ;
如果(typeof运算 ð === '字串' && ð。匹配(/ PX $ /)){
val + = ' rem ' ;
}
返回 VAL;
}
})(window,window [ ' lib ' ] ||(window [ ' lib ' ] = {}));
淘宝移动端适配
最新推荐文章于 2023-06-19 13:03:01 发布