react ant-design通用頁面自適應適配不同分辨率屏幕的方法工具類

該方法會根據?目標分辨率(options.width/height)?和?當前窗口尺寸(innerWidth/innerHeight)?計算縮放比例,并保持?等比例縮放Math.min(scaleX, scaleY)),確保內容不變形:

/*** 防抖函數* @param {Function} fn - 需要防抖的函數* @param {number} delay - 延遲時間(ms)* @returns {Function} 防抖后的函數*/
function debounce(fn, delay) {let timer = null;return function (...args) {if (timer) clearTimeout(timer);timer = setTimeout(() => {fn.apply(this, args);}, delay);};
}/*** 帶滾動條支持的自適應縮放* @param {string|HTMLElement} target - 目標元素* @param {Object} config - 配置項* @param {number} config.designWidth - 設計稿寬度(如1920)* @param {number} config.designHeight - 設計稿總高度(如1080)* @param {number} [config.topOffset=60] - 頂部固定高度(如導航欄)* @param {boolean} [config.scrollable=true] - 是否啟用垂直滾動*/
export function scrollableAutoScale(target, config) {const el = typeof target === 'string' ? document.querySelector(target) : target;if (!el) return () => { };const {designWidth = 1920,designHeight = 1080,topOffset1 = 0,topOffset2 = 0,scrollable = true} = config;// 1. 設備像素比檢測和優化const dpr = window.devicePixelRatio || 1;const isRetina = dpr >= 1.5;const scalePrecision = isRetina ? 1000 : 400; // 視網膜屏使用更高精度// 2. 高清渲染樣式優化Object.assign(el.style, {willChange: 'transform',backfaceVisibility: 'hidden',transformStyle: 'preserve-3d',textRendering: isRetina ? 'geometricPrecision' : 'optimizeLegibility',WebkitFontSmoothing: isRetina ? 'subpixel-antialiased' : 'antialiased',imageRendering: isRetina ? 'crisp-edges' : 'auto'});// 3. 創建外層容器(添加過渡效果、增加視網膜屏優化)const container = document.createElement('div');Object.assign(container.style, {position: 'fixed',top: `${topOffset2}px`,left: '0',width: '100vw',height: `calc(100vh - ${topOffset1 + topOffset2}px)`,overflow: 'hidden', // 默認隱藏,后面動態調整margin: '0',padding: '0',zIndex: '1',// 背景圖優化backgroundImage: getComputedStyle(el).backgroundImage,backgroundPosition: getComputedStyle(el).backgroundPosition,backgroundRepeat: getComputedStyle(el).backgroundRepeat,backgroundSize: getComputedStyle(el).backgroundSize,imageRendering: isRetina ? 'crisp-edges' : 'auto',// 平滑過渡 滾動條出現/消失transition: 'overflow 0.2s ease-out'});el.style.backgroundImage = 'none';el.parentNode.insertBefore(container, el);container.appendChild(el);// 4. 目標元素樣式(使用3D變換)Object.assign(el.style, {position: 'absolute',transformOrigin: 'top left',width: `${designWidth}px`,left: '0',right: '0',transformStyle: 'preserve-3d'});// 5. 增強版縮放計算let lastScale = 0;const calculate = () => {const viewportWidth = container.clientWidth;const viewportHeight = container.clientHeight;// 高精度縮放計算const rawScale = viewportWidth / designWidth;const scale = Math.round(rawScale * scalePrecision) / scalePrecision;const contentHeight = designHeight * scale;// 動態閾值(視網膜屏使用更敏感的閾值)const scaleThreshold = isRetina ? 0.001 : 0.0025;if (Math.abs(scale - lastScale) > scaleThreshold) {// 使用scale3d提升渲染質量el.style.transform = `scale3d(${scale}, ${scale}, 1)`;// 垂直居中優化if (!scrollable) {el.style.transform = `scale3d(${scale}, ${scale}, 1) translate3d(0, ${(viewportHeight - contentHeight) / 2}px, 0)`;}lastScale = scale;}// 滾動條緩沖(視網膜屏增加緩沖)const scrollBuffer = isRetina ? 5 : 2;container.style.overflowY = scrollable && (contentHeight > viewportHeight + scrollBuffer)? 'auto': 'hidden';};// 6. 高性能監聽(雙RAF防抖)使用requestAnimationFrame優化監聽頻率,避免高頻觸發計算導致性能問題。let rafId = null;const optimizedCalculate = () => {if (rafId) cancelAnimationFrame(rafId);rafId = requestAnimationFrame(() => {calculate();rafId = requestAnimationFrame(() => {calculate(); // 雙RAF確保布局穩定rafId = null;});});};const observer = new ResizeObserver(debounce(optimizedCalculate, isRetina ? 30 : 50));observer.observe(container);// 7. 三重初始化保障requestAnimationFrame(() => {calculate();setTimeout(() => {requestAnimationFrame(calculate);}, 200);});return () => {observer.disconnect();if (rafId) cancelAnimationFrame(rafId);container.parentNode?.insertBefore(el, container);container.parentNode?.removeChild(container);};
}

react頁面中的調用:

import React, { useEffect, useRef } from 'react';
import { optimizedAutoScale } from '../utils/optimizedAutoScale';const Index = () => {const containerRef = useRef(null);useEffect(() => {if (!containerRef.current) return;const destroy = scrollableAutoScale(containerRef.current, {designWidth: 1920,minHeight: 1080, // 設計稿總高度topOffset1: 53, // 動態獲取頂部高度topOffset2: 42, // 動態獲取頂部高度scrollable: true,    // 允許滾動});return () => {destroy();};}, []);return (<div ref={containerRef}>{/* 動態內容區域,高度會自動計算 */}</div>);
};export default Index;

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/86820.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/86820.shtml
英文地址,請注明出處:http://en.pswp.cn/web/86820.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

基于IEC61499實現的工業機器視覺方案

1.什么是機器視覺 機器視覺就是賦予機器看懂圖像的能力。它是一門涉及人工智能、計算機科學、圖像處理、光學、機械工程和自動化的交叉技術領域。核心目標是&#xff1a;通過攝像頭或其他成像設備獲取圖像或視頻&#xff0c;然后利用計算機算法對這些圖像進行分析和理解&#x…

機電一體化論文寫作實戰指南:從創新設計到工程驗證的完整路徑

機電論文的“技術-表達”鴻溝 某高校團隊研發的智能抓取系統實物表現優異&#xff0c;卻被審稿人質疑&#xff1a; “未說明機電耦合設計對性能的影響”——這揭示了機電一體化研究的核心痛點&#xff1a;強工程弱理論。本文基于217篇高影響力論文&#xff0c;拆解從技術到寫作…

MySQL 配置參數調優:根據工作負載調整服務器設置

MySQL 數據庫的默認配置參數是為了適應各種通用場景而設定的,它們通常無法最大化發揮服務器硬件的潛力,也無法完全匹配特定應用程序的工作負載。一個未優化的 MySQL 配置,在面對高并發、大數據量或特定查詢模式時,很容易成為系統性能的瓶頸。 配置參數調優,就是根據你的服…

嵌入式Linux驅動開發基礎-2 LED驅動

imx6ull中GPIO涉及寄存器 1&#xff1a;CCM寄存器 GPIOx 要用 CCM_CCGRy 寄存器中的 2 位來決定該組 GPIO 是否使能。哪組 GPIO 用哪個 CCM_CCGR 寄存器來設置。 CCM_CCGR 寄存器中某 2 位的取值含義如下&#xff1a; 00 &#xff1a;該 GPIO 模塊全程被關閉 01 &…

深度解析】使用Go語言實現JWT:從原理到實踐

JWT&#xff08;JSON Web Token&#xff09;已成為現代Web應用中身份驗證的基石。本文深入剖析如何用Go語言實現JWT&#xff0c;從基礎概念、底層機制到完整代碼實踐&#xff0c;助你全面掌握。 一、JWT概述 JWT是一種開放標準&#xff08;RFC 7519&#xff09;&#xff0c;用…

深入解讀 DeepSeek-V3 架構及落地的挑戰

從多專家架構&#xff08;MoE&#xff09;到模型落地實戰的一線觀察 一、引言&#xff1a;DeepSeek-V3 是什么&#xff1f; 在大模型百花齊放的今天&#xff0c;DeepSeek-V3 作為 DeepSeek 系列的第三代開源模型&#xff0c;不僅延續了高質量對話能力&#xff0c;還在架構上邁…

前端進階之路-從傳統前端到VUE-JS(第二期-VUE-JS框架結構分析)

經過上期內容的學習&#xff0c;我們已經可以構建一個VUE-CLI框架了&#xff0c;接下來我們分析一下這個框架&#xff0c;畢竟知己知彼&#xff0c;百戰百勝 我們創建完成后可以看到以下內容 接下來我們分析一下他的文件結構 node_modules用于存放項目所依賴的第三方模塊和包…

網絡協議 / 加密 / 簽名總結

加密方式&#xff1a; 對稱加密&#xff1a;key 不可公開。 非對稱加密&#xff1a;公鑰加密的信息只有私鑰能解密。私鑰加密的信息只有公鑰能解密&#xff0c;且公鑰只能解密私鑰加密的信息&#xff08;用于簽名&#xff09;。 非對稱加密應用&#xff1a; 簽名&#xff1a…

集成學習基礎:Bagging 原理與應用

本文由「大千AI助手」原創發布&#xff0c;專注用真話講AI&#xff0c;回歸技術本質。拒絕神話或妖魔化。搜索「大千AI助手」關注我&#xff0c;一起撕掉過度包裝&#xff0c;學習真實的AI技術&#xff01; Bagging 介紹 1. 定義與全稱&#xff1a; Bagging 是 Bootstrap Agg…

skiaSharp linux 上報錯

The type initializer for SkiaSharp.SKImageInfo threw an exception 這個錯誤表明在 Linux 系統上初始化 SkiaSharp 的 SKImageInfo 類型時出現了問題。以下是完整的解決方案&#xff1a; 安裝系統依賴&#xff1a; # Ubuntu/Debian sudo apt-get update sudo apt-get ins…

crawl4ai crawler.arun( 超時問題

delay_before_return_html500 # 單位&#xff1a;毫秒 會導致 crawler.arun 超時問題。按理說不應該 await crawler.arun( 1. 瀏覽器加載頁面 ? 2. 頁面DOM構建完成 ? 3. JavaScript執行完成 ? 4. 等待 delay_before_return_html 時間 ? (500ms) 5. 返回最終HTML內容 &…

Linux Kernel下exFat使用fallocate函數不生效問題

1&#xff09;Linux驅動開發相關問題&#xff0c;分享給將要學習或者正在學習Linux驅動開發的同學。 2&#xff09;內容屬于原創&#xff0c;若轉載&#xff0c;請說明出處。 3&#xff09;提供相關問題有償答疑和支持。 Linux下經常使用fallocate去預分配一個很大的文件空間…

大學專業科普 | 物聯網、自動化和人工智能

在選擇大學專業時&#xff0c;可以先從自身興趣、能力和職業規劃出發&#xff0c;初步確定幾個感興趣的領域。然后結合外部環境因素&#xff0c;如專業前景、教育資源和就業情況等&#xff0c;對這些專業進行深入的分析和比較。 物聯網專業 課程設置 基礎課程&#xff1a;包括…

人工智能-基礎篇-7-什么是大語言模型LLM(NLP重要分支、Transformer架構、預訓練和微調等)

大型語言模型&#xff08;Large Language Model&#xff09;。這類模型是自然語言處理&#xff08;NLP&#xff09;領域的一個重要分支&#xff0c;它們通過在大量文本數據上進行訓練來學習語言的結構和模式&#xff0c;并能夠生成高質量的文本、回答問題、完成翻譯任務等。 1…

【趙渝強老師】基于PostgreSQL的分布式數據庫:Citus

由于PostgreSQL具有強大的功能和良好的可擴展性&#xff0c;因此基于PostgreSQL很容易就可以實現分布式架構。Citus便是具體的一種實現方式。它以擴展的插件形式與PostgreSQL進行集成&#xff0c;且獨立于PostgreSQL內核&#xff0c;部署也比較簡單。Citus是現在非常流行的基于…

【趙渝強老師】OceanBase OBServer節點的接入層

OceanBase數據庫代理ODP&#xff08;OceanBase Database Proxy&#xff0c;又稱OBProxy&#xff09;是OceanBase數據庫的接入層&#xff0c;負責將用戶的請求轉發到合適的OceanBase數據庫實例上進行處理。ODP是獨立的進程實例&#xff0c;獨立于OceanBase數據庫實例部署。ODP監…

ISP Pipeline(8): Color Space Conversion 顏色空間轉換

Color Space Conversion&#xff08;顏色空間轉換&#xff09; 是圖像處理中的一個重要步驟&#xff0c;它將圖像從一個顏色空間&#xff08;Color Space&#xff09;轉換到另一個&#xff0c;以滿足 顯示、分析、壓縮或算法需求。 為什么轉換顏色空間&#xff1f; 應用場景…

Spring Web MVC ①

&#x1f680; 一、Spring MVC MVC三層 Controller&#xff1a;樂團指揮&#xff0c;接收請求→調用模型→選擇視圖&#xff08;Controller&#xff09; Model&#xff1a;樂手&#xff0c;處理業務邏輯與數據&#xff08;POJO對象&#xff09; View&#xff1a;舞臺展示&…

【數據挖掘】貝葉斯分類學習—NaiveBayes

NaiveBayes 樸素貝葉斯的核心是貝葉斯定理&#xff0c;它描述了如何根據新證據更新事件的概率。 要求&#xff1a; 1、實現樸素貝葉斯分類算法&#xff0c;驗證算法的正確性&#xff0c;并將算法應用于給定的數據集Data_User_Modeling數據集&#xff0c;選擇一部分數據集作為已…

Java面試寶典:基礎二

&#x1f512; 25. final vs abstract 關鍵字 關鍵字修飾對象作用規則final類禁止被繼承final class MyClass { ... }方法禁止被子類重寫public final void func()變量變為常量&#xff08;基本類型值不可變&#xff0c;引用類型地址不可變&#xff09;final int MAX 100;abs…