leiwuhen-67's blog leiwuhen-67's blog
首页
    • 《Vue》笔记
    • 《React》笔记
    • 《NodeJs》笔记
    • 《CSS》笔记
    • 《Redis》笔记
    • 基础入门
    • 《Mock》笔记
    • 《MySQL》笔记
    • 《Git》相关
影音视听
收藏
关于
GitHub (opens new window)

我的公众号

首页
    • 《Vue》笔记
    • 《React》笔记
    • 《NodeJs》笔记
    • 《CSS》笔记
    • 《Redis》笔记
    • 基础入门
    • 《Mock》笔记
    • 《MySQL》笔记
    • 《Git》相关
影音视听
收藏
关于
GitHub (opens new window)
  • React

    • 使用React脚手架快速搭建项目
    • hooks之useEffect
    • React之事件绑定及简写方式
    • React之props传值并对其进行限制
    • React之Refs的基本使用
    • React之生命周期钩子
    • React之key的使用
    • React之代理服务器配置
    • React之封装全局Loading组件
    • React之消息的发布-订阅(pubsub-js)
    • React之Redux的基本使用
    • React之react-redux的基本使用
    • React之redux的数据持久化存储
    • React之路由懒加载
    • React之Render Props的使用
    • React之createBrowserRouter
    • React之路径别名@配置
    • React之craco打包优化配置
    • React之项目国际化
    • React之postcss-pxtorem移动端适配
    • React之使用vite创建项目
    • React之ts类型标注汇总
    • React之使用 ant design搭建后台管理之踩坑
    • React之路由切换动画
    • React之使用vite创建组件库并发布到npm
    • React之项目打包部署到nginx
    • React之自定义组件添加className与style
  • React Native

  • 《React》笔记
  • React
心欲无痕
2024-05-21

React之postcss-pxtorem移动端适配

在项目中经常会遇到需要适配移动端的情况,而适配移动端有许多解决方案,如百分比、em、rem、vw、弹性布局等等,这里介绍的是使用 rem 方案,rem 是一个相对单位,相对的是 html 根元素 font-size 的大小。简单来说就是我们给 html 根元素设置一个 font-size,这个值是多少,那就相当于 1rem 等于多少。这就涉及到频繁的换算,将设计稿的 px 转换成 rem,那么如何实现自动转换呢?就是我们直接按设计稿来写,然后会自动将之转换为 rem,无需手动去计算。答案当然是有的,这里使用了插件 postcss-pxtorem

1、安装 postcss-pxtorem

npm install postcss-pxtorem --save-dev
1

2、在 craco.config.js 配置文件中添加如下配置:

module.exports = {
	......
    style: {
        postcss: {
            mode: 'extends',
            loaderOptions: {
                postcssOptions: {
                    ident: 'postcss',
                    plugins: [
                        require('postcss-pxtorem')({
                        	/*
                        		设置html根元素font-size的大小,
                        		通常设置为设计稿宽度/10(设计稿尺寸通常为375或750)
                        	 */
                            rootValue: 16, 
                            unitPrecision: 5, // 转换后的小数保留位数
                            replace: true, // 是否替换,默认为true
                            propList: ['*'], // 需要转换的属性,这里选择转换所有属性
                            selectorBlackList: ['.ignore'], // 忽略转换的选择器
                            exclude: /node_modules/i, // 排除node_modules文件夹下的文件
                            mediaQuery: false, // 是否转换媒体查询中的px
                            minPixelValue: 2, // 大于或等于2px的才转换
                        }),
                    ],
                },
            },
        },
    },
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29

由于更改了配置文件,所以需要重启项目,现在我们在项目中写的样式文件中的 px(.ignore 选择器除外)会自动转换为 rem 单位,还没完,这里因为我们写死了 html 根元素 font-size 的大小,所以不管在什么尺寸的设备上,元素的大小都是一样的,无法做到移动端适配,因此我们需要想办法来动态设置 HTML 元素 font-size 的大小来达到目的。

3、在 src 文件夹下建立 utils 目录,该目录下建立 rem.js 文件,代码如下

// 基准大小,一定要跟上面craco.config.js中rootValue值保持一样
const baseSize = 16
// 设置 rem 函数
function setRem () {
    // 当前页面宽度相对于 375 宽的缩放比例,可根据自己需要修改,设计稿是多少就是多少。
    const scale = document.documentElement.clientWidth / 375
    // 设置页面根节点字体大小
    document.documentElement.style.fontSize = (baseSize * Math.min(scale, 2)) + 'px'
}
// 初始化
setRem()
// 改变窗口大小时重新设置 rem
window.onresize = function () {
    setRem()
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

4、在项目入口文件 index.js 或 index.tsx 中引入 rem 文件

import "./utils/rem"
1

至此,相关配置均已完成,重启项目,就可以愉快地玩耍了

编辑 (opens new window)
上次更新: 7/1/2024, 4:56:33 PM
React之项目国际化
React之使用vite创建项目

← React之项目国际化 React之使用vite创建项目→

Theme by Vdoing
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式