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 相关文章推荐
JavaScrip单线程引擎工作原理分析
Sep 04 Javascript
jQuery ReferenceError: $ is not defined 错误的处理办法
May 10 Javascript
jquery sortable的拖动方法示例详解
Jan 16 Javascript
javascript实现无缝上下滚动特效
Dec 16 Javascript
javascript图片切换综合实例(循环切换、顺序切换)
Jan 13 Javascript
JavaScript动态生成二维码图片
Apr 20 Javascript
利用jQuery的动画函数animate实现豌豆发射效果
Aug 28 Javascript
关于jQuery EasyUI 中刷新Tab选项卡后一个页面变形的解决方法
Mar 02 Javascript
你或许不知道的一些npm实用技巧
Jul 04 Javascript
过滤器vue.filters的使用方法实现
Sep 18 Javascript
基于jQuery实现可编辑的表格
Dec 11 jQuery
Vue 使用typescript如何优雅的调用swagger API
Sep 01 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指定长度分割字符串str_split函数用法示例
2017/01/30 PHP
javascript类继承机制的原理分析
2009/09/12 Javascript
Javascript中 关于prototype属性实现继承的原理图
2013/04/16 Javascript
ECMAScript5中的对象存取器属性:getter和setter介绍
2014/12/08 Javascript
javascript比较两个日期的先后示例代码
2014/12/31 Javascript
jQuery焦点控制图层展示延迟隐藏的方法
2015/03/09 Javascript
基于jQuery Circlr插件实现产品图片360度旋转
2015/09/20 Javascript
基于React.js实现原生js拖拽效果引发的思考
2016/03/30 Javascript
两种方法解决javascript url post 特殊字符转义 + &amp; #
2016/04/13 Javascript
JavaScript实现简单的日历效果
2016/09/25 Javascript
headjs实现网站并行加载但顺序执行JS
2016/11/29 Javascript
Angular CLI在Angular项目中如何使用scss详解
2018/04/10 Javascript
vue项目中使用百度地图的方法
2018/06/08 Javascript
JS实现的点击按钮图片上下滚动效果示例
2019/01/28 Javascript
Node.js系列之发起get/post请求(2)
2019/08/30 Javascript
javascript设计模式之装饰者模式
2020/01/30 Javascript
js中addEventListener()与removeEventListener()用法案例分析
2020/03/02 Javascript
Python采用socket模拟TCP通讯的实现方法
2014/11/19 Python
在Python下进行UDP网络编程的教程
2015/04/29 Python
python实现查找excel里某一列重复数据并且剔除后打印的方法
2015/05/26 Python
使用django-crontab实现定时任务的示例
2018/02/26 Python
Django之使用celery和NGINX生成静态页面实现性能优化
2019/10/08 Python
Python tkinter模版代码实例
2020/02/05 Python
Django使用rest_framework写出API
2020/05/21 Python
Python3合并两个有序数组代码实例
2020/08/11 Python
html5拖曳操作 HTML5实现网页元素的拖放操作
2013/01/02 HTML / CSS
Java中的基本数据类型所占存储空间大小固定的吗
2012/02/15 面试题
五十岁生日宴会答谢词
2014/01/15 职场文书
工程招投标邀请书
2014/01/26 职场文书
大学同学聚会邀请函
2014/01/29 职场文书
保护环境建议书300字
2014/05/13 职场文书
计算机网络专业求职信
2014/06/05 职场文书
锅炉工岗位职责
2015/02/13 职场文书
幼儿园教师节活动总结
2015/03/23 职场文书
2015年营业员工作总结
2015/04/23 职场文书
干货!开幕词的写作方法
2019/04/02 职场文书