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 相关文章推荐
ext读取两种结构的xml的代码
Nov 05 Javascript
jquery不会自动回收xmlHttpRequest对象 导致了内存溢出
Jun 18 Javascript
js 验证密码强弱的小例子
Mar 21 Javascript
JS注册/移除事件处理程序(ExtJS应用程序设计实战)
May 07 Javascript
js获得网页背景色和字体色的方法
Mar 21 Javascript
jQuery点击输入框显示验证码图片
May 19 Javascript
基于JavaScript实现鼠标箭头移动图片跟着移动
Aug 30 Javascript
Node.js连接postgreSQL并进行数据操作
Dec 18 Javascript
canvas简单快速的实现知乎登录页背景效果
May 08 Javascript
Koa从零搭建到Api实现项目的搭建方法
Jul 30 Javascript
JavaScript canvas仿代码流瀑布
Feb 10 Javascript
vscode中的vue项目报错Property ‘xxx‘ does not exist on type ‘CombinedVueInstance<{ readyOnly...Vetur(2339)
Sep 11 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 调试环境(IIS+PHP+MYSQL)
2007/01/10 PHP
PHP 导出数据到淘宝助手CSV的方法分享
2010/02/27 PHP
PHP输出两个数字中间有多少个回文数的方法
2015/03/23 PHP
php根据生日计算年龄的方法
2015/07/13 PHP
十个PHP高级应用技巧果断收藏
2015/09/25 PHP
PHP钩子与简单分发方式实例分析
2017/09/04 PHP
javascript编程起步(第五课)
2007/02/27 Javascript
javascript 尚未实现错误解决办法
2008/11/27 Javascript
含有CKEditor的表单如何提交
2014/01/09 Javascript
javascript 密码框防止用户粘贴和复制的实现代码
2014/02/17 Javascript
jquery仿搜索自动联想功能代码
2014/05/23 Javascript
JavaScript截取字符串的2个函数介绍
2014/08/27 Javascript
浅谈javascript的Array.prototype.slice.call
2015/08/31 Javascript
JavaScript中的数据类型转换方法小结
2015/10/26 Javascript
JavaScript实现下拉菜单的显示和隐藏
2016/01/05 Javascript
jQuery的Each比JS原生for循环性能慢很多的原因
2016/07/05 Javascript
AngularJS入门教程之迭代器过滤详解
2016/08/18 Javascript
如何用JS/HTML将时间戳转换为“xx天前”的形式
2017/02/06 Javascript
Angular 4依赖注入学习教程之组件服务注入(二)
2017/06/04 Javascript
原生JS 购物车及购物页面的cookie使用方法
2017/08/21 Javascript
基于vue2.0实现仿百度前端分页效果附实现代码
2018/10/30 Javascript
Vue实现简易翻页效果源码分享
2018/11/08 Javascript
详解为什么Vue中不要用index作为key(diff算法)
2020/04/04 Javascript
Pandas中把dataframe转成array的方法
2018/04/13 Python
Python装饰器原理与用法分析
2018/04/30 Python
python对象销毁实例(垃圾回收)
2020/01/16 Python
使用pandas库对csv文件进行筛选保存
2020/05/25 Python
意大利高端时尚买手店:Stefania Mode
2018/03/01 全球购物
煤矿开采专业求职信
2014/07/08 职场文书
走进敬老院活动总结
2014/07/10 职场文书
小学家长学校培训材料
2014/08/24 职场文书
离婚财产处理协议书
2014/09/30 职场文书
小班上学期个人总结
2015/02/12 职场文书
试用期辞职信范文
2015/03/02 职场文书
导游词之吉林花园山
2019/10/17 职场文书
Python采集壁纸并实现炫轮播
2022/04/30 Python