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 相关文章推荐
JQUERY 浏览器判断实现函数
Aug 20 Javascript
picChange 图片切换特效的函数代码
May 06 Javascript
使用正则表达式的格式化与高亮显示json字符串
Dec 03 Javascript
招聘网站基于jQuery实现自动刷新简历
May 10 Javascript
jquery小火箭返回顶部代码分享
Aug 19 Javascript
每个程序员都需要学习 JavaScript 的7个理由小结
Sep 03 Javascript
微信小程序 开发MAP(地图)实例详解
Jun 27 Javascript
react-router4 嵌套路由的使用方法
Jul 24 Javascript
Angular4 中内置指令的基本用法
Jul 31 Javascript
使用 Javascript 实现浏览器推送提醒功能的示例
Nov 03 Javascript
解决vue2中使用axios http请求出现的问题
Mar 05 Javascript
JS实现倒计时图文效果
Nov 17 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创建动态图像
2006/10/09 PHP
php 利用array_slice函数获取随机数组或前几条数据
2015/09/30 PHP
php 使用fopen函数创建、打开文件详解及实例代码
2016/09/24 PHP
PHP session会话操作技巧小结
2016/09/27 PHP
用js怎么把&字符换成"&amp:"
2006/10/19 Javascript
COM中获取JavaScript数组大小的代码
2009/11/22 Javascript
JS获取文本框,下拉框,单选框的值的简单实例
2014/02/26 Javascript
在页面加载完成后通过jquery给多个span赋值
2014/05/21 Javascript
json中换行符的处理方法示例介绍
2014/06/10 Javascript
JavaScript的作用域和块级作用域概念理解
2014/09/21 Javascript
js文件包含的几种方式介绍
2014/09/28 Javascript
javascript使用正则表达式检测IP地址
2014/12/03 Javascript
浅谈js基本数据类型和typeof
2016/08/09 Javascript
Bootstrap table两种分页示例
2016/12/23 Javascript
jQuery实现的checkbox级联选择下拉菜单效果示例
2016/12/26 Javascript
JavaScript面向对象精要(上部)
2017/09/12 Javascript
jQuery md5加密插件jQuery.md5.js用法示例
2018/08/24 jQuery
JS判断数组是否包含某元素实现方法汇总
2020/06/24 Javascript
Node.js 中如何收集和解析命令行参数
2021/01/08 Javascript
python 提取文件的小程序
2009/07/29 Python
python笔记(1) 关于我们应不应该继续学习python
2012/10/24 Python
python fabric实现远程操作和部署示例
2014/03/25 Python
python实现的udp协议Server和Client代码实例
2014/06/04 Python
django反向解析和正向解析的方式
2018/06/05 Python
对python 操作solr索引数据的实例详解
2018/12/07 Python
TFRecord格式存储数据与队列读取实例
2020/01/21 Python
python GUI库图形界面开发之PyQt5信号与槽基础使用方法与实例
2020/03/06 Python
tensorflow2.0教程之Keras快速入门
2021/02/20 Python
Farfetch巴西官网:奢侈品牌时尚购物平台
2020/10/19 全球购物
工作个人的自我评价
2014/01/14 职场文书
企业军训感言
2014/02/08 职场文书
领导干部廉政自律承诺书
2014/05/26 职场文书
2014年班主任工作总结
2014/11/08 职场文书
幼儿园2014年度工作总结
2014/11/10 职场文书
2014年班组建设工作总结
2014/12/01 职场文书
二维码条形码生成的JavaScript脚本库
2022/07/07 Javascript