[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.pswp.cn/pingmian/77210.shtml
    繁體地址,請注明出處:http://hk.pswp.cn/pingmian/77210.shtml
    英文地址,請注明出處:http://en.pswp.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 是一個預定義的常量,表示零值。它的行為根據數據類…