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 相关文章推荐
JavaScript 题型问答有答案参考
Feb 17 Javascript
深入理解JavaScript系列(6):S.O.L.I.D五大原则之单一职责SRP
Jan 15 Javascript
Javascript中克隆一个数组的实现代码
Dec 06 Javascript
Jquery自定义button按钮的几种方法
Jun 11 Javascript
Boostrap入门准备之border box
May 09 Javascript
完美解决jQuery的hover事件在IE中不停闪动的问题
Feb 10 Javascript
fullPage.js和CSS3实现全屏滚动效果
May 05 Javascript
Angularjs自定义指令Directive详解
May 27 Javascript
Angular2使用vscode断点调试ts文件的方法
Dec 13 Javascript
解决vue router组件状态刷新消失的问题
Aug 01 Javascript
layer.open 子页面弹出层向父页面传输数据的例子
Sep 26 Javascript
Node.js实现批量下载图片简单操作示例
Jan 18 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调用Twitter的RSS的实现代码
2010/03/10 PHP
PHP函数spl_autoload_register()用法和__autoload()介绍
2012/02/04 PHP
Yii基于数组和对象的Model查询技巧实例详解
2015/12/28 PHP
JavaScript初学者需要了解10个小技巧
2010/08/25 Javascript
使用JS CSS去除IE链接虚线框的三种方法
2013/11/14 Javascript
js opener的使用详解
2014/01/11 Javascript
jQuery中[attribute]选择器用法实例
2014/12/31 Javascript
JQuery中Text方法用法实例分析
2015/05/18 Javascript
深入理解事件冒泡(Bubble)和事件捕捉(capture)
2016/05/28 Javascript
最棒的Angular2表格控件
2016/08/10 Javascript
jQuery异步提交表单的两种方式
2016/09/13 Javascript
JS控件bootstrap suggest plugin使用方法详解
2017/03/25 Javascript
AngulaJS路由 ui-router 传参实例
2017/04/28 Javascript
JavaScript上传文件时不用刷新页面方法总结(推荐)
2017/08/15 Javascript
详解Vue改变数组中对象的属性不重新渲染View的解决方案
2018/09/21 Javascript
JavaScript遍历DOM元素的常见方式示例
2019/02/16 Javascript
JS前端广告拦截实现原理解析
2020/02/17 Javascript
vuex分模块后,实现获取state的值
2020/07/26 Javascript
[01:48]DOTA2 2015国际邀请赛中国区预选赛第二日战报
2015/05/27 DOTA
[36:54]Mineski vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
Python实现的批量下载RFC文档
2015/03/10 Python
python基于三阶贝塞尔曲线的数据平滑算法
2019/12/27 Python
关于pytorch中全连接神经网络搭建两种模式详解
2020/01/14 Python
基于Python计算圆周率pi代码实例
2020/03/25 Python
如何写python的配置文件
2020/06/07 Python
python中wheel的用法整理
2020/06/15 Python
filter使用python3代码进行迭代元素的实例详解
2020/12/03 Python
集团公司人力资源部岗位职责
2014/01/03 职场文书
酒店前厅员工辞职信
2014/01/08 职场文书
写自荐信三大法宝
2014/01/24 职场文书
个人委托书范本
2014/04/02 职场文书
房屋租赁协议书
2014/04/10 职场文书
嘉宾邀请函
2015/01/31 职场文书
中小企业员工手册范本
2015/05/14 职场文书
企业安全生产规章制度
2015/08/06 职场文书
五年级数学教学反思
2016/02/16 职场文书