详解基于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图片上下tab切换效果
Mar 18 Javascript
动态加载js和css(外部文件)
Apr 17 Javascript
JS 获取浏览器和屏幕宽高等信息代码
Mar 31 Javascript
js实现的tab标签切换效果代码分享
Aug 25 Javascript
微信小程序 本地数据读取实例
Apr 27 Javascript
JavaScript中双向数据绑定详解
May 03 Javascript
vue轮播图插件vue-awesome-swiper的使用代码实例
Jul 10 Javascript
vue使用iframe嵌入网页的示例代码
Jun 09 Javascript
React实现全局组件的Toast轻提示效果
Sep 21 Javascript
解决eclipse中没有js代码提示的问题
Oct 10 Javascript
vue使用高德地图点击下钻上浮效果的实现思路
Oct 12 Javascript
JS 创建对象的模式实例小结
Apr 28 Javascript
详解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人民币金额数字转中文大写的函数代码
2013/02/27 PHP
关于php循环跳出的问题
2013/07/01 PHP
学习php设计模式 php实现原型模式(prototype)
2015/12/07 PHP
php爬取天猫和淘宝商品数据
2018/02/23 PHP
jQuery.query.js 取参数的两点问题分析
2012/08/06 Javascript
js拖动div 当鼠标移动时整个div也相应的移动
2013/11/21 Javascript
js中substring和substr的定义和用法
2014/05/05 Javascript
使用jquery清空、复位整个输入域
2015/04/02 Javascript
setTimeout内不支持jquery的选择器的解决方案
2015/04/28 Javascript
js文本框输入内容智能提示效果
2015/12/02 Javascript
JS中常用的正则表达式
2016/09/29 Javascript
Bootstrap按钮组简单实现代码
2017/03/06 Javascript
B/S(Web)实时通讯解决方案分享
2017/04/06 Javascript
bootstrap响应式导航条模板使用详解(含下拉菜单,弹出框)
2017/11/17 Javascript
vue使用Element组件时v-for循环里的表单项验证方法
2018/06/28 Javascript
vue首次赋值不触发watch的解决方法
2018/09/11 Javascript
Electron-vue开发的客户端支付收款工具的实现
2019/05/24 Javascript
js简单的分页器插件代码实例
2019/09/11 Javascript
jQuery操作事件完整实例分析
2020/01/10 jQuery
VUE项目实现主题切换的多种方法
2020/11/26 Vue.js
Python基于Tkinter的HelloWorld入门实例
2015/06/17 Python
基于Django框架利用Ajax实现点赞功能实例代码
2018/08/19 Python
ipython和python区别详解
2019/06/26 Python
python中提高pip install速度
2020/02/14 Python
css3实现wifi信号逐渐增强效果实例
2017/08/09 HTML / CSS
基于HTML5 WebGL的3D机房的示例
2018/03/16 HTML / CSS
美国顶级防滑鞋:Shoes For Crews
2017/03/27 全球购物
美国男士西装打折店:Jos. A. Bank
2017/11/13 全球购物
办公室经理岗位职责
2014/01/01 职场文书
大二法学专业职业生涯规划范文
2014/02/12 职场文书
《手指教学》反思
2014/02/14 职场文书
喝酒驾驶检讨书
2014/10/01 职场文书
2015年七一建党节慰问信
2015/03/23 职场文书
MySQL通过binlog恢复数据
2021/05/27 MySQL
Django中session进行权限管理的使用
2021/07/09 Python
win11高清晰音频管理器在哪里?win11找不到高清晰音频管理器解决办法
2022/04/08 数码科技