webpack的移动端适配方案小结


Posted in Javascript onJuly 25, 2021

在移动端开发的过程中,一个最常见的问题就是适配不同的屏幕宽度。目前比较常见的适配方案有rem和vw,它们都是css中的相对单位。

rem

W3C对rem的定义是 font-size of the root element,它是一个只相对于浏览器的根元素(HTML元素)的font-size的来确定的单位,也就是说对于不同宽度的机型,我们只需要计算出对应的根元素的字体大小,用同样的css代码可以实现等比适配。考虑最简单的情况:

html代码片段

//移动页面中不可少的meta,将设备屏幕的宽度设置成将文档宽度
<meta name="viewport" content="width=device-width, initial-scale=1,user-scalable=0">

js代码片段

//根据文档宽度计算根元素的字体大小,以文档宽度的1/10为例,如果屏幕宽度为375,那么根元素font-size就为37.5px
var w = document.documentElement.clientWidth;
document.documentElement.style.fontSize = w / 10 + 'px';

css代码片段

//此时如果在css中写
.div{
  width: 2rem;
}
//那么这个div的宽度就是75px,同理如果屏幕宽度为360,那么div就宽72px。
//日常开发中,比较常见的设计稿是750px,在设计稿中一个区域的高度为30px的话,
//在css中写成 height:0.4rem(30/75),就能完成等比缩放

而实际开发中,我们通常在webpack构建的时候使用插件来实现rem适配:postcss-pxtorem 和 lib-flexible。

安装:npm i postcss-pxtorem --D npm i amfe-flexible --S

在webpack.config.js中配置postcss-loader

module.exports = {
    entry: "./src/index.js",
    output: {
        path: path.join(__dirname,"/dist"),
        filename: "bundle.js"
    },
    module:{
        rules:[
            {
                test: /\.css$/,
                use:  ['style-loader','css-loader','postcss-loader']  //配置postcss-loader
            }
        ]
    },  
}

在项目根目录新建.postcssrc.js文件,在其中写入postcss-pxtorem插件配置

module.exports = {
  "plugins": {
    "postcss-pxtorem": {
        rootValue: 75,                   //750的设计稿
        propList: ['*']
     }
   }
}

在entry指定的入口js文件("./src/index.js")中引入lib-flexible

import 'amfe-flexible'

这样,就可以在css中直接写设计稿中的绝对像素值,比如一个div#test在750设计稿中的宽度为200px,就可以直接这样写,而不用换算了。

#test{
  width: 200px
}

vw

另外一种方案是使用vw:1% of viewport's width, 它是相对浏览器可视区域宽度的单位。

//移动页面中不可少的meta,将设备屏幕的宽度设置成将文档宽度
<meta name="viewport" content="width=device-width, initial-scale=1,user-scalable=0">

在移动端,如果配置了width = device-width,那么100vw就是屏幕宽度。

使用vw布局,就不需要再像rem那样,用js中去动态设置根元素的font-size,而是直接相对于屏幕宽度。比如750的设计稿中,一个div的宽度是200px,那么就可以写:width: 200 / 750 * 100 vw

而使用webpack,我们可以用 postcss-px-to-viewport 插件来实现:

安装:npm i postcss-px-to-viewport --D

如上rem那样在webpack.config.js配置 postcss-loader。
在项目根目录新建.postcssrc.js文件,在其中写入 postcss-px-to-viewport 插件配置

module.exports = {
  "plugins": {
    'postcss-px-to-viewport': {
        viewportWidth: 750                 //750的设计稿
     }
   }
}

这样也就可以在css中直接写设计稿中的绝对像素值,示例同上rem的示例。

适配第三方UI框架

有时候我们在移动端会使用其他组件库,引用像vant、mint-ui这样的第三方UI框架,因为第三方框架用的是px单位,基于375px的设计稿,如果我们的项目是750px的设计稿,就不能用同一个viewportWidth进行适配。

此时可以在.postcssrc.js中如下配置(以vw为例,rem也类似):

const path = require('path')
module.exports = ({file}) => {

  //如果使用vant UI框架
  const width = file.dirname.includes(path.join('node_modules', 'vant')) ? 375 : 750; 
  
  return {
    "plugins": {
      "postcss-px-to-viewport": {
        viewportWidth: width,
      }
    }
  }
}

结语

rem和vw都是常用的移动端适配解决方案。两者的区别,首先是在兼容性上,rem可以兼容更老的浏览器版本,参考caniuse网站 caniuse.com/ ;其次是rem需要通过js计算根元素的字体大小,vm是纯css实现。

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

Javascript 相关文章推荐
js 代码集(学习js的朋友可以看下)
Jul 22 Javascript
url 特殊字符 传递参数解决方法
Jan 01 Javascript
js判断手机和pc端选择不同执行事件的方法
Jan 30 Javascript
jfreechart插件将数据展示成饼状图、柱状图和折线图
Apr 13 Javascript
jQuery实现的省市联动菜单功能示例【测试可用】
Jan 13 Javascript
微信小程序 缓存(本地缓存、异步缓存、同步缓存)详解
Jan 17 Javascript
javascript事件的传播基础实例讲解(35)
Feb 14 Javascript
jquery实现的table排序功能示例
Mar 10 Javascript
vue框架制作购物车小球动画效果实例代码
Sep 26 Javascript
详解如何在JS代码中消灭for循环
Dec 11 Javascript
微信小程序全选多选效果实现代码解析
Jan 21 Javascript
Vue element-ui父组件控制子组件的表单校验操作
Jul 17 Javascript
Vue3.0 手写放大镜效果
ElementUI实现el-form表单重置功能按钮
vue项目多环境配置(.env)的实现
Node与Python 双向通信的实现代码
Jul 16 #Javascript
node.js如何自定义实现一个EventEmitter
Jul 16 #Javascript
node.js使用express-fileupload中间件实现文件上传
Jul 16 #Javascript
html5 录制mp3音频支持采样率和比特率设置
You might like
php 使用fopen函数创建、打开文件详解及实例代码
2016/09/24 PHP
PHP操作Redis常用技巧总结
2018/04/24 PHP
js刷新框架子页面的七种方法代码
2008/11/20 Javascript
jquery 经典动画菜单效果代码
2010/01/26 Javascript
三级下拉菜单的js实现代码
2011/05/23 Javascript
JS/jQuery实现默认显示部分文字点击按钮显示全部内容
2013/05/13 Javascript
Node.js中的process.nextTick使用实例
2015/06/25 Javascript
NodeJs读取JSON文件格式化时的注意事项
2016/09/25 NodeJs
JS判断键盘是否按的回车键并触发指定按钮点击操作的方法
2017/02/13 Javascript
js仿淘宝评价评分功能
2017/02/28 Javascript
Bootstrap免费字体和图标网站(值得收藏)
2017/03/16 Javascript
关于JavaScript中forEach和each用法浅析
2017/07/27 Javascript
Vim快速合并行及vim 将文件所有行合并到一行
2017/11/27 Javascript
nodejs调取微信收货地址的方法
2017/12/20 NodeJs
实例解析ES6 Proxy使用场景介绍
2018/01/08 Javascript
vue移动UI框架滑动加载数据的方法
2018/03/12 Javascript
JavaScript的Object.defineProperty详解
2018/07/09 Javascript
js删除数组中某几项的方法总结
2019/01/16 Javascript
vue 父组件给子组件传值子组件给父组件传值的实例代码
2019/04/15 Javascript
React Hooks 实现和由来以及解决的问题详解
2020/01/17 Javascript
JavaScript实现拖拽盒子效果
2020/02/06 Javascript
vue 通过 Prop 向子组件传递数据的实现方法
2020/10/30 Javascript
[24:42]VP vs TNC Supermajor小组赛B组 BO3 第三场 6.2
2018/06/03 DOTA
Python秒算24点实现及原理详解
2019/07/29 Python
pandas条件组合筛选和按范围筛选的示例代码
2019/08/26 Python
Python协程 yield与协程greenlet简单用法示例
2019/11/22 Python
python数据类型可变不可变知识点总结
2020/03/06 Python
python 写一个水果忍者游戏
2021/01/13 Python
检测浏览器对HTML5和CSS3支持度的方法
2015/06/25 HTML / CSS
Notino意大利:购买香水和化妆品
2018/11/14 全球购物
学前教育求职自荐信范文
2013/12/25 职场文书
公司活动邀请函
2014/01/24 职场文书
自愿解除劳动合同协议书
2014/09/11 职场文书
印刷技术专业自荐信
2014/09/18 职场文书
寒假致家长的一封信
2015/10/10 职场文书
Android开发 使用文件储存的方式保存QQ密码
2022/04/24 Java/Android