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

打印 上一主题 下一主题

主题 1522|帖子 1522|积分 4566

序言

阅读前首先了解即将要用到的两个包的作用
    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. 设置文件

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

二: 动态设置html的font-size

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

1. 安装

   $ npm i amfe-flexible -S
  2. 新建文件

  1. // 新建 AmfeFlexible.tsx , 与layout.tsx平级
  2. 'use client';
  3. import { useEffect } from 'react';
  4. export default function AmfeFlexible() {
  5.   useEffect(() => {
  6.     if (typeof window !== 'undefined') {
  7.       import('amfe-flexible');
  8.     }
  9.   }, []);
  10.   return null;
  11. }
复制代码
  1. // src目录下新建 @types\amfe-flexible\index.d.ts , 与app文件夹同级
  2. declare module 'amfe-flexible' {
  3.     const flexible: {
  4.       init: (options?: {
  5.         designWidth?: number;
  6.         designHeight?: number;
  7.         maxWidth?: number;
  8.         minWidth?: number;
  9.       }) => void;
  10.     };
  11.     export default flexible;
  12.   }
复制代码
3. 设置文件

  1. // 配置src/app下的 layout.tsx ,以下代码已精简, 新增内容已标注
  2. import { AntdRegistry } from "@ant-design/nextjs-registry";
  3. import zhCN from "antd/locale/zh_CN";
  4. import { ConfigProvider } from "antd";
  5. // 新增
  6. import AmfeFlexible from "./AmfeFlexible";
  7. export default function RootLayout({
  8.   children,
  9. }: Readonly<{
  10.   children: React.ReactNode;
  11. }>) {
  12.   return (
  13.     <html lang="zh">
  14.       <head>
  15.         //新增
  16.         <meta
  17.           name="viewport"
  18.           content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no"
  19.         />
  20.       </head>
  21.       <body>
  22.         //新增
  23.         <AmfeFlexible />
  24.         <ConfigProvider locale={zhCN}>
  25.           <AntdRegistry>{children}</AntdRegistry>
  26.         </ConfigProvider>
  27.       </body>
  28.     </html>
  29.   );
  30. }
复制代码

题外话

假如你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出多尺寸计划图.


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

慢吞云雾缓吐愁

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表