vue cli3适配所有端方案的实现


Posted in Javascript onApril 13, 2020

应用场景

页面需要在pc端和移动端同时兼容,以前我的方案都是使用媒体查询来判断当前设备大小,然后写两套或者三套css代码来兼容他们,能达到目的,并且效果不错,但是感觉还是稍微麻烦了一丢丢。后面了解了一下flexable.js脚本,稍作修改,基本可以满足我的需求。

postcss-px2rem

yarn add postcss-px2rem

postcss-px2rem插件可以将px转为rem,需要在vue.config.js(项目没有的话就手动创建一个)中配置插件

// css相关配置
  css: {
    // 启用 CSS modules
    modules: false,
    // 是否使用css分离插件
    extract: true,
    // 开启 CSS source maps?
    sourceMap: false,
    // css预设器配置项
    loaderOptions: {
      css: {},
      postcss: {
        plugins: [
          //remUnit这个配置项的数值是多少呢??? 通常我们是根据设计图来定这个值,原因很简单,便于开发。
          //假如设计图给的宽度是750,我们通常就会把remUnit设置为75,这样我们写样式时,可以直接按照设计图标注的宽高来1:1还原开发。
          require('postcss-px2rem')({
            remUnit: 75
          })
        ]
      }
    },
  }

flexible.js

flexible会为页面根据屏幕自动添加标签,动态控制initial-scale,maximum-scale,minimum-scale等属性的值 ===>设备缩放比

所以,在我们的html的header中,就不要之前配置的viewport的meta标签了

<meta name="viewport"
    content="width=device-width, viewport-fit=cover, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no">

这种标签flexble会自动帮我们加上。

下面附上修改完后的flexble脚本代码:

(function flexible (window, document) {
  var docEl = document.documentElement
  var dpr = window.devicePixelRatio || 1
  var isMobileDevice = /(iPhone|iPad|iPod|iOS|Android)/i.test(navigator.userAgent);
  dpr = isMobileDevice ? dpr : 1;
  // adjust body font size
  function setBodyFontSize () {
    if (document.body) {
      document.body.style.fontSize = (12 * dpr) + 'px'
    }
    else {
      document.addEventListener('DOMContentLoaded', setBodyFontSize)
    }
  }
  setBodyFontSize();

  // set 1rem = viewWidth / 10
  function setRemUnit () {
    let width = docEl.clientWidth
    // 下面5行为自己加的代码,pc端页面不转rem
    let remUnitConfig = 75
    let viewWidthMax = remUnitConfig * 10
    if (width / dpr > viewWidthMax) {
      width = viewWidthMax * dpr
    }

    var rem = width / 10
    docEl.style.fontSize = rem + 'px'
  }

  setRemUnit()

  // reset rem unit on page resize
  window.addEventListener('resize', setRemUnit)
  window.addEventListener('pageshow', function (e) {
    if (e.persisted) {
      setRemUnit()
    }
  })

  // detect 0.5px supports
  if (dpr >= 2) {
    var fakeBody = document.createElement('body')
    var testElement = document.createElement('div')
    testElement.style.border = '.5px solid transparent'
    fakeBody.appendChild(testElement)
    docEl.appendChild(fakeBody)
    if (testElement.offsetHeight === 1) {
      docEl.classList.add('hairlines')
    }
    docEl.removeChild(fakeBody)
  }
}(window, document))

最后需要在index.html中引入脚本:
flexble.js要和index.html文件同级

vue cli3适配所有端方案的实现

最后在head添加js标签,引入它:

<script src="flexible.js" type="text/javascript" charset="utf-8"></script>

自此,项目就配置完了。

到此这篇关于vue cli3适配所有端方案的实现的文章就介绍到这了,更多相关vue cli3适配所有端内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
JS预览图像将本地图片显示到浏览器上
Aug 25 Javascript
JS控制阿拉伯数字转为中文大写示例代码
Sep 04 Javascript
js数组的基本操作(很全自己整理的)
Oct 16 Javascript
js随机生成网页背景颜色的方法
Feb 26 Javascript
jQuery 中的 DOM 操作
Apr 26 Javascript
JS实现的简单轮播图运动效果示例
Dec 22 Javascript
使用jQuery的ajax方法向服务器发出get和post请求的方法
Jan 13 Javascript
vue实现某元素吸顶或固定位置显示(监听滚动事件)
Dec 13 Javascript
JS中call和apply函数用法实例分析
Jun 20 Javascript
LayUi使用switch开关,动态的去控制它是否被启用的方法
Sep 21 Javascript
JS实现鼠标按下拖拽效果
Jul 23 Javascript
NestJs使用Mongoose对MongoDB操作的方法
Feb 22 Javascript
RxJS在TypeScript中的简单使用详解
Apr 13 #Javascript
JS错误处理与调试操作实例分析
Apr 13 #Javascript
JS正则表达式常见函数与用法小结
Apr 13 #Javascript
javascript设计模式 ? 桥接模式原理与应用实例分析
Apr 13 #Javascript
javascript设计模式 ? 适配器模式原理与应用实例分析
Apr 13 #Javascript
JavaScript创建表格的方法
Apr 13 #Javascript
JavaScript实现捕获鼠标坐标
Apr 12 #Javascript
You might like
PHP编程与应用
2006/10/09 PHP
处理单名多值表单的详解
2013/06/08 PHP
thinkphp配置连接数据库技巧
2014/12/02 PHP
详解使用php调用微信接口上传永久素材
2017/04/11 PHP
PHP利用DWZ.CN服务生成短网址
2019/08/11 PHP
Javascript与vbscript数据共享
2007/01/09 Javascript
javascript淡入淡出效果的实现思路
2012/03/31 Javascript
javascript dom追加内容实现示例
2013/09/21 Javascript
nodejs npm包管理的配置方法及常用命令介绍
2014/06/05 NodeJs
基于javascript制作微信聊天面板
2020/08/09 Javascript
js实现界面向原生界面发消息并跳转功能
2016/11/22 Javascript
Angular 4依赖注入学习教程之InjectToken的使用(八)
2017/06/04 Javascript
Angular2 组件间通过@Input @Output通讯示例
2017/08/24 Javascript
Bootstrap Tooltip显示换行和左对齐的解决方案
2017/10/11 Javascript
Vue+Koa2 打包后进行线上部署的教程详解
2019/07/31 Javascript
python安装cx_Oracle模块常见问题与解决方法
2017/02/21 Python
python生成不重复随机数和对list乱序的解决方法
2018/04/09 Python
python生成带有表格的图片实例
2019/02/03 Python
python中图像通道分离与合并实例
2020/01/17 Python
浅谈Python中的模块
2020/06/10 Python
Keras中的多分类损失函数用法categorical_crossentropy
2020/06/11 Python
CSS+jQuery+PHP+MySQL实现的在线答题功能
2015/04/25 HTML / CSS
html5中使用hotcss.js实现手机端自适配的方法
2020/04/23 HTML / CSS
英国泽西岛植物:Jersey Plants Direct
2019/08/07 全球购物
企业内控岗位的职责
2014/02/07 职场文书
英文自荐信常用句子
2014/03/26 职场文书
2014年党务公开方案
2014/05/08 职场文书
班主任工作经验交流材料
2014/05/13 职场文书
作风建设年活动总结
2014/08/27 职场文书
销售简历自我评价怎么写
2014/09/26 职场文书
招标保密承诺书
2015/01/20 职场文书
2015年档案室工作总结
2015/05/23 职场文书
JDBC连接的六步实例代码(与mysql连接)
2021/05/12 MySQL
sql中mod()函数取余数的用法
2021/05/29 SQL Server
Java中PriorityQueue实现最小堆和最大堆的用法
2021/06/27 Java/Android
聊聊Python String型列表求最值的问题
2022/01/18 Python