[react]Next.js之自适应布局和高清屏幕适配解决方案

序言

阅读前首先了解即将要用到的两个包的作用

    1.postcss-pxtorem

    • 自动将 CSS 中的 px 单位转换为 rem 单位
    • 按照设计稿尺寸直接写 px 值,由插件自动计算 rem 值

    2.amfe-flexible

    • 动态设置根元素的 font-size(即 1rem 的值)
    • 根据设备屏幕宽度和 DPR 调整页面缩放比例
    • 解决 1px 边框问题 

    工作流程

    1.单独使用 postcss-pxtorem

    • CSS源码 → postcss-pxtorem转换 → 固定rem值的CSS → 浏览器渲染(无动态调整)

    2.单独使用 amfe-flexible

    • 浏览器加载 → amfe-flexible执行 → 动态计算html的font-size → 开发者手动用JS计算rem值 → 页面渲染

    3.搭配一起使用

    • 设计稿(1440px) → postcss-pxtorem(÷144) → CSS(rem) → 浏览器 → amfe-flexible动态计算 → 实际渲染 

    一:  css文件的px自动转rem

    1. 安装

    $ npm i postcss-pxtorem -D

    2. 配置文件

    // 修改根目录的postcss.config.mjs文件 ESM版
    // 如果你的文件是postcss.config.js(CJS版), 自行百度教程
    const config = {// 注意:你的项目是plugins: ["@tailwindcss/postcss"], 没关系可以改成下面的对象结构plugins: {"@tailwindcss/postcss": {}, // 新增 postcss-pxtorem"postcss-pxtorem": {rootValue: 144, // 设计稿宽度/10 [注意: 如果不搭配amfe-flexible使用, 那么填写16即可, 因为1rem = 16px]propList: ["*", "!font*", "!font-size"], // 忽略字体相关属性,字体不需要remexclude: /node_modules/i, // 排除 node_modules 文件minPixelValue: 2, // 小于 2px 不转换mediaQuery: false, // 不转换媒体查询中的 pxselectorBlackList: ["html"], // 黑名单,不转换的选择器 [注意: 如果不搭配amfe-flexible使用, 这行可以注释]},// 可选的 autoprefixer(推荐添加, 让项目兼容性更好, 记得安装包npm i autoprefixer -D)autoprefixer: {overrideBrowserslist: ["last 2 versions", "> 1%"],},},
    };export default config;
    

    二: 动态设置html的font-size

    现在百度存在最多的是lib-flexible的教程(已停止维护), 今天开始新项目就用amfe-flexible吧

    1. 安装

    $ npm i amfe-flexible -S

    2. 新建文件

    // 新建 AmfeFlexible.tsx , 与layout.tsx平级
    'use client';import { useEffect } from 'react';export default function AmfeFlexible() {useEffect(() => {if (typeof window !== 'undefined') {import('amfe-flexible');}}, []);return null;
    }
    // src目录下新建 @types\amfe-flexible\index.d.ts , 与app文件夹同级
    declare module 'amfe-flexible' {const flexible: {init: (options?: {designWidth?: number;designHeight?: number;maxWidth?: number;minWidth?: number;}) => void;};export default flexible;}

    3. 配置文件

    // 配置src/app下的 layout.tsx ,以下代码已精简, 新增内容已标注
    import { AntdRegistry } from "@ant-design/nextjs-registry";
    import zhCN from "antd/locale/zh_CN";
    import { ConfigProvider } from "antd";
    // 新增
    import AmfeFlexible from "./AmfeFlexible";export default function RootLayout({children,
    }: Readonly<{children: React.ReactNode;
    }>) {return (<html lang="zh"><head>//新增<metaname="viewport"content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no"/></head><body>//新增<AmfeFlexible /><ConfigProvider locale={zhCN}><AntdRegistry>{children}</AntdRegistry></ConfigProvider></body></html>);
    }
    

    题外话

    如果你web项目用tailwind, 那么上面的方案就行不通了, 目前我能想到的解决方案就是让ui设计的时候px尽量为@4的倍数.

    因为tailwind的默认间距是0.25, 0.25*4=1, 在tailwind项目中, 如标题高度是64px, 这时候除以4, 得到16, 那么h-16 就写好了, 这样方便我们进行换算(如果你有自动转换方法一定要留言告诉我!)

    可能会有人说用h-[64px]就好了, 但是不符合我适配多端的需求, 如果只有响应式的需求就用tailwind的sm, md, lg, xl, 2xl就好, ui出多尺寸设计图.

    本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/77210.shtml

    如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

    相关文章

    C# 如何比较两个List是否相等?

    简介 在 C# 里&#xff0c;比较两个 List 是否相等&#xff0c;需要考虑多个方面&#xff0c;例如列表中的元素顺序、元素本身是否相等。下面介绍几种常见的比较方法&#xff1a; 基本类型比较&#xff08;元素顺序必须一致&#xff09; var list1 new List<int> { 1…

    【技术派后端篇】Redis分布式锁:原理、实践与应用

    在当今的高并发系统中&#xff0c;分布式锁是保障数据一致性和系统稳定性的重要手段。今天&#xff0c;我们就来深入探讨一下Redis分布式锁&#xff0c;揭开它神秘的面纱。 1 本地锁与分布式锁的区别 在Java开发的早期阶段&#xff0c;我们接触过synchronized和Lock锁&#x…

    奥比中光tof相机开发学习笔记

    针对奥比中光 tof相机&#xff0c;官方提供的资料如下ProcessOn Mindmap|思维导图 Orbbec SDK Python Wrapper基于Orbbec SDK进行设计封装&#xff0c;主要实现数据流接收&#xff0c;设备指令控制。下面就其开发适配进行如下总结&#xff1a; &#xff08;1&#xff09;系统配…

    如何学习嵌入式

    写这个文章是用来学习的,记录一下我的学习过程。希望我能一直坚持下去,我只是一个小白,只是想好好学习,我知道这会很难&#xff0c;但我还是想去做&#xff01; 本文写于&#xff1a;2025.04.16 请各位前辈能否给我提点建议&#xff0c;或者学习路线指导一下 STM32单片机学习总…

    2025 年蓝桥杯 Java B 组真题解析分享

    今年是我第二次参加蓝桥杯软件类Java B组的比赛&#xff0c;虽然赛前做了不少准备&#xff0c;但真正坐在考场上时&#xff0c;还是有种熟悉又紧张的感觉。蓝桥杯的题目一向以“基础创新”著称&#xff0c;今年也不例外&#xff0c;每道题都考验着我们对算法的理解、代码实现能…

    Vue3服务器端渲染深度实践:架构、性能与全栈集成

    一、SSR架构设计模式 1.1 架构模式选择矩阵 维度CSRSSR混合渲染首次内容渲染(FCP)慢(依赖JS执行)快(HTML直出)按路由动态选择SEO支持需预渲染原生支持关键页预渲染服务端压力低(静态托管)高(实时渲染)使用缓存中间层TTI(可交互时间)受限于JS体积需等待Hydration渐进式激活适用…

    2025年泰迪杯数据挖掘竞赛B题论文首发+问题一二三四代码分享

    料 基于穿戴装备的身体活动监测 摘要 随着科技的进步&#xff0c;加速度计&#xff0c;能够实时、准确地捕捉人体的动态变化&#xff0c;成为医学应用中的一个重要工具。本文将基于题目收集数据进行相关研究。 针对题目给出的数据集&#xff0c;我们首先进行数据清洗工作。首…

    国内AI搜索平台与ChatGPT横向对比分析

    一、核心技术差异 1、‌百度文小言‌ 基于文心大模型4.0升级&#xff0c;主打“新搜索”能力&#xff0c;支持多模态输入&#xff08;语音、图片、视频&#xff09;和富媒体搜索结果‌。 独有的“记忆个性化”功能可结合用户历史行为优化回答&#xff0c;并在医疗、教育等垂直…

    安卓环境搭建开发工具下载Gradle下载

    1.安装jdk(使用java语言开发安卓app) 核心库 java.lang java.util java.sq; java.io 2.安装开发工具(IDE)android studio https://r3---sn-2x3elnel.gvt1-cn.com/edgedl/android/studio/install/2023.3.1.18/android-studio-2023.3.1.18-windows.exe下载完成后一步一步安装即…

    Python 趣味学习 -数据类型脱口秀速记公式 [特殊字符]

    &#x1f3a4; Python数据类型脱口秀速记公式 &#x1f40d; 1️⃣ 四大金刚登场 "Set叔(无序洁癖)、Tuple爷(顽固老头)、List姐(百变女王)、Dict哥(万能钥匙)"2️⃣ 特性对比RAP &#x1f3b6; 内存/作用域&#xff1a; 全局变量 → 函数内修改 → 可变(mutable)会…

    单片机 | 基于51单片机的倾角测量系统设计

    以下是一个基于51单片机的倾角测量系统设计详解,包含原理、公式和完整代码: 一、系统原理 核心器件:MPU6050(集成3轴加速度计+陀螺仪) 主控芯片:STC89C52RC(51单片机) 显示模块:LCD1602液晶 工作原理: 通过MPU6050采集XYZ三轴加速度数据,利用重力加速度分量计算俯仰…

    2025年4月16日华为留学生笔试第二题200分

    📌 点击直达笔试专栏 👉《大厂笔试突围》 💻 春秋招笔试突围在线OJ 👉 笔试突围OJ 02. 图书馆借阅管理系统 问题描述 卢小姐是一家大学图书馆的管理员,她需要开发一个简单的图书借阅管理系统来处理日常的图书流通操作。系统需要支持以下四种操作: in s:表示一本…

    Linux通用一键换源脚本.sh - ubuntu、centos全自动更换国内源 - LinuxMirrors神器

    效果 脚本 bash <(curl -sSL https://linuxmirrors.cn/main.sh) 来自 https://linuxmirrors.cn/ 截图 ending...

    【Unity】JSON数据的存取

    这段代码的结构是为了实现 数据的封装和管理&#xff0c;特别是在 Unity 中保存和加载玩家数据时。以下是对代码设计的逐步解释&#xff1a; 1. PlayerCoin 类 PlayerCoin 是一个简单的数据类&#xff0c;用于表示单个玩家的硬币信息。它包含以下字段&#xff1a; count&…

    python实现音视频下载器

    一、环境准备 确保当前系统已安装了wxPython 、 yt-dlp 和FFmpeg。当前主要支持下载youtube音视频 1、安装wxPython pip install wxPython2、安装yt-dp pip install wxPython yt-dlp3、安装FFmpeg 在Windows 10上通过命令行安装FFmpeg&#xff0c;最简便的方式是使用包管理…

    使用 vxe-table 来格式化任意的金额格式,支持导出与复制单元格格式到 excel

    使用 vxe-table 来格式化任意的金额格式&#xff0c;支持导出与复制单元格格式到 excel 查看官网&#xff1a;https://vxetable.cn gitbub&#xff1a;https://github.com/x-extends/vxe-table gitee&#xff1a;https://gitee.com/x-extends/vxe-table 安装 npm install vx…

    知识图谱 数据准备

    任何类型的数据格式都可以用于构建知识图谱&#xff0c;只要能够从中提取出实体&#xff08;Entities&#xff09;、关系&#xff08;Relationships&#xff09;和属性&#xff08;Attributes&#xff09;。但实际操作中&#xff0c;不同数据格式的处理难度、工具支持和效率差异…

    Docker 设置镜像源后仍无法拉取镜像问题排查

    #记录工作 Windows系统 在使用 Docker 的过程中&#xff0c;许多用户会碰到设置了国内镜像源后&#xff0c;依旧无法拉取镜像的情况。接下来&#xff0c;记录了操作要点以及问题排查方法&#xff0c;帮助我们顺利解决这类问题。 Microsoft Windows [Version 10.0.27823.1000…

    如何对Flutter应用程序进行单元测试

    Flutter单元测试完全指南&#xff1a;从基础到高级实践 面试求职资源 面试试题小程序&#xff1a;涵盖测试基础、Linux操作系统、MySQL数据库、Web功能测试、接口测试、APPium移动端测试、Python知识、Selenium自动化测试相关、性能测试、计算机网络知识、Jmeter、HR面试等内…

    go中我遇到的问题总结

    go问题总结 1 - go中的nil等于java中的null吗 在 Go 和 Java 中,nil 和 null 都用于表示“空值”,但它们的实现和使用方式有所不同。 以下是 Go 中的 nil 和 Java 中的 null 之间的对比: 1. Go 中的 nil 在 Go 中,nil 是一个预定义的常量,表示零值。它的行为根据数据类…