js动态计算移动端rem值(remScale.js/flexible.js)--小技巧(推荐增强版-flexible.js)
发布日期:2021-06-30 11:49:08 浏览次数:3 分类:技术文章

本文共 6518 字,大约阅读时间需要 21 分钟。

 remScale.js文件

// JavaScript Document; (function (doc, win) {        var docEl = doc.documentElement,            resizeEvt = 'orientationchange' in window ? 'orientationchange' : 'resize',            recalc = function () {                var clientWidth = docEl.clientWidth;                if (!clientWidth) return;                if(clientWidth>=720){                    docEl.style.fontSize = '100px';                }else{                    docEl.style.fontSize = 100 * (clientWidth / 720) + 'px';                }            };        if (!doc.addEventListener) return;        win.addEventListener(resizeEvt, recalc, false); //绑定事件        doc.addEventListener('DOMContentLoaded', recalc, false);		})(document, window);//==========================================================================; (function (doc, win) {    var docEl = doc.documentElement, // 获取html        resizeEvt = 'orientationchange' in window ? 'orientationchange' : 'resize',        width = 1125, // 设计稿宽,用时只需要修改这一处        recalc = function () {            var clientWidth = docEl.clientWidth; // 获取设备尺寸            if (!clientWidth) return; // 如果没有值,回去            if (clientWidth > width) { // 如果超过设计稿宽度,就给一个固定值                docEl.style.fontSize = '100px';                docEl.style.width = width + 'px';                docEl.style.margin = '0 auto';            } else {                docEl.style.fontSize = 100 * (clientWidth / width) + 'px';            }        };    if (!doc.addEventListener) return; // 如果没有这个方法,回去    win.addEventListener(resizeEvt, recalc, false); // 改变大小时调整一下    doc.addEventListener('DOMContentLoaded', recalc, false); // 加载完成时调整})(document, window);// 使用时:1rem = 设计稿的宽度 / 100

flexible.js文件

(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);

增强版-flexible.js

(function(win, lib) {  var doc = win.document;  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.flexible || (lib.flexible = {});  if (metaEl) {    console.warn("将根据已有的meta标签来设置缩放比例");    var match = metaEl      .getAttribute("content")      // eslint-disable-next-line no-useless-escape      .match(/initial\-scale=([\d\.]+)/);    if (match) {      scale = parseFloat(match[1]);      dpr = parseInt(1 / scale);    }  } else if (flexibleEl) {    var content = flexibleEl.getAttribute("content");    if (content) {      // eslint-disable-next-line no-useless-escape      var initialDpr = content.match(/initial\-dpr=([\d\.]+)/);      // eslint-disable-next-line no-useless-escape      var maximumDpr = content.match(/maximum\-dpr=([\d\.]+)/);      if (initialDpr) {        dpr = parseFloat(initialDpr[1]);        scale = parseFloat((1 / dpr).toFixed(2));      }      if (maximumDpr) {        dpr = parseFloat(maximumDpr[1]);        scale = parseFloat((1 / dpr).toFixed(2));      }    }  }  if (!dpr && !scale) {    // eslint-disable-next-line no-unused-vars    var isAndroid = win.navigator.appVersion.match(/android/gi);    var isIPhone = win.navigator.appVersion.match(/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倍的方案      dpr = 1;    }    scale = 1 / dpr;  }  docEl.setAttribute("data-dpr", dpr);  if (!metaEl) {    metaEl = doc.createElement("meta");    metaEl.setAttribute("name", "viewport");    metaEl.setAttribute(      "content",      "initial-scale=" +        scale +        ", maximum-scale=" +        scale +        ", minimum-scale=" +        scale +        ", user-scalable=no"    );    if (docEl.firstElementChild) {      docEl.firstElementChild.appendChild(metaEl);    } else {      var wrap = doc.createElement("div");      wrap.appendChild(metaEl);      doc.write(wrap.innerHTML);    }  }  function refreshRem() {    var width = docEl.getBoundingClientRect().width;    // 最小1366px,最大适配2560px    if (width / dpr < 1366) {      width = 1366 * dpr;    } else if (width / dpr > 2560) {      width = 2560 * dpr;    }    // 设置成24等份,设计稿时1920px的,这样1rem就是80px    var rem = width / 24;    docEl.style.fontSize = rem + "px";    flexible.rem = win.rem = rem;  }  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 = 12 * dpr + "px";  } else {    doc.addEventListener(      "DOMContentLoaded",      // eslint-disable-next-line no-unused-vars      function(e) {        doc.body.style.fontSize = 12 * dpr + "px";      },      false    );  }  refreshRem();  flexible.dpr = win.dpr = dpr;  flexible.refreshRem = refreshRem;  flexible.rem2px = function(d) {    var val = parseFloat(d) * this.rem;    if (typeof d === "string" && d.match(/rem$/)) {      val += "px";    }    return val;  };  flexible.px2rem = function(d) {    var val = parseFloat(d) / this.rem;    if (typeof d === "string" && d.match(/px$/)) {      val += "rem";    }    return val;  };})(window, window["lib"] || (window["lib"] = {}));

 

转载地址:https://jackiehao.blog.csdn.net/article/details/104672789 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:前端常用属性知识点--文档
下一篇:normalize.css--样式重置文件

发表评论

最新留言

表示我来过!
[***.240.166.169]2024年04月17日 08时56分06秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

学习笔记(10):一学即懂的计算机视觉(第一季)-图像平滑滤波与去噪 2019-04-30
学习笔记(11):一学即懂的计算机视觉(第一季)-数学形态学滤波 2019-04-30
学习笔记(12):一学即懂的计算机视觉(第一季)-实战演练:图像平滑滤波对比... 2019-04-30
学习笔记(14):一学即懂的计算机视觉(第一季)-Canny算子 2019-04-30
学习笔记(15):一学即懂的计算机视觉(第一季)-程序示例 2019-04-30
学习笔记(16):一学即懂的计算机视觉(第一季)-数学形态学扩展应用 2019-04-30
学习笔记(20):一学即懂的计算机视觉(第一季)-图像变换有什么用? 2019-04-30
学习笔记(21):一学即懂的计算机视觉(第一季)-灰度直方图 2019-04-30
学习笔记(22):一学即懂的计算机视觉(第一季)-霍夫变换 2019-04-30
学习笔记(23):一学即懂的计算机视觉(第一季)-图像变换实战演练 2019-04-30
学习笔记(26):一学即懂的计算机视觉(第一季)-为什么要图像分割? 2019-04-30
学习笔记(27):一学即懂的计算机视觉(第一季)-基于灰度直方图的阈值分割 2019-04-30
学习笔记(28):一学即懂的计算机视觉(第一季)-灰度阈值分割实战演练 2019-04-30
学习笔记(31):一学即懂的计算机视觉(第一季)-区域生长算法 2019-04-30
学习笔记(32):一学即懂的计算机视觉(第一季)-分水岭算法 2019-04-30
学习笔记(33):一学即懂的计算机视觉(第一季)-图像分割实战演练(II) 2019-04-30
学习笔记(34):一学即懂的计算机视觉(第一季)-图像表示与描述 2019-04-30
学习笔记(35):一学即懂的计算机视觉(第一季)-图像表示与描述II 2019-04-30
学习笔记(36):一学即懂的计算机视觉(第一季)-图像表示描述实战演练 2019-04-30
学习笔记(37):一学即懂的计算机视觉(第一季)-总结 2019-04-30