JS动态计算移动端rem的解决方案


Posted in Javascript onOctober 14, 2016

在做移动端web app的时候,众所周知,移动设备分辨率五花八门,虽然我们可以通过CSS3的media query来实现适配,例如下面这样:

html {
font-size : 20px;
}
@media only screen and (min-width: 401px){
html {
font-size: 25px !important;
}
}
@media only screen and (min-width: 428px){
html {
font-size: 26.75px !important;
}
}
@media only screen and (min-width: 481px){
html {
font-size: 30px !important; 
}
}
@media only screen and (min-width: 569px){
html {
font-size: 35px !important; 
}
}
@media only screen and (min-width: 641px){
html {
font-size: 40px !important; 
}
}

但是这种做法并不能适配所有设备,于是就有了实现全适配的JS解决方案,例如下面这样:

;(function (doc, win, undefined) {
var docEl = doc.documentElement,
resizeEvt = 'orientationchange' in win? 'orientationchange' : 'resize',
recalc = function () {
var clientWidth = docEl.clientWidth;
if (clientWidth === undefined) return;
docEl.style.fontSize = 20 * (clientWidth / 320) + 'px';
};
if (doc.addEventListener === undefined) return;
win.addEventListener(resizeEvt, recalc, false);
doc.addEventListener('DOMContentLoaded', recalc, false)
})(document, window);

另外附上淘宝移动端适配解决方案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) {
//将根据已有的meta标签来设置缩放比例
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]);
scale = parseFloat((1 / dpr).toFixed(2)); 
}
if (maximumDpr) {
dpr = parseFloat(maximumDpr[1]);
scale = parseFloat((1 / dpr).toFixed(2)); 
}
}
}
if (!dpr && !scale) {
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;
if (width / dpr > 540) {
width = 540 * dpr;
}
var rem = width / 10;
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', 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'] = {}));

以上所述是小编给大家介绍的JS动态计算移动端rem的解决方案,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
JS 数字转换研究总结
Dec 26 Javascript
JQuery boxy插件在IE中边角图片不显示问题的解决
May 20 Javascript
JavaScript精炼之构造函数 Constructor及Constructor属性详解
Nov 05 Javascript
JS中的二叉树遍历详解
Mar 18 Javascript
JS中递归函数
Jun 17 Javascript
AngularJS 指令的交互详解及实例代码
Sep 14 Javascript
JavaScript中清空数组的三种方式
Mar 22 Javascript
Vue.js鼠标悬浮更换图片功能
May 17 Javascript
利用pm2部署多个node.js项目的配置教程
Oct 22 Javascript
KOA+egg.js集成kafka消息队列的示例
Nov 09 Javascript
修改vue源码实现动态路由缓存的方法
Jan 21 Javascript
基于ajax实现上传图片代码示例解析
Dec 03 Javascript
javascript对浅拷贝和深拷贝的详解
Oct 14 #Javascript
jQuery web 组件 后台日历价格、库存设置的代码
Oct 14 #Javascript
第一次接触神奇的Bootstrap
Oct 14 #Javascript
js仿手机页面文件下拉刷新效果
Oct 14 #Javascript
前端js实现文件的断点续传 后端PHP文件接收
Oct 14 #Javascript
js关于getImageData跨域问题的解决方法
Oct 14 #Javascript
AngularJS 与Bootstrap实现表格分页实例代码
Oct 14 #Javascript
You might like
php数组函数array_key_exists()小结
2015/12/10 PHP
thinkPHP js文件中U方法不被解析问题的解决方法
2016/12/05 PHP
Yii2-GridView 中让关联字段带搜索和排序功能示例
2017/01/21 PHP
微信公众平台开发教程④ ThinkPHP框架下微信支付功能图文详解
2019/04/10 PHP
php创建多级目录与级联删除文件的方法示例
2019/09/12 PHP
yii 框架实现按天,月,年,自定义时间段统计数据的方法分析
2020/04/04 PHP
JavaScript窗口功能指南之在窗口中书写内容
2006/07/21 Javascript
js中cookie的使用详细分析
2008/05/28 Javascript
鼠标选择动态改变网页背景颜色的JS代码
2013/12/10 Javascript
nodejs文件操作模块FS(File System)常用函数简明总结
2014/06/05 NodeJs
javascript在IE下trim函数无法使用的解决方法
2014/09/12 Javascript
jQuery插件开发精品教程让你的jQuery提升一个台阶
2016/01/27 Javascript
JavaScript实现二叉树的先序、中序及后序遍历方法详解
2017/10/26 Javascript
JQuery实现table中tr上移下移的示例(超简单)
2018/01/08 jQuery
jquery 输入框查找关键字并提亮颜色的实例代码
2018/01/23 jQuery
JS实现字符串中去除指定子字符串方法分析
2018/05/17 Javascript
《javascript少儿编程》location术语总结
2018/05/27 Javascript
使用layui的layer组件做弹出层的例子
2019/09/27 Javascript
关于layui的下拉搜索框异步加载数据的解决方法
2019/09/28 Javascript
JavaScript命令模式原理与用法实例详解
2020/03/10 Javascript
原生js+canvas实现验证码
2020/11/29 Javascript
Python原始字符串与Unicode字符串操作符用法实例分析
2017/07/22 Python
详解Python匿名函数(lambda函数)
2019/04/19 Python
Python检查 云备份进程是否正常运行代码实例
2019/08/22 Python
Python中关于浮点数的冷知识
2019/09/22 Python
numpy中生成随机数的几种常用函数(小结)
2020/08/18 Python
Python实现简单的猜单词小游戏
2020/10/28 Python
详解Python3.8+PyQt5+pyqt5-tools+Pycharm配置详细教程
2020/11/02 Python
Sofft鞋官网:世界知名鞋类品牌
2017/03/28 全球购物
意大利在线高尔夫商店:Online Golf
2021/03/09 全球购物
Linux Interview Questions For software testers
2013/05/17 面试题
营业员实习自我鉴定
2013/12/07 职场文书
党支部综合考察材料
2014/05/19 职场文书
2014年销售员工作总结
2014/12/01 职场文书
高中教师个人工作总结
2015/02/10 职场文书
广告业务员岗位职责
2015/02/13 职场文书