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 相关文章推荐
弹出广告特效(一个IP只弹出一次)的代码
Jul 27 Javascript
动态加载图片路径 保持JavaScript控件的相对独立性
Sep 06 Javascript
分享27个jQuery 表单插件集合推荐
Apr 25 Javascript
原生Js实现元素渐隐/渐现(原理为修改元素的css透明度)
Jun 24 Javascript
用js模拟struts2的多action调用示例
May 19 Javascript
深入理解JavaScript系列(19):求值策略(Evaluation strategy)详解
Mar 05 Javascript
drag-and-drop实现图片浏览器预览
Aug 06 Javascript
AngularJS中的包含详细介绍及实现示例
Jul 28 Javascript
Bootstrap3多级下拉菜单
Feb 24 Javascript
原生JS实现图片网格式渐显、渐隐效果
Jun 05 Javascript
亲自动手实现vue日历控件
Jun 26 Javascript
JavaScript中的this基本问题实例小结
Mar 09 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
全国FM电台频率大全 - 8 黑龙江省
2020/03/11 无线电
PHP+memcache实现消息队列案例分享
2014/05/21 PHP
thinkphp四种url访问方式详解
2014/11/28 PHP
Laravel5.* 打印出执行的sql语句的方法
2017/07/24 PHP
PHP中TP5 上传文件的实例详解
2017/07/31 PHP
php静态成员方法和静态的成员属性的使用方法
2017/10/26 PHP
jquery实现的超出屏幕时把固定层变为定位层的代码
2010/02/23 Javascript
IE与FireFox中的childNodes区别
2011/10/20 Javascript
JavaScript高级程序设计阅读笔记(十六) javascript检测浏览器和操作系统-detect.js
2012/08/14 Javascript
js中的cookie的读写操作示例详解
2014/04/17 Javascript
javascript判断变量是否有值的方法
2015/04/20 Javascript
当jquery ajax遇上401请求的解决方法
2016/05/19 Javascript
JS正则表达式验证密码格式的集中情况总结
2017/02/23 Javascript
node.js利用redis数据库缓存数据的方法
2017/03/01 Javascript
jquery实现表单获取短信验证码代码
2017/03/13 Javascript
微信小程序开发之麦克风动画 帧动画 放大 淡出
2017/04/18 Javascript
VUE中使用Vue-resource完成交互
2017/07/21 Javascript
vue动态渲染svg、添加点击事件的实现
2020/03/13 Javascript
jQuery zTree如何改变指定节点文本样式
2020/10/16 jQuery
如何使用RoughViz可视化Vue.js中的草绘图表
2021/01/30 Vue.js
python基于itchat实现微信群消息同步机器人
2017/02/27 Python
python获取文件路径、文件名、后缀名的实例
2018/04/23 Python
python将回车作为输入内容的实例
2018/06/23 Python
在Python中,不用while和for循环遍历列表的实例
2019/02/20 Python
用python求一个数组的和与平均值的实现方法
2019/06/29 Python
CSS3 毛玻璃效果
2019/08/14 HTML / CSS
Html5画布_动力节点Java学院整理
2017/07/13 HTML / CSS
Sunglasses Shop丹麦:欧洲第一的太阳镜在线销售网站
2017/10/22 全球购物
亚洲独特体验旅游专家:eOasia
2018/08/15 全球购物
建筑工程毕业生自我鉴定
2014/01/14 职场文书
搞笑征婚广告词
2014/03/17 职场文书
好学生评语大全
2014/05/05 职场文书
企业党员一句话承诺
2014/05/30 职场文书
感谢信范文大全
2015/01/23 职场文书
党支部审查意见
2015/06/02 职场文书
四年级语文教学反思
2016/03/03 职场文书