移动端 REM 适配

Vant 中的样式默认使用 `px` 作为单位,如果需要使用 `rem` 单位,推荐使用以下两个工具:

- [postcss-pxtorem](https://github.com/cuth/postcss-pxtorem) 是一款 postcss 插件,用于将单位转化为 rem

- [lib-flexible](https://github.com/amfe/lib-flexible) 用于设置 rem 基准值

下面我们分别将这两个工具配置到项目中完成 REM 适配。

一、使用 [lib-flexible](https://github.com/amfe/lib-flexible) 动态设置 REM 基准值(html 标签的字体大小)**

1、安装

npm i amfe-flexible

2、然后在 `main.js` 中加载执行该模块

import 'amfe-flexible'

最后测试:在浏览器中切换不同的手机设备尺寸,观察 html 标签 `font-size` 的变化。

 例如在 iPhone 6/7/8 (375x667)设备下,html 标签字体大小为 37.5 px

lib-flexible:把设备屏幕宽度分成10等分,则一等分的宽度为设备宽度的1/10

二、使用 postcss-pxtorempx 转为 rem

1、安装

npm install postcss-pxtorem -D

知识补充:

npm install -d 就是npm install --save-dev

npm insatll -s 就是npm install --save

我们在使用npm install安装模块或插件的时候,有两个命令都可以把依赖写入到package.json文件里面去,分别是:

npm install --save-dev depName

npm install --save depName

需要说明的是:Dependencies一词的中文意思是依赖和附属的意思,而dev则是develop(开发)的简写。

所以它们的区别在 package.json 文件里面体现出来的就是,使用 --save-dev 安装的插件,被写入到 devDependencies区块里面去,而使用--save 安装的插件,则是被写入到 dependencies 区块里面去。

那 package.json 文件里面的 devDependencies 和 dependencies 对象有什么区别呢?

devDependencies 里面的插件只用于开发环境,不用于生产环境,而 dependencies 是需要发布到生产环境的,所以dependencies下面的包不仅在开发阶段会用到,而且在运行阶段也要用到,不同于DevDependences,它下面的包只能用于开发环境。

比如我们写一个项目要依赖于jQuery,没有这个依赖,项目运行就会报错,那么,这时候就应该把jQuery这个依赖写入dependencies中去,再安装jQuery的时候,应该用npm install -save jquery。

而我们日常开发过程中,使用到的一些构建工具,比如glup、webpack,这些只是在开发过程中使用的依赖,项目上线运行的时候是不需要它们的,所以可以在安装的时候,将它们写入devDependencies,安装时候用的命令就应该是npm install -save-dev webpack来安装。

2、然后在项目根目录中创建 .postcssrc.js 文件

module.exports = {
  plugins: {
    'autoprefixer': {
      browsers: ['Android >= 4.0', 'iOS >= 8']
    },
    'postcss-pxtorem': {
      rootValue: 37.5,
      propList: ['*']
    }
  }
}

rootValue 应该如何设置呢?  

如果你使用的是基于 lib-flexable 的 REM 适配方案,则应该设置为你的设计稿的十分之一。
例如设计稿是 750 宽,则应该设置为 75。但是vant建设设置为37.5,为什么?因为vant是基于375写的
        所以必须设置为37.5,唯一的缺点是使用我们设计稿的尺寸必须是75
        有没有更好的解决办法:
                如果是vant的样式,就按照37.5来转换
                如果是我们自己的样式,就按照75来转换
        通过查询文档,我们发现rootValue支持两种类型:
                数字;固定的数值:rootValue: 37.5,
                函数:可以动态处理返回rootValue(){}
                    postcss-pxtorem处理每个css文件的时候都会调用这个函数
                    它会把被处理的css文件相关的信息(eg:文件路径(file属性)--字符串)通过参数传递给该函数

module.exports = {
	plugins: {
		//配置使用autoprefixer插件
		//作用:生成浏览器css样式规则前缀---生成在多版本浏览器都可兼容的css
		//vuecli内部已经配置了autoprefixer插件
		//所以又配置了一次,所以产生冲突了
	//   'autoprefixer': {
	// 	browsers: ['Android >= 4.0', 'iOS >= 8']
	//   },

	//配置使用postcss-pxtorem插件
	//作用:把px转化为rem
	  'postcss-pxtorem': {
		rootValue({file}){
			return file.indexOf('vant')==-1?75:37.5
		},
		//配置要转化的css的属性
		//*表示所有
		propList: ['*'],
		//配置不要转换的样式资源
		//exclude:'github-markdown'
		//排除不想生成rem的文件名,不要加后缀(.css)
	  }
}
}

3、配置完毕,重新启动服务

最后测试:刷新浏览器页面,审查元素的样式查看是否已将 px 转换为 rem

关于 .postcssrc.js 配置文件知识补充:

.postcssrc.js 是 PostCSS 的配置文件。

(1)PostCSS 介绍

PostCSS 是一个处理 CSS 的处理工具,本身功能比较单一,它主要负责解析 CSS 代码,再交由插件来进行处理,它的插件体系非常强大,所能进行的操作是多种多样的,例如:

目前 PostCSS 已经有 200 多个功能各异的插件。开发人员也可以根据项目的需要,开发出自己的 PostCSS 插件。

PostCSS 一般不单独使用,而是与已有的构建工具进行集成。

Vue CLI 默认集成了 PostCSS,并且默认开启了 autoprefixer 插件。

Vue CLI 内部使用了 PostCSS。

你可以通过 .postcssrc 或任何 postcss-load-config 支持的配置源来配置 PostCSS。也可以通过 vue.config.js 中的 css.loaderOptions.postcss 配置 postcss-loader

我们默认开启了 autoprefixer。如果要配置目标浏览器,可使用 package.jsonbrowserslist 字段。

(2)Autoprefixer 插件的配置

autoprefixer 是一个自动添加浏览器前缀的 PostCss 插件,browsers 用来配置兼容的浏览器版本信息,但是写在这里的话会引起编译器警告。

Replace Autoprefixer browsers option to Browserslist config.
Use browserslist key in package.json or .browserslistrc file.
​
Using browsers option can cause errors. Browserslist config
can be used for Babel, Autoprefixer, postcss-normalize and other tools.
​
If you really need to use option, rename it to overrideBrowserslist.
​
Learn more at:
https://github.com/browserslist/browserslist#readme
https://twitter.com/browserslist

警告意思就是说你应该将 browsers 选项写到 package.json.browserlistrc 文件中。

[Android]
>= 4.0
​
[iOS]
>= 8
​

具体语法请参考这里

(3)postcss-pxtorem 插件的配置

  • rootValue:表示根元素字体大小,它会根据根元素大小进行单位转换

  • propList 用来设定可以从 px 转为 rem 的属性

    • 例如 * 就是所有属性都要转换,width 就是仅转换 width 属性

猜你喜欢

转载自blog.csdn.net/m0_65812066/article/details/128569540