VUE移动端及PC端适配方案

前言

前几天开发公司产品官网的时候,遇到了一些适配问题,当时选择用postcss-px-to-viewport方案来实现适配,效果也很显著,每个页面都适配到位

方案1. 使用PostCss-px-to-viewport插件

step1. vue安装postcss-px-to-viewport插件。

  1. 使用npm安装
$ npm install postcss-px-to-viewport --save-dev
  1. 或者使用yarn进行安装
$ yarn add -D postcss-px-to-viewport

step2. 配置适配插件的参数

{
      unitToConvert: 'px',            //需要转换的单位
      viewportWidth: 750,           //设计稿的宽度
      unitPrecision: 5,                 //单位转换后保留的精度
      propList: ['*'],         //能转化为vw的属性列表,默认'*'
      viewportUnit: 'vw',              //转换后的视口单位
      fontViewportUnit: 'vw',      //字体使用的视口单位
      selectorBlackList: [],            //忽略的css选择器
      minPixelValue: 1,                //最小的转换数值
      mediaQuery: false,             //是否开启媒体查询
      replace: true,     //是否直接更换属性值,而不添加备用属性     
      exclude: [],          //忽略某些文件夹下的文件或特定文件
      landscape: false,  
      landscapeUnit: 'vw',  //横屏时使用的单位
      landscapeWidth: 750   //横屏时使用的视口宽度
  }

使用PostCss配置文件时,在<u>postcss.config.js</u>添加如下配置:

module.exports = {
  plugins: {
    ...
    'postcss-px-to-viewport': {
          "viewportWidth": 750,
          "minPixelValue": 1,
          "mediaQuery": false,
          "selectorBlackList": ["van", "el"],
          "landscape": true,
          "landscapeUnit": "vw",
          "landscapeWidth": 2048 
    }
  }}

或者在<u>package.json</u>中,添加以下配置:

"postcss": {
    "plugins": {
        "autoprefixer": { },
        "postcss-px-to-viewport": {
              "viewportWidth": 750,
              "minPixelValue": 1,
              "mediaQuery": false,
              "selectorBlackList": ["van", "el"],
              "landscape": true,
              "landscapeUnit": "vw",
              "landscapeWidth": 2048  
        }
     }
  }

说明下几个重要参数的使用:

  1. viewportWidth 必填属性,根据UI提供的设计稿宽度定义
  2. minPixelValue 必填属性,一般为1
  3. selectorBlackList 选填属性,通常情况下,可以忽略一些第三方的UI样式,否则viewport将改变第三方UI样式库的单位值
  4. mediaQuery 选填属性,是否开启媒体查询
  5. landscape 选填属性,是否添加根据 landscapeWidth 生成的媒体查询条件 @media (orientation: landscape)
  6. landscapeWidth 选填属性,横屏时使用的视口宽度

适配存在的问题点:

  1. 如果产品的需求是PC端查看移动端网页时,需要居中显示。
    由于postcss-px-to-viewport的原理是,根据设计稿,把所有试图单位的宽高设置成vw单位,也就是一个比例,那么所有的设备传真实像素进来的时候,会得出真实的px值。
    所以我们PC全屏时,看到的效果是移动端网页充满PC的屏幕宽度,这时候,landscape就可以帮我们解决这个问题了。

    "landscape": true,
    "landscapeUnit": "vw",
    "landscapeWidth": 2048  
    

    landscape参数的作用(上面有解释)。

  2. 如果我们引用了第三方UI库,例如element-ui、vant等热门ui被压缩
    selectorBlackList帮我们处理了这个问题。
    只需要将第三方ui的前缀加入到selectorBlackList数组中,例如

    "selectorBlackList": ["van", "el"]
    

    那么postcss-px-to-viewport自动排除这些带前缀的组件

方案2. libflexible和postCss-px2Rem插件配合使用

step1.引入lib-fixible

npm install lib-flexible --save-dev

注:执行指令后在package.json的devDependencies分支可以看到相应的版本,

2. 在main.js中导入lib-fixible.

import 'lib-flexible'

如果未使用vue的伙伴可以直接在前端中直接使用阿里的CDN,如下:

<script src="http://g.tbcdn.cn/mtb/lib-flexible/0.3.4/??flexible_css.js,flexible.js"></script>

step2. 引入postcss-px2remnpm

install postcss-px2rem --save-dev

注:此处是postcss-px2rem而不是px2rem-loader,网上很多文章都引用是后者,会导致在配置时候无法成功配置。
在vue.config.js中配置如下配置即可,如未有此文件请自行搜索查询创建配置。

module.exports = {
    css: {
        loaderOptions: {
            postcss: {
                plugins: [
                    require('postcss-px2rem')({
                        // 以设计稿750为例, 750 / 10 = 75
                        remUnit: 75
                    }),
                ]
            }
        }
    }
 };
  1. 因为postcss-px2rem是基于px2rem编写的,所以同样也支持px2rem后缀注解方式。

  2. 在样式后面添加/no/,即不会将px转成rem。

  3. 在样式后面添加/px/,会更加dpr生成三套带px代码,以data-dpr=2为基准

  4. 注意:备注前面样式一定要以分号结尾,不然无法被识别。

详情使用查阅px2rem官方说明

埋坑提示:

集成以上两个步骤,基本前端即可根据屏幕自行适配,但可能有部分伙伴会遇到data-dpr始终为1,遇到这个情况多半是因为在html头中自己设置了<meta name="viewport" ...>,

查看lib-flexble做了配置,默认会根据屏幕为我们添加头文件的,如果自行设置,那么只会进行修改设置的值而已,并不会再添加,所以导致data-dpr始终为1,所以把<metaname="viewport" ...>去除.

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,817评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,329评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,354评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,498评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,600评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,829评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,979评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,722评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,189评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,519评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,654评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,329评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,940评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,762评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,993评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,382评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,543评论 2 349

推荐阅读更多精彩内容