详解基于Vue/React项目的移动端适配方案


Posted in Javascript onAugust 23, 2019

前言

本文的目标是通过下文介绍的适配方案,使用vue或react开发移动端及H5的时候,不需要再关心移动设备的大小,只需要按照固定设计稿的px值布局,提升开发效率。

下文给出了本人分别使用create-react-app搭建的react(create-react-app)项目和使用vue-cli 2.x 搭建的vue项目中的 亲测可用 配置方案。

px2rem或postcss-px2rem

  • 在移动端中,为了设配不同的设备,通常使用rem来做适配。
  • rem是通过根元素进行适配的,网页中的根元素指的是<html>,我们通过设置<html>的字体大小就可以控制 rem 的大小(1rem = 1根元素字体大小)。
  • 可见,只要我们根据不同屏幕(使用css媒体查询或js)设定好根元素<html>的字体大小,其他已经使用了rem单位的元素就会自适应显示相应的尺寸。
  • 设计稿一般是按照一种特定设备型号(如iphone6)为基础且以px单位来定义样式,为了让设计稿能够通用在不同的设备型号中,则存在着从px到rem的繁琐计算转化过程,因此需要更加科学的方式来使用rem单位。
  • px2rem或postcss-px2rem的原理:将css中px编译为rem,配合js根据不同手机型号计算出dpr的值,修改<meta>的viewport值和置<html>的font-size。

项目中的使用

recat项目配置postcss-px2rem

首先,我们使用 react 的脚手架 create-react-app 初始化一个 webpack 项目(前提是已经安装过create-react-app,具体不再阐述)。

create-react-app my-app

暴露webpack配置,即 react-scripts 包:

yarn eject

使用yarn 安装项目所需依赖后,安装 lib-flexible 、 postcss-px2rem 和 postcss-loader:

yarn add postcss-px2rem lib-flexible 
yarn add postcss-loader --dev

在入口页面 index.html 中设置<meta>标签:

<meta name="viewport" content="width=device-width,inital-scale=1.0,
  maximum-scale=1.0,minimum-scale=1.0,user-scalable=no">

然后在项目入口文件 index.js 中引入 lib-flexible:

import 'lib-flexible';

接着,在项目config目录下的 webpack.config.js 中引入 postcss-px2rem :

const px2rem = require('postcss-px2rem')

同时,在 webpack.config.js 的 postcss-loader loader里面添加 :

{
    loader: require.resolve('postcss-loader'),
    options: {
     /* 省略代码... */
     plugins: () => [
      require('postcss-flexbugs-fixes'),
      require('postcss-preset-env')({
       autoprefixer: {
        flexbox: 'no-2009',
       },
       stage: 3,
      }),
      px2rem({remUnit: 37.5}), // 添加的内容
      /* 省略代码... */
     ],
     sourceMap: isEnvProduction && shouldUseSourceMap,
    },
   },

最后,使用 yarn start 重启项目,则会发现项目中的postcss-px2rem配置完成。

vue项目配置px2rem

首先,我们使用 vue 的脚手架 vue-cli 初始化一个 webpack 项目(前提是已经安装过vue-cli,具体不再阐述),一些选项根据自己项目需要选择。

vue init webpack my-app

命令执行之后,会在当前目录生成一个以“my-app”命名的项目文件夹。进入项目目录:

cd my-app

使用yarn 安装项目所需依赖后,安装 lib-flexible 和  px2rem-loader:

yarn add lib-flexible
yarn add px2rem-loader --dev

在入口页面 index.html 中设置<meta>标签:

<meta name="viewport" content="width=device-width,inital-scale=1.0,
  maximum-scale=1.0,minimum-scale=1.0,user-scalable=no">

然后在项目入口文件 main.js 中引入 lib-flexible:

import 'lib-flexible/flexible.js';

同时,在项目build目录下的 utils.js 中,将px2rem-loader 添加到cssLoaders中。通过搜索找到 generateLoaders 方法,在这里添加:

exports.cssLoaders = function (options) {
 /* 省略代码块 */

 const cssLoader = {
  /* 省略代码块 */
 }

 /* 添加的代码块 */
 const px2remLoader = {
  loader: 'px2rem-loader',
  options: {
   remUnit: 37.5 // 基准大小 baseSize,设计稿宽度/10
  }
 }
 /* 添加的代码块 */
 
 // generate loader string to be used with extract text plugin
 function generateLoaders (loader, loaderOptions) {
  const loaders = [cssLoader, px2remLoader] // 添加px2remLoader
  if (loader) {
   /* 省略代码块 */
  }

  /* 省略代码块 */
}

最后,使用 yarn dev 重启项目,会发现自己设置的px被转为rem 了。

详解基于Vue/React项目的移动端适配方案

适用情况 & 不适用情况

以上实现转换适用于:
(1)vue 组件中编写的<style></style>下的css。
(2)从 react 项目的 index.js 或者 vue 项目的 main.js 中通过import ‘../../static/css/reset.css'引入css。
(3)在 vue 组件的<script type=”text/ecmascript-6″>import ‘../../static/css/reset.css'</script>中引入css。

另外的情况不适用:
(1)在 vue 组件的<style></style>中通过@import “../../static/css/reset.css (可考虑上面(2)、(3)的形式引入)。
(2)外部样式:<link rel=”stylesheet” href=”static/css/reset.css”>。
(3)元素内部样式:style="height: 417px; width: 550px;"。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Jquery ui css framework
Jun 28 Javascript
jQuery实现table隔行换色和鼠标经过变色的两种方法
Jun 15 Javascript
Bootstrap每天必学之简单入门
Nov 19 Javascript
通过网页查看JS源码中汉字显示乱码的解决方法
Oct 26 Javascript
解析Javascript单例模式概念与实例
Dec 05 Javascript
jquery对象与DOM对象转化
Feb 08 Javascript
JavaScript上传文件时不用刷新页面方法总结(推荐)
Aug 15 Javascript
基于vue v-for 循环复选框-默认勾选第一个的实现方法
Mar 03 Javascript
vue2 全局变量的设置方法
Mar 09 Javascript
这15个Vue指令,让你的项目开发爽到爆
Oct 11 Javascript
vue 使用lodash实现对象数组深拷贝操作
Sep 10 Javascript
vue 中this.$set 动态绑定数据的案例讲解
Jan 29 Vue.js
详解vue-video-player使用心得(兼容m3u8)
Aug 23 #Javascript
使用vue实现多规格选择实例(SKU)
Aug 23 #Javascript
jquery分页优化操作实例分析
Aug 23 #jQuery
jquery实现的分页显示功能示例
Aug 23 #jQuery
微信小程序 子级页面返回父级并把子级参数带回父级实现方法
Aug 22 #Javascript
通过扫小程序码实现网站登陆功能
Aug 22 #Javascript
vue中实现上传文件给后台实例详解
Aug 22 #Javascript
You might like
php检查函数必传参数是否存在的实例详解
2017/08/28 PHP
thinkPHP框架自动填充原理与用法分析
2018/04/03 PHP
PHP变量的作用范围实例讲解
2020/12/22 PHP
探索Emberjs制作一个简单的Todo应用
2012/11/07 Javascript
JavaScript更改字符串的大小写
2015/05/07 Javascript
jQuery封装的tab选项卡插件分享
2015/06/16 Javascript
全面解析Bootstrap表单使用方法(表单按钮)
2015/11/24 Javascript
Bootstrap导航栏各元素操作方法(表单、按钮、文本)
2015/12/28 Javascript
分析js闭包引起的事件注册问题
2016/03/29 Javascript
JavaScript实现显示函数调用堆栈的方法
2016/04/21 Javascript
JavaScript闭包和范围实例详解
2016/12/19 Javascript
JS设计模式之访问者模式定义与用法分析
2018/02/05 Javascript
javascript中toFixed()四舍五入使用方法详解
2018/09/28 Javascript
JS实现将对象转化为数组的方法分析
2019/01/21 Javascript
小程序如何支持使用 async/await详解
2019/09/12 Javascript
js实现掷骰子小游戏
2019/10/24 Javascript
antd中table展开行默认展示,且不需要前边的加号操作
2020/11/02 Javascript
Vue中避免滥用this去读取data中数据
2021/03/02 Vue.js
[06:06]2018DOTA2亚洲邀请赛主赛事第四日战况回顾 全明星赛欢乐上演
2018/04/07 DOTA
Python实现的检测web服务器健康状况的小程序
2014/09/17 Python
Python中特殊函数集锦
2015/07/27 Python
Python中__init__.py文件的作用详解
2016/09/18 Python
Python爬取网易云音乐上评论火爆的歌曲
2017/01/19 Python
Python配置mysql的教程(推荐)
2017/10/13 Python
5个很好的Python面试题问题答案及分析
2018/01/19 Python
python实现在IDLE中输入多行的方法
2018/04/19 Python
Python3自动签到 定时任务 判断节假日的实例
2018/11/13 Python
使用python对多个txt文件中的数据进行筛选的方法
2019/07/10 Python
3行Python代码实现图像照片抠图和换底色的方法
2019/10/10 Python
Python猴子补丁Monkey Patch用法实例解析
2020/03/23 Python
法国床上用品商店:La Compagnie du lit
2019/12/26 全球购物
Lancer Skincare官方网站:抗衰老皮肤护理
2020/11/20 全球购物
企业党员公开承诺书
2014/03/26 职场文书
应聘会计求职信
2014/06/11 职场文书
幼儿园老师新年寄语
2015/08/17 职场文书
德劲DE1108畅想
2021/04/22 无线电