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 使用手册(一)
Sep 23 Javascript
IE与firefox下Dhtml的一些区别小结
Dec 02 Javascript
jquery插件制作 提示框插件实现代码
Aug 17 Javascript
Web表单提交之disabled问题js解决方法
Jan 13 Javascript
省市区三级联动下拉框菜单javascript版
Aug 11 Javascript
javascript实现滑动解锁功能
Mar 22 Javascript
微信小程序实现滑动删除效果
May 19 Javascript
jQuery EasyUI 折叠面板accordion的使用实例(分享)
Dec 25 jQuery
AngularJS实现的2048小游戏功能【附源码下载】
Jan 03 Javascript
Ant Design Pro 下实现文件下载的实现代码
Dec 03 Javascript
JavaScript实现打砖块游戏
Feb 25 Javascript
只有 20 行的 JavaScript 模板引擎实例详解
May 11 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 arsort 数组降序排序详细介绍
2016/11/17 PHP
php微信公众号开发(4)php实现自定义关键字回复
2016/12/15 PHP
Jquery 的扩展方法总结
2011/10/01 Javascript
js触发onchange事件的方法说明
2014/03/08 Javascript
jquery获取radio值实例
2014/10/16 Javascript
JavaScript中this详解
2015/09/01 Javascript
基于jquery实现复选框全选,反选,全不选等功能
2015/10/16 Javascript
jQuery添加删除DOM元素方法详解
2016/01/18 Javascript
关于javascript中限定时间内防止按钮重复点击的思路详解
2016/08/16 Javascript
HTML Table 空白单元格补全的简单实现
2016/10/13 Javascript
深入理解jquery的$.extend()、$.fn和$.fn.extend()
2017/07/08 jQuery
JS操作时间 - UNIX时间戳的简单介绍(必看篇)
2017/08/16 Javascript
angular4实现tab栏切换的方法示例
2017/10/21 Javascript
利用Vue2.x开发实现JSON树的方法
2018/01/04 Javascript
vue移动UI框架滑动加载数据的方法
2018/03/12 Javascript
JS实现字符串翻转的方法分析
2018/08/31 Javascript
require.js 加载过程与使用方法介绍
2018/10/30 Javascript
VeeValidate 的使用场景以及配置详解
2019/01/11 Javascript
JS中的函数与对象的创建方式
2019/05/12 Javascript
IDEA安装vue插件图文详解
2019/09/26 Javascript
JS Web Flex弹性盒子模型代码实例
2020/03/10 Javascript
[01:01:52]DOTA2-DPC中国联赛定级赛 SAG vs iG BO3第二场 1月9日
2021/03/11 DOTA
Python验证码识别处理实例
2015/12/28 Python
python自动发邮件库yagmail的示例代码
2018/02/23 Python
pycharm访问mysql数据库的方法步骤
2019/06/18 Python
利用python计算windows全盘文件md5值的脚本
2019/07/27 Python
python实现视频读取和转化图片
2019/12/10 Python
Django模板标签中url使用详解(url跳转到指定页面)
2020/03/19 Python
浅谈Python __init__.py的作用
2020/10/28 Python
木工主管岗位职责
2013/12/08 职场文书
教师旷工检讨书
2014/01/18 职场文书
《学会待客》教学反思
2014/02/22 职场文书
教师一岗双责责任书
2014/04/16 职场文书
机关保密承诺书
2014/06/03 职场文书
教师拔河比赛广播稿
2014/10/14 职场文书
导师鉴定意见
2015/06/05 职场文书