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 相关文章推荐
javascript中判断一个值是否在数组中并没有直接使用
Dec 17 Javascript
Js控制弹窗实现在任意分辨率下居中显示
Aug 01 Javascript
自己编写的类似JS的trim方法
Oct 09 Javascript
JavaScript获取网页、浏览器、屏幕高度和宽度汇总
Dec 18 Javascript
Js+Ajax,Get和Post在使用上的区别小结
Jun 08 Javascript
js运动事件函数详解
Oct 21 Javascript
js模拟百度模糊搜索的实例
Aug 04 Javascript
JavaScript面向对象精要(上部)
Sep 12 Javascript
在vscode中统一vue编码风格的方法
Feb 22 Javascript
使用javascript函数编写简单银行取钱存钱流程
May 26 Javascript
Node.js Stream ondata触发时机与顺序的探索
Mar 08 Javascript
JS面向对象编程基础篇(一) 对象和构造函数实例详解
Mar 03 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
thinkphp控制器调度使用示例
2014/02/24 PHP
ThinkPHP实现事务回滚示例代码
2014/06/23 PHP
smarty中英文多编码字符截取乱码问题解决方法
2014/10/28 PHP
Laravel学习教程之model validation的使用示例
2017/10/23 PHP
php获取微信基础接口凭证Access_token
2018/08/23 PHP
jquery遍历筛选数组的几种方法和遍历解析json对象
2013/12/13 Javascript
jQuery插件Skippr实现焦点图幻灯片特效
2015/04/12 Javascript
JavaScript采用递归算法计算阶乘实例
2015/08/04 Javascript
浅谈JavaScript 标准对象
2016/06/02 Javascript
jquery select2的使用心得(推荐)
2016/12/04 Javascript
JS+Canvas实现的俄罗斯方块游戏完整实例
2016/12/12 Javascript
AngularJS 最常用的八种功能(基础知识)
2017/06/26 Javascript
详解基于 Nuxt 的 Vue.js 服务端渲染实践
2017/10/24 Javascript
微信小程序页面间值传递的两种方法
2018/11/26 Javascript
关于React动态加载路由处理的相关问题
2019/01/07 Javascript
JS去除字符串最后的逗号实例分析【四种方法】
2019/06/20 Javascript
小程序实现左滑删除效果
2019/07/25 Javascript
Vue触发隐藏input file的方法实例详解
2019/08/14 Javascript
three.js显示中文字体与tween应用详析
2021/01/04 Javascript
[08:44]DOTA2发布会群星聚首 我们都是刀塔人
2014/03/21 DOTA
Python3.x中自定义比较函数
2015/04/24 Python
利用Python的装饰器解决Bottle框架中用户验证问题
2015/04/24 Python
自己使用总结Python程序代码片段
2015/06/02 Python
python多线程与多进程及其区别详解
2019/08/08 Python
python飞机大战pygame碰撞检测实现方法分析
2019/12/17 Python
使用python实现微信小程序自动签到功能
2020/04/27 Python
深入浅析pycharm中 Make available to all projects的含义
2020/09/15 Python
美国最大的网上冲印店:Shutterfly
2017/01/01 全球购物
写好求职信第一句话的技巧
2013/10/26 职场文书
求职自荐书范文
2013/12/04 职场文书
安全教育实施方案
2014/03/02 职场文书
机关党员进社区活动总结
2014/07/05 职场文书
2014法制宣传日活动总结
2014/07/09 职场文书
班主任寄语2015
2015/02/26 职场文书
自主招生学校推荐信范文
2015/03/26 职场文书
解析在浏览器地址栏输入一个URL后发生了什么
2021/06/21 Servers