详解vue2.0 不同屏幕适配及px与rem转换问题


Posted in Javascript onFebruary 23, 2018

因为项目需要,vue开发项目,必须将已写的以px为单位的部分,转换为rem。要是全部转换,这大量的计算量,哪怕是sublime Text 的cssrem插件,也是一个庞大的工作量。所以,直接使用插件没商量。

第一步:因为rem是根据更元素来计算大小,所以,捕捉到当前屏幕的大小并赋值给html,这是其一

第二步:使用px2rem插件,来捕捉当前项目的所有px,直接计算相对应数值。

这样,以后写界面,就可以直接用px来构建界面,不用自己去计算啦!

1、安装插件(我是安装了淘宝镜像,所以是cnpm,若是没装淘宝镜像,就npm)

$ cnpm i postcss-px2rem --save
$ cnpm install px2rem-loader --save

2、配置px2rem

build目录下vue-loader.conf.js中,做如下修改:

module.exports = {
loaders: utils.cssLoaders({
sourceMap: isProduction
? config.build.productionSourceMap
: config.dev.cssSourceMap,
extract: isProduction
}),
transformToRequire: {
video: 'src',
source: 'src',
img: 'src',
image: 'xlink:href'
},
postcss:[require('postcss-px2rem')({'remUnit':37.5,'baseDpr':2})]

 /*因为我是以750px(iphone6)宽度为基准,所以remUnit为37.5*/
}

3、在static目录中,建js文件夹,放flex.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) {
//console.warn('将根据已有的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'] = {}));

4、在index.html中,加入flex.js

<script type="text/javascript" src="static/js/flex.js"></script>

5、重启项目

大功告成!!

现在你就可以在浏览器中,看到你的px换算成了rem啦!

详解vue2.0 不同屏幕适配及px与rem转换问题

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Javascript模板技术
Apr 27 Javascript
jquery 简单导航实现代码
Sep 11 Javascript
用jQuery toggleClass 实现鼠标移上变色
May 14 Javascript
JavaScript 学习笔记之数据类型
Jan 14 Javascript
Jquery实现鼠标移动放大图片功能实例
Mar 25 Javascript
基于jQuery滑动杆实现购买日期选择效果
Sep 15 Javascript
jQuery自动完成插件completer附源码下载
Jan 04 Javascript
Angular.js 实现数字转换汉字实例代码
Jul 14 Javascript
Vue cli+mui 区域滚动的实例代码
Jan 25 Javascript
Vue2.0实现简单分页及跳转效果
Jul 29 Javascript
详解JS预解析原理
Jun 16 Javascript
微信小程序学习之自定义滚动弹窗
Dec 20 Javascript
解决vue中对象属性改变视图不更新的问题
Feb 23 #Javascript
在Vue组件上动态添加和删除属性方法
Feb 23 #Javascript
vue 路由页面之间实现用手指进行滑动的方法
Feb 23 #Javascript
vue编译打包本地查看index文件的方法
Feb 23 #Javascript
vue 使用Jade模板写html,stylus写css的方法
Feb 23 #Javascript
Angular 向组件传递模板的两种方法
Feb 23 #Javascript
详解Node.js中的Async和Await函数
Feb 22 #Javascript
You might like
德生1994机评
2021/03/02 无线电
PHP调用三种数据库的方法(3)
2006/10/09 PHP
PHP XML操作类DOMDocument
2009/12/16 PHP
一个PHP针对数字的加密解密类
2014/03/20 PHP
PHP基于接口技术实现简单的多态应用完整实例
2017/04/26 PHP
php 与 nginx 的处理方式及nginx与php-fpm通信的两种方式
2018/09/28 PHP
Jquery 选中表格一列并对表格排序实现原理
2012/12/15 Javascript
JS脚本defer的作用示例介绍
2014/01/02 Javascript
JavaScript中对象介绍
2014/12/31 Javascript
封装好的javascript前端分页插件pagination
2016/01/04 Javascript
JS实现焦点图轮播效果的方法详解
2016/12/19 Javascript
JavaScript使用链式方法封装jQuery中CSS()方法示例
2017/04/07 jQuery
微信小程序与php 实现微信支付的简单实例
2017/06/23 Javascript
常见的浏览器Hack技巧整理
2017/06/29 Javascript
vue-music关于Player播放器组件详解
2017/11/28 Javascript
微信小程序的部署方法步骤
2018/09/04 Javascript
javascript实现贪吃蛇经典游戏
2020/04/10 Javascript
小程序瀑布流组件实现翻页与图片懒加载
2020/05/19 Javascript
在Vue中创建可重用的 Transition的方法
2020/06/02 Javascript
JavaScript原生数组函数实例汇总
2020/10/14 Javascript
[00:36]DOTA2风云人物相约完美“圣”典 12月17日不见不散
2016/11/30 DOTA
Python实现的选择排序算法示例
2017/11/29 Python
python PIL和CV对 图片的读取,显示,裁剪,保存实现方法
2019/08/07 Python
Python 调用 Windows API COM 新法
2019/08/22 Python
pytorch程序异常后删除占用的显存操作
2020/01/13 Python
python库skimage给灰度图像染色的方法示例
2020/04/27 Python
基于Python的接口自动化unittest测试框架和ddt数据驱动详解
2021/01/27 Python
Bitiba意大利:在线宠物商店
2020/10/31 全球购物
校长岗位职责
2013/11/26 职场文书
资产经营总监岗位职责范文
2013/12/01 职场文书
学前班评语大全
2014/05/04 职场文书
工作说明书范文
2014/05/07 职场文书
篮球友谊赛通讯稿
2014/10/10 职场文书
思品教学工作总结
2015/08/10 职场文书
安全生产培训心得体会
2016/01/18 职场文书
JavaScript原始值与包装对象的详细介绍
2021/05/11 Javascript