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 相关文章推荐
分析 JavaScript 中令人困惑的变量赋值
Aug 13 Javascript
javascript 判断中文字符长度的函数代码
Aug 27 Javascript
本地图片预览(支持IE6/IE7/IE8/Firefox3)经验总结
Mar 25 Javascript
变量声明时命名与变量作为对象属性时命名的区别解析
Dec 06 Javascript
js模拟C#中List的简单实例
Mar 06 Javascript
Vue.js学习笔记之修饰符详解
Jul 25 Javascript
javascript 取小数点后几位几种方法总结
Aug 02 Javascript
vue 封装自定义组件之tabal列表编辑单元格组件实例代码
Sep 07 Javascript
微信小程序js文件改变参数并在视图上及时更新【推荐】
Jun 11 Javascript
JavaScript设计模式之装饰者模式定义与应用示例
Jul 25 Javascript
解决Layui中templet中a的onclick参数传递的问题
Sep 20 Javascript
vue 动态表单开发方法案例详解
Dec 02 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 不使用js实现页面跳转
2014/02/11 PHP
Laravel 读取 config 下的数据方法
2019/10/13 PHP
mouse_on_title.js
2006/08/25 Javascript
Google Map API更新实现用户自定义标注坐标
2009/07/29 Javascript
jquery中输入验证中一个不错的效果
2010/08/21 Javascript
nodejs实用示例 缩址还原
2010/12/28 NodeJs
jQuery的DOM操作之删除节点示例
2014/01/03 Javascript
JS基于MSClass和setInterval实现ajax定时采集信息并滚动显示的方法
2016/04/18 Javascript
模仿password输入框的实现代码
2016/06/07 Javascript
Vue.js快速入门教程
2016/09/07 Javascript
Node.js的文件权限及读写flag详解
2016/10/11 Javascript
深入理解AngularJS中的ng-bind-html指令
2017/03/27 Javascript
全面解析Node.js 8 重要功能和修复
2017/06/02 Javascript
node puppeteer(headless chrome)实现网站登录
2018/05/09 Javascript
基于vue v-for 多层循环嵌套获取行数的方法
2018/09/26 Javascript
echarts多条折线图动态分层的实现方法
2019/05/24 Javascript
TypeScript类型声明书写详解
2019/08/28 Javascript
layui导出所有数据的例子
2019/09/10 Javascript
解决vue的过渡动画无法正常实现问题
2019/10/31 Javascript
js实现带有动画的返回顶部
2020/08/09 Javascript
解决vue单页面应用打包后相对路径、绝对路径相关问题
2020/08/14 Javascript
Python中lambda的用法及其与def的区别解析
2014/07/28 Python
用map函数来完成Python并行任务的简单示例
2015/04/02 Python
用Python的Django框架完成视频处理任务的教程
2015/04/02 Python
Django自定义分页与bootstrap分页结合
2021/02/22 Python
Django 多语言教程的实现(i18n)
2018/07/07 Python
pyqt5 键盘监听按下enter 就登陆的实例
2019/06/25 Python
详解如何减少python内存的消耗
2019/08/09 Python
用python解压分析jar包实例
2020/01/16 Python
Python图像阈值化处理及算法比对实例解析
2020/06/19 Python
加拿大城市本地限时优惠:Buytopia.ca
2018/09/19 全球购物
临床医师专业个人自我评价范文
2013/11/07 职场文书
作文评语集锦大全
2014/04/23 职场文书
热门专业求职信
2014/05/24 职场文书
《老人与海鸥》教学反思
2016/02/16 职场文书
简单实现一个手持弹幕功能+文字抖动特效
2021/03/31 HTML / CSS