react移动端适配

2023-10-30

一、自定义方法配置

1.使用JavaScript动态设置根元素的字体大小: 为了实现响应式的自适应效果,可以结合JavaScript根据屏幕大小动态设置根元素的字体大小。可以使用window.innerWidth获取窗口的宽度,然后根据需要的适配方案计算并设置根元素的字体大小。可在index.html中添加中:

function setRootFontSize() {
  var screenWidth = window.innerWidth;
  // 根据屏幕宽度计算并设置根元素的字体大小
  var rootFontSize = screenWidth / 100; // 例如,每100个像素为1rem,可以根据需要进行调整
  document.documentElement.style.fontSize = rootFontSize + 'px';
}
​
// 在窗口大小改变时调用设置根元素字体大小的函数
window.addEventListener('resize', setRootFontSize);
​
// 页面加载完成后初始化设置根元素字体大小
window.addEventListener('DOMContentLoaded', setRootFontSize);

2.创建rem.js文件,在函数内部,设置了一个基准大小baseSize,表示在375px设计图下使用的默认字体大小。这个值可以根据实际需求进行调整

获取当前窗口的宽度和高度,并进行相应的计算,以适应不同的屏幕尺寸。在非正常屏幕尺寸下,根据宽度与375的比例重新计算屏幕宽度

最后,根据计算得到的窗口宽度和基准比例,计算出对应的rem值,并将其应用于根元素的字体大小,即修改document.documentElement.style.fontSize的值

// 设置 rem 函数
function setRem () {
  //  PC端
  console.log('非移动设备')
  // 基准大小
  baseSize = 16;
  let baseApp = baseSize / 750; // 表示750的设计图,使用100PX的默认值
  let windowWidth = window.innerWidth; // 当前窗口的宽度
  let windowHeight = window.innerHeight; // 当前窗口的高度
​
  // 非正常屏幕下的尺寸换算
  let dueH = windowWidth / 375
  
  if (windowHeight < dueH) { // 当前屏幕高度小于应有的屏幕高度,就需要根据当前屏幕高度重新计算屏幕宽度
    windowWidth = windowHeight /667
  }
​
  let rem = windowWidth * baseApp; // 以默认比例值乘以当前窗口宽度,得到该宽度下的相应font-size值
  document.documentElement.style.fontSize =  rem + "px";//利用DOM去修改值
}
​
// 页面加载完成后初始化设置根元素字体大小、初始化
window.addEventListener('DOMContentLoaded', setRem);
​
// 在窗口大小改变时调用设置根元素字体大小的函数
window.addEventListener('resize', setRem);

二、使用lib-flexible postcss-pxtorem插件

1.安包

npm
npm install lib-flexible postcss-pxtorem

yarn
yarn add lib-flexible postcss-pxtorem

针对react-create-app创建的项目,webpeck默认隐藏,有两种方式引入插件:

方式一:解包,在webpack中修改

1. 解包

yarn eject
npm run eject
解包完成后,进入 config 文件夹,打开 config/webpack.config.js,搜索 postcss-loader
替换 options : {} 对象

rootValue:设计图尺寸修改

options: {
          postcssOptions: {
            // Necessary for external CSS imports to work
            // https://github.com/facebook/create-react-app/issues/2677
            ident: "postcss",
            config: false,
            plugins: !useTailwind
              ? [
                  "postcss-flexbugs-fixes",
                  [
                    "postcss-preset-env",
                    {
                      autoprefixer: {
                        flexbox: "no-2009",
                      },
                      stage: 3,
                    },
                  ],
                  [
                    "postcss-pxtorem",
                    {
                      rootValue: 75, //设计图最大宽度除以10  //比如750的宽就写成75  我这边是1125的宽
                      selectorBlackList: [],
                      propList: ["*"],
                      exclude: /node_modules/i,
                    },
                  ],
                  // Adds PostCSS Normalize as the reset css with default options,
                  // so that it honors browserslist config in package.json
                  // which in turn let's users customize the target behavior as per their needs.
                  "postcss-normalize",
                ]
              : [
                  "tailwindcss",
                  "postcss-flexbugs-fixes",
                  [
                    "postcss-preset-env",
                    {
                      autoprefixer: {
                        flexbox: "no-2009",
                      },
                      stage: 3,
                    },
                  ],
                  [
                    "postcss-pxtorem",
                    {
                      rootValue: 75, //设计图最大宽度除以10  //比如750的宽就写成75  我这边是1125的宽
                      selectorBlackList: [],
                      propList: ["*"],
                      exclude: /node_modules/i,
                    },
                  ],
                ],
          },
          sourceMap: isEnvProduction ? shouldUseSourceMap : isEnvDevelopment,
        },

 2.引入flexible

在index.js中引入,引入完成重新启动项目即可见效果

import 'lib-flexible'

方式二:配置craco, @craco/craco: 使项目不需要 eject暴露配置就可以修改webpack配置

ps: 根据设计稿大小尺寸来修改rootValue的值即可 

const CracoLessPlugin = require('craco-less');
 
module.exports = {
    // 配置less,让工程可以编译less
    plugins: [
        {
            plugin: CracoLessPlugin,
            options: {
                lessLoaderOptions: {
                    lessOptions: {
                        javascriptEnabled: true,
                    },
                },
            },
        },
    ],
   // 配置rem适配
    style: {
        postcss: {
            mode: 'extends',
            loaderOptions: {
                postcssOptions: {
                    ident: 'postcss',
                    plugins: [
                        [
                            'postcss-pxtorem',
                            {
                                rootValue: 375/10, // 根元素字体大小
                                // propList: ['width', 'height']
                                propList: ['*']
                            },
                        ],
                    ],
                },
            },
        },
    },
};

在index.js顶部引入 lib-flexible,下图是index.js的全部代码,重启项目后即可生效

import React from 'react';
import ReactDOM from 'react-dom';
import 'lib-flexible'
import App from './App';
 
 
ReactDOM.render(
        <App />,
  document.getElementById('root')

)

ps:less 样式文件中还是按照px写的,到页面上会自动适配转为rem

.demo {
  color: white;
  background-color: black;
  width: 375px;
  height: 50px;
  margin: 0 auto;
  margin-top: 15px;
  text-align: center;
}
import React, {Component} from 'react';
import './login.less'
 
class Login extends Component {
    render() {
        return (
            <div className={"demo"}>
            </div>
        );
    }
}
 
export default Login;

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

react移动端适配 的相关文章

随机推荐

  • Qt学习笔记

    1 Qt 音同 cute 是一个跨平台的 C 开发库 主要用来开发图形用户界面 Graphical User Interface GUI 程序 当然也可以开发不带界面的命令行 Command User Interface CUI 程序 2
  • Ubuntu 16.04出现:Problem executing scripts APT::Update

    Ubuntu 16 04出现 Problem executing scripts APT Update Post Invoke Success if usr bin test w var cache app info a e usr bin
  • unity按钮实现人物变大效果

    unity按钮实现人物变大效果 游戏里面模型变大效果的实现 如下动态图所示 点我下载 https download csdn net download weixin 43474701 71975042
  • java 通过pdf模板,生成PDF,并下载到本地

    注意 本例子是从向模板定义的变量赋值 而不是从无到有的来生成pdf 直接就能用 maven依赖
  • 精通MySQL之架构篇

    今天给大家分享的是大数据开发基础部分MySQL的第一篇 老刘讲点和别人不一样的内容 众多伙伴都知道MySQL的基础知识以及使用 但是对里面的原理知道的不多 咱们学知识只看表面绝对是不行的 所以老刘争取把MySQL的架构知识给大家讲明白 My
  • Shell编程之echo命令

    Shell 的 echo 指令与 PHP 的 echo 指令类似 都是用于字符串的输出 命令格式 echo string 您可以使用echo实现更复杂的输出格式控制 1 显示普通字符串 echo It is a test 这里的双引号完全可
  • Vue3 (computed函数,watch函数,watchEffect函数)

    1 computed函数 与vue2中computed配置功能一致 变化 需要引入 组合式的API
  • 树莓派第一讲:入门那些事(系统烧录、外设连接)

    目录 基本了解 系统烧录 连接外设 基本了解 树莓派4B是一款单板计算机 采用ARM架构处理器 配备4GB内存 Gigabit以太网口 多个USB接口 HDMI输出接口等 它具备1 5Ghz运行的64位四核处理器 最高支持以60fps速度刷
  • 因果推断 - 基础知识

    目录 因果关系之梯 因果图的路径结构 阻断 d 分离 混杂 结构因果模型 SCM 版权 转载前请联系作者获得授权 声明 部分内容出自因果关系之梯 已获得原作者授权 参考书籍 The Book of Why Judea Pearl 因果关系之
  • 什么是回调函数Callback----自己的一点理解

    何为回调函数 若把函数的指针作为函数参数传递给一个函数 当这个指着被用来调用它所指向的函数时 我们将该指针所指向的函数称为回调函数 回调函数与普通函数最大区别在于函数的调用 对普通函数而言 函数实现者可以直接拿来用 可以直接将它放在main
  • 金山逍遥网 sersync 服务器实时镜像同步方案

    金山逍遥网 sersync 服务器实时镜像同步方案 1 sersync rsync原理 2 inotify和sersync同步的区别 3 配置sersync rsync实现实时同步 2台centos7 4 一台装sersync一台装rsyn
  • 『网络安全』蜜罐到蜜网入门指南(三)蜜罐内部组成分析

    原创不易 点个赞呗 如果喜欢 关注 收藏不迷路 前言 大家好 网络安全 蜜罐到蜜网入门指南 进入第三篇 通过前面的内容 我们知道了什么是蜜罐以及蜜罐的作用和分类等 点击下方链接 可快速查看 相关文章 网络安全 蜜罐到蜜网入门指南 一 蜜罐初
  • php执行命令的函数和方法

    PHP提供4个专门的执行外部命令的函数 exec system passthru shell exec 1 exec 原型 string exec string command array output int return var 说明
  • Win10+Ubuntu双系统 使用EasyUEFI修复Ubuntu引导启动项

    某同事安装了Win10 Ubuntu双系统 有一天电脑突然坏了开不了机 把硬盘拆下放到别的机器上 发现是直接进入Win10系统 而不是grub选择界面 进F12也找不到ubuntu的启动项 最开始我先使用 Win10 Ubuntu双系统修复
  • 在项目中添加天气预报功能

    查看当地的天气情况 调用七日的天气预报情况 天气预报 注册账号获取appid和APPSecret使用 https www tianqiapi com api 图标可以直接在网站上下载
  • CoreDNS 惊现诡异 bug,导致服务大面积中断

    Sealos 公众号已接入了 GPT 4 完全免费 欢迎前来调戏 原文链接 https juejin cn post 7277471908417110053 我是 LEE 老李 一个在 IT 行业摸爬滚打 17 年的技术老兵 事件背景 某天
  • Flutter开发(十二)—— 页面跳转与返回

    示例代码 以下代码展示页面跳转与返回 抛开所有复杂因素 只展示最简单的跳转 第一个页面 点击按钮时onPressed 进行相应 通过 Navigator push 和 MaterialPageRoute 进行页面跳转功能实现 第二个页面 点
  • python中百分数如何表达_Python转换百分数表示法

    YAML中任何以百分号结尾的数字序列都将 通常作为字符串标量加载 因为 不会 标量匹配任何其他模式 尤其是不匹配整数的模式 或浮动 当然 您可以递归地遍历数据结构 从YAML和patch加载 但是如果在 数据结构 用于构造特定对象 递归到这
  • passwd: Authentication token manipulation error----linux

    author skatetime 2009 04 11 更改centos4 7 linux的root密码 报 passwd Authentication token manipulation error 如下所示 root ticket A
  • react移动端适配

    一 自定义方法配置 1 使用JavaScript动态设置根元素的字体大小 为了实现响应式的自适应效果 可以结合JavaScript根据屏幕大小动态设置根元素的字体大小 可以使用window innerWidth获取窗口的宽度 然后根据需要的