vue实现PC端分辨率适配操作


Posted in Javascript onAugust 03, 2020

依赖

项目基础配置使用 vue-cli 生成

自适应方案核心: 阿里可伸缩布局方案 lib-flexible

px转rem:px2rem,它有webpack的loader px2rem

开始

先使用vue脚手架初始化一个webpack项目

vue init webpack 项目名

项目初始化好了之后,进入项目目录中 (cd 项目名) 安装 lib-flexible 和 px2rem-loader

npm i lib-flexible -S

npm i px2rem-loader -D

安装好了之后还需要在项目的入口文件 main.js 里引入 lib-flexible

// main.js

import 'lib-flexible'

vue实现PC端分辨率适配操作

接下来为了验证 lib-flexible 是否生效,可以将app.vue中的内容改成:

<template>
 <div class="wrapper">
 <div class="box1"></div>
 <div class="box2"></div>
 <div class="box3"></div>
 <div class="box4"></div>
 <div class="box5"></div>
 </div>
</template>

<style>
 * {
 margin: 0;
 padding: 0;
 }
</style>

<style scoped>
 .wrapper div {
 height: 1rem;
 }
 .box1 {
 width: 2rem;
 background-color: coral;
 }
 .box2 {
 width: 4rem;
 background-color: skyblue;
 }
 .box3 {
 width: 6rem;
 background-color: palegreen;
 }
 .box4 {
 width: 8rem;
 background-color: wheat;
 }
 .box5 {
 width: 10rem;
 background-color: darkred;
 }
</style>

vue实现PC端分辨率适配操作

但是在实际开发中,我们通过设计稿得到的单位是px,所以要将px转换成rem再进行样式中。但如果都需要手动转的话,就很麻烦,所以需要一个工具替我们完成这项工作,这个时候就需要配置px2rem了,当然,编辑器可能也要对应的插件。

在 vue-cli 生成的 webpack 配置中,vue-loader 的 options 和其他样式文件 loader 最终是都是由 build/utils.js 里的一个方法生成的。我们只需在 cssLoader 后再加上一个 px2remLoader 即可,px2rem-loader 的 remUnit 选项意思是 1rem=多少像素,结合 lib-flexible 的方案,我们将 px2remLoader 的 options.remUnit 设置成设计稿宽度的 1/10,这里我们假设设计稿宽为 1920px。

//utils.js
const cssLoader = {
 loader: 'css-loader',
 options: {
  sourceMap: options.sourceMap
 }
 }

 const px2remLoader = {
 loader: 'px2rem-loader',
 options: {
  remUnit: 192
 }
 }
 //...

放进loaders数组中

//utils.js
function generateLoaders (loader, loaderOptions) {
 const loaders = options.usePostCSS ? [cssLoader, postcssLoader, px2remLoader] : [cssLoader, px2remLoader]

 if (loader) {
  loaders.push({
  loader: loader + '-loader',
  options: Object.assign({}, loaderOptions, {
   sourceMap: options.sourceMap
  })
  })
 }
//...

修改配置以后重启服务器,将原来app.vue文件中的样式改成:

<style scoped>
.wrapper div {
 height: 1rem;
}
.box1 {
 /* 750 * 20% */
 width: 150px;
 background-color: coral;
}
.box2 {
 /* 750 * 40% */
 width: 300px;
 background-color: skyblue;
}
.box3 {
 /* 750 * 60% */
 width: 450px;
 background-color: palegreen;
}
.box4 {
 /* 750 * 80% */
 width: 600px;
 background-color: wheat;
}
.box5 {
 /* 750 * 100% */
 width: 750px;
 background-color: darkred;
}
</style>

可以看到,适配依然生效。

以上是vue-cli2配置px2rem的方式,

如果脚手架用的是vue-cli3的话,由于vue-cli3 生成的目录结构没有build文件,所以在配置上也有一些不同。

vue-cli3配置方式:

找到文件 node_modules/@vue/cli-service/lib/config/css.js,添加规则:

config.module
  .rule('css')
  .test(/\.css$/)
  .oneOf('vue')
  .resourceQuery(/\?vue/)
  .use('px2rem')
  .loader('px2rem-loader')
  .options({
   remUnit: 75
  })

vue实现PC端分辨率适配操作

remUnit的值请自行修改。

但是有一个问题,我明明设置的宽度是按1920来的,为什么计算出来1rem=54px?

vue实现PC端分辨率适配操作

是不是插件哪里出了问题,或者在哪里定义过跟54或者540相关的东西?

(我这里全局搜索了54找到flexible.js文件)

找到flexible.js文件看下:

vue实现PC端分辨率适配操作

找到问题了就解决问题,既然文件把屏幕宽度写死了,那就不写死:

function refreshRem(){
  var width = docEl.getBoundingClientRect().width;
  if (width / dpr > 540) {
   width = width * dpr;
  }
  var rem = width / 10;
  docEl.style.fontSize = rem + 'px';
  flexible.rem = win.rem = rem;
 }

现在再重启项目,看一下运行结果:

vue实现PC端分辨率适配操作

end

有问题欢迎指正!

以上这篇vue实现PC端分辨率适配操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
js 深拷贝函数
Dec 04 Javascript
基于JavaScript实现继承机制之调用call()与apply()的方法详解
May 07 Javascript
asp.net刷新本页面的六种方法总结
Jan 07 Javascript
JavaScript中的值类型转换介绍
Dec 31 Javascript
javascript中的正则表达式使用指南
Mar 01 Javascript
移动端jQuery修正Web页面滑动时div问题的两则实例
May 30 Javascript
JavaScript实现九九乘法表的简单实例
Jun 07 Javascript
bootstrap table实现x-editable的行单元格编辑及解决数据Empty和支持多样式问题
Aug 10 Javascript
一步步教你利用Docker设置Node.js
Nov 20 Javascript
vue3实现v-model原理详解
Oct 09 Javascript
在Vue中实现随hash改变响应菜单高亮
Mar 09 Javascript
Vue Element校验validate的实例
Sep 21 Javascript
浅谈JavaScript中的“!!”作用
Aug 03 #Javascript
基于脚手架创建Vue项目实现步骤详解
Aug 03 #Javascript
解决Vue的项目使用Element ui 走马灯无法实现的问题
Aug 03 #Javascript
vue-quill-editor 自定义工具栏和自定义图片上传路径操作
Aug 03 #Javascript
浅谈vue中使用编辑器vue-quill-editor踩过的坑
Aug 03 #Javascript
Vue 实现对quill-editor组件中的工具栏添加title
Aug 03 #Javascript
简单了解three.js 着色器材质
Aug 03 #Javascript
You might like
骨王战斗力在公会成员中排不进前五,却当选了会长,原因竟是这样
2020/03/02 日漫
PHP 飞信好友免费短信API接口开源版
2010/07/22 PHP
PHP中foreach循环中使用引用要注意的地方
2011/01/02 PHP
深入PHP运行环境配置的详解
2013/06/04 PHP
php生成年月日下载列表的方法
2015/04/24 PHP
使用Codeigniter重写insert的方法(推荐)
2017/03/23 PHP
[原创]php正则删除img标签的方法示例
2017/05/27 PHP
用htc组件制作windows选项卡
2007/01/13 Javascript
如何将一个String和多个String值进行比较思路分析
2013/04/22 Javascript
JS随机漂浮广告代码具体实例
2013/11/19 Javascript
JavaScript 基本概念
2015/01/20 Javascript
js实现选中页面文字将其分享到新浪微博
2015/11/05 Javascript
基于JQuery及AJAX实现名人名言随机生成器
2017/02/10 Javascript
PHP实现记录代码运行时间封装类实例教程
2017/05/08 Javascript
浅谈vue父子组件怎么传值
2018/07/21 Javascript
如何在JavaScript中优雅的提取循环内数据详解
2019/03/04 Javascript
详解json串反转义(消除反斜杠)
2019/08/12 Javascript
Vue + element 实现多选框组并保存已选id集合的示例代码
2020/06/03 Javascript
js实现翻牌小游戏
2020/07/31 Javascript
[50:02]完美世界DOTA2联赛循环赛 Magma vs IO BO2第一场 11.01
2020/11/02 DOTA
python爬虫 正则表达式使用技巧及爬取个人博客的实例讲解
2017/10/20 Python
用matplotlib画等高线图详解
2017/12/14 Python
python中闭包Closure函数作为返回值的方法示例
2017/12/17 Python
解决python3 json数据包含中文的读写问题
2018/05/10 Python
在Python中增加和插入元素的示例
2018/11/01 Python
Pytorch抽取网络层的Feature Map(Vgg)实例
2019/08/20 Python
StubHub巴西:购买和出售您的门票
2016/07/22 全球购物
互动出版网:专业书籍
2017/03/21 全球购物
函授本科自我鉴定
2013/11/03 职场文书
幼儿园中秋节活动反思
2014/02/16 职场文书
中学优秀班主任事迹材料
2014/05/01 职场文书
个人委托书如何写
2014/09/25 职场文书
中班下学期个人工作总结
2015/02/12 职场文书
监理中标通知书
2015/04/16 职场文书
2015年小学校长工作总结
2015/05/19 职场文书
MySQL Server层四个日志的实现
2022/03/31 MySQL