news 2026/7/6 23:18:40

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

作者头像

张小明

前端开发工程师

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/7/5 22:45:43

创新视角重构B站视频下载:DownKyi超高清配置深度解析

创新视角重构B站视频下载&#xff1a;DownKyi超高清配置深度解析 【免费下载链接】downkyi 哔哩下载姬downkyi&#xff0c;哔哩哔哩网站视频下载工具&#xff0c;支持批量下载&#xff0c;支持8K、HDR、杜比视界&#xff0c;提供工具箱&#xff08;音视频提取、去水印等&#x…

作者头像 李华
网站建设 2026/7/5 6:28:16

VisualCppRedist AIO:一站式解决Windows运行库依赖的终极利器

VisualCppRedist AIO&#xff1a;一站式解决Windows运行库依赖的终极利器 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 还在为各种软件启动失败而烦恼吗&#…

作者头像 李华
网站建设 2026/7/6 4:47:50

PyJWT终极指南:5步掌握Python JWT认证实现

PyJWT终极指南&#xff1a;5步掌握Python JWT认证实现 【免费下载链接】pyjwt JSON Web Token implementation in Python 项目地址: https://gitcode.com/gh_mirrors/py/pyjwt PyJWT是Python中功能最完整的JSON Web Token实现库&#xff0c;为开发者提供符合RFC 7519标准…

作者头像 李华
网站建设 2026/7/5 6:21:39

本地部署也能远程用!EasyVoice+cpolar 让文本转语音不受限

文章目录前言1. 环境准备2. Docker部署与运行3. 简单使用测试4. 安装内网穿透4.1 开启ssh连接安装cpolar4.2 创建公网地址5. 配置固定公网地址总结**通过 EasyVoice 本地部署实现文本转语音的便捷功能&#xff0c;再结合 cpolar 突破局域网限制&#xff0c;让私域有声平台的使用…

作者头像 李华
网站建设 2026/7/5 21:53:28

Lumafly模组管理器:重新定义空洞骑士游戏体验的10大理由

Lumafly模组管理器&#xff1a;重新定义空洞骑士游戏体验的10大理由 【免费下载链接】Lumafly A cross platform mod manager for Hollow Knight written in Avalonia. 项目地址: https://gitcode.com/gh_mirrors/lu/Lumafly 作为一名《空洞骑士》的忠实玩家&#xff0…

作者头像 李华
网站建设 2026/7/6 11:35:37

YashanDB数据库的扩展性设计与实现细节

YashanDB 是一种面向高性能和高可用性的数据库设计&#xff0c;其扩展性设计与实现细节通常包括以下几个方面&#xff1a;1. 分布式架构- 水平扩展&#xff1a;YashanDB 采用分布式架构&#xff0c;支持通过增加更多的节点来水平扩展。用户可以根据负载增加更多的服务器来处理请…

作者头像 李华