news 2026/1/26 21:52:30

前端自适应布局之等比例缩放

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
前端自适应布局之等比例缩放

问题描述:
有个插件Postcss-pxtorem能自动转换px做适配,但是某些插件不能转换,例如antd。
设计图只有一套1920*1080.要做到尽量1比1还原,又能适配大小屏幕,如果一个个转百分比会非常麻烦。
这时就可以选择用等比例缩放实现自适应布局。
运行环境:react+umi(其他也可用,原理一样)
1.根据设计图1比1写px。
2.在layout写

import React, { useEffect, useRef, useState } from 'react'; import { Outlet } from '@umijs/max'; import styles from './ScaleLayout.less'; import { LayoutProvider } from './context'; const ScaleLayout: React.FC = () => { const [bg, setBgState] = useState(''); const scaleRootRef = useRef<HTMLDivElement>(null); useEffect(() => { const setScale = () => { const scaleX = window.innerWidth / 1920; const scaleY = window.innerHeight / 1080; // Use Math.min to fit the screen while maintaining aspect ratio (letterboxing) const scale = Math.min(scaleX, scaleY); console.log('scale', scale); if (scaleRootRef.current) { scaleRootRef.current.style.transform = `scale(${scale})`; } }; // Initial scale setScale(); // Add event listener window.addEventListener('resize', setScale); // Cleanup return () => window.removeEventListener('resize', setScale); }, []); return ( <LayoutProvider value={{ setBg: setBgState }}> <div className={styles.viewport}> <div className={styles.pageBg} style={{ backgroundImage: bg ? `url(${bg})` : 'none' }} /> <div className={styles.scaleRoot} ref={scaleRootRef}> <Outlet /> </div> </div> </LayoutProvider> ); }; export default ScaleLayout;

layout样式:

.viewport { width: 100vw; height: 100vh; background: #050b16; // Match the app's dark theme overflow: hidden; display: flex; justify-content: center; align-items: center; } /* 页面背景层(不参与缩放) */ .pageBg { position: absolute; inset: 0; background-size: cover; background-position: center; z-index: 0; } .scaleRoot { width: 1920px; height: 1080px; transform-origin: center center; flex-shrink: 0; overflow: hidden; }

背景有黑边?把背景提到缩放盒子外边。这样就能实现内容的1比1,又不会太难看。
context.tsx

import React, { createContext, useContext, useState } from 'react'; interface LayoutContextType { setBg: (bg: string) => void; } const LayoutContext = createContext<LayoutContextType | undefined>(undefined); export const useLayout = () => { const context = useContext(LayoutContext); if (!context) { throw new Error('useLayout must be used within a LayoutProvider'); } return context; }; export const LayoutProvider: React.FC<{ children: React.ReactNode; value: LayoutContextType }> = ({ children, value }) => { return <LayoutContext.Provider value={value}>{children}</LayoutContext.Provider>; };

页面设置背景

import { useLayout } from '@/layouts/context'; import bg from '@/assets/imgs/training/zice/learn_sel_bg.png' const { setBg } = useLayout(); useEffect(() => { setBg(bg); return () => setBg(''); }, []);
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/1/14 15:25:47

创新内容访问工具:突破付费限制的智能解决方案

创新内容访问工具&#xff1a;突破付费限制的智能解决方案 【免费下载链接】bypass-paywalls-chrome-clean 项目地址: https://gitcode.com/GitHub_Trending/by/bypass-paywalls-chrome-clean 在当今数字化时代&#xff0c;优质内容的获取已成为人们日常工作和学习的重…

作者头像 李华
网站建设 2026/1/22 3:04:02

LobeChat上下文长度管理技巧:提升长对话质量

LobeChat上下文长度管理技巧&#xff1a;提升长对话质量 在如今的大语言模型应用中&#xff0c;一个看似简单却极其关键的问题正在困扰开发者和用户——为什么聊着聊着&#xff0c;AI 就“忘了”之前说过什么&#xff1f; 无论是写代码时突然偏离了最初的设计架构&#xff0c;还…

作者头像 李华
网站建设 2026/1/20 0:42:30

DownKyi实战宝典:5大核心技巧让B站视频下载效率翻倍

DownKyi实战宝典&#xff1a;5大核心技巧让B站视频下载效率翻倍 【免费下载链接】downkyi 哔哩下载姬downkyi&#xff0c;哔哩哔哩网站视频下载工具&#xff0c;支持批量下载&#xff0c;支持8K、HDR、杜比视界&#xff0c;提供工具箱&#xff08;音视频提取、去水印等&#xf…

作者头像 李华
网站建设 2026/1/23 10:15:14

时序数据库选型指南:用工程视角理解 Apache IoTDB

摘要&#xff1a;在工业物联网&#xff08;IIoT&#xff09;数据爆发式增长的今天&#xff0c;通用数据库已难以应对海量测点的高频写入与复杂聚合查询。本文将从工程落地的角度出发&#xff0c;探讨时序数据库&#xff08;TSDB&#xff09;的选型关键维度&#xff0c;并深入解…

作者头像 李华
网站建设 2026/1/18 13:29:52

LaTeX2Word公式转换3大技巧:从复制到粘贴的极致效率革命

LaTeX2Word公式转换3大技巧&#xff1a;从复制到粘贴的极致效率革命 【免费下载链接】LaTeX2Word-Equation Copy LaTeX Equations as Word Equations, a Chrome Extension 项目地址: https://gitcode.com/gh_mirrors/la/LaTeX2Word-Equation 还在为学术论文中LaTeX公式与…

作者头像 李华
网站建设 2026/1/26 4:22:20

Nfs网络文件系统

文章目录 Nfs应用场景NFS实现的原理NFS配置文件NFS使用选项参数NFS存储数据的优缺点NFS实验实验要求实验环境实验步骤服务端&#xff1a;安装NFS服务并修改配置文件创建用户并授权启动服务 客户端安装nfs工具并启动本地挂载点目录文件创建对应用户查看远端的NFS共享目录是否存在…

作者头像 李华