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 相关文章推荐
juqery 学习之四 筛选过滤
Nov 30 Javascript
jquery中防刷IP流量软件影响统计的一点对策
Jul 10 Javascript
jQuery源码分析-02正则表达式 RegExp 常用正则表达式
Nov 14 Javascript
JQuery伸缩导航练习示例
Nov 13 Javascript
javascript刷新父页面的各种方法汇总
Sep 03 Javascript
jquery利用命名空间移除绑定事件的方法
Mar 11 Javascript
JavaScript学习小结(一)——JavaScript入门基础
Sep 02 Javascript
JS实现的简单四则运算计算器功能示例
Sep 27 Javascript
使用puppeteer破解极验的滑动验证码
Feb 24 Javascript
基于vue手写tree插件的那点事儿
Aug 20 Javascript
JS操作json对象key、value的常用方法分析
Oct 29 Javascript
Vue简单封装axios之解决post请求后端接收不到参数问题
Feb 16 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中通过ADODB库实现调用Access数据库之修正版本
2006/12/31 PHP
全局记录程序片段的运行时间 正确找到程序逻辑耗时多的断点
2011/01/06 PHP
php中0,null,empty,空,false,字符串关系的详细介绍
2013/06/20 PHP
php获取客户端电脑屏幕参数的方法
2015/01/09 PHP
PHP多文件上传类实例
2015/03/07 PHP
PHP中quotemeta()函数的用法讲解
2019/04/04 PHP
简单实现兼容各大浏览器的js复制内容到剪切板
2015/09/09 Javascript
vue构建单页面应用实战
2017/04/10 Javascript
JavaScript输入分钟、秒倒计时技巧总结(附代码)
2017/08/17 Javascript
基于nodejs实现微信支付功能
2017/12/20 NodeJs
基于vue cli 通过命令行传参实现多环境配置
2018/07/12 Javascript
JS实现动态星空背景效果
2019/11/01 Javascript
AI小程序之语音听写来了,十分钟掌握百度大脑语音听写全攻略
2020/03/13 Javascript
Vue computed 计算属性代码实例
2020/04/22 Javascript
[48:05]2018DOTA2亚洲邀请赛 3.31 小组赛 B组 VGJ.T vs VP
2018/03/31 DOTA
Python实现二分法算法实例
2015/02/02 Python
初步理解Python进程的信号通讯
2015/04/09 Python
使用Python编写基于DHT协议的BT资源爬虫
2016/03/19 Python
详解用Python处理HTML转义字符的5种方式
2017/12/27 Python
详解python内置常用高阶函数(列出了5个常用的)
2020/02/21 Python
python实现sm2和sm4国密(国家商用密码)算法的示例
2020/09/26 Python
Python基于Webhook实现github自动化部署
2020/11/28 Python
python 爬取腾讯视频评论的实现步骤
2021/02/18 Python
目前不被任何主流浏览器支持的CSS3属性汇总
2014/07/21 HTML / CSS
京东港澳售:京东直邮港澳台
2018/01/31 全球购物
TCP/IP的分层模型
2013/10/27 面试题
清明节扫墓活动方案
2014/03/02 职场文书
投资协议书范本
2014/04/21 职场文书
励志演讲稿大全
2014/08/21 职场文书
假期安全教育广播稿
2014/10/04 职场文书
可怜妈妈观后感
2015/06/09 职场文书
关于React Native 无法链接模拟器的问题
2021/06/21 Javascript
Kubernetes中Deployment的升级与回滚
2022/04/01 Servers
星际争霸 Light vs Action 一场把教主看到鬼畜的比赛
2022/04/01 星际争霸
Tomcat 与 maven 的安装与使用教程
2022/06/16 Servers
Python  序列化反序列化和异常处理的问题小结
2022/12/24 Python