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全局函数使用简单说明
Mar 11 Javascript
javascript 手动给表增加数据的小例子
Jul 10 Javascript
JavaScript中的函数重载深入理解
Aug 04 Javascript
JsRender for index循环索引用法详解
Oct 31 Javascript
浅谈Javascript中的Function与Object
Jan 26 Javascript
JS的数组迭代方法
Feb 05 Javascript
jQuery使用cookie与json简单实现购物车功能
Apr 15 Javascript
在微信、支付宝、百度钱包实现点击返回按钮关闭当前页面和窗口的方法
Aug 05 Javascript
解决npm安装Electron缓慢网络超时导致失败的问题
Feb 06 Javascript
详解 vue better-scroll滚动插件排坑
Feb 08 Javascript
微信小程序实现滴滴导航tab切换效果
Jul 24 Javascript
使用pm2部署node生产环境的方法步骤
Mar 09 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字符串截取中文截取2,单字节截取模式
2007/12/10 PHP
PHP学习笔记之一
2011/01/17 PHP
php curl 登录163邮箱并抓取邮箱好友列表的代码(经测试)
2011/04/07 PHP
让ThinkPHP支持大小写url地址访问的方法
2014/10/31 PHP
php生成图片验证码的实例讲解
2015/08/03 PHP
PHP会话处理的10个函数
2015/08/11 PHP
php fread读取文件注意事项
2016/09/24 PHP
PHP中字符串长度的截取用法示例
2017/01/12 PHP
JavaScript 字符串与数组转换函数[不用split与join]
2009/12/13 Javascript
jquery之empty()与remove()区别说明
2010/09/10 Javascript
js 实现图片预加载(js操作 Image对象属性complete ,事件onload 异步加载图片)
2011/03/25 Javascript
给Flash加一个超链接(推荐使用透明层)兼容主流浏览器
2013/06/09 Javascript
jquery+css3实现会动的小圆圈效果
2016/01/27 Javascript
javascript入门之数组[新手必看]
2016/11/21 Javascript
SelecT下拉框选中和取值的解决方法
2016/11/22 Javascript
ES6正则表达式的一些新功能总结
2017/05/09 Javascript
JavaScript防止全局变量污染的方法总结
2018/08/02 Javascript
Angular2实现的秒表及改良版示例
2019/05/10 Javascript
详解vue v-model
2020/08/31 Javascript
Vue中component标签解决项目组件化操作
2020/09/04 Javascript
python实现无证书加密解密实例
2014/10/27 Python
Python Requests 基础入门
2016/04/07 Python
深入理解Django的中间件middleware
2018/03/14 Python
Python获取系统所有进程PID及进程名称的方法示例
2018/05/24 Python
python常见字符串处理函数与用法汇总
2019/10/30 Python
Python with语句和过程抽取思想
2019/12/23 Python
python使用多线程+socket实现端口扫描
2020/05/28 Python
Kate Spade澳大利亚官方网站:美国设计师手袋品牌
2019/09/10 全球购物
小孩百日宴答谢词
2014/01/15 职场文书
银行贷款承诺书
2014/03/29 职场文书
学校节能宣传周活动总结
2014/07/09 职场文书
2014年度培训工作总结
2014/11/27 职场文书
会计工作总结范文2014
2014/12/23 职场文书
重温入党誓词主持词
2015/06/29 职场文书
汤姆叔叔的小屋读书笔记
2015/06/30 职场文书
php 文件上传至OSS及删除远程阿里云OSS文件
2021/07/04 PHP