Vue3基于 rem 比例缩放方案

news2024/10/2 16:20:33

本缩放方案置于hooks中即可。于App.vue中引入并调用。会在页面DOM结构最外层增加响应式的font-size属性样式更改。

 

 主要包含了以下内容

  1. 接口和类型定义:

    • DesignParms:设计稿参数的接口定义,包括宽度、高度和字体大小等信息。
    • UseRemOption:使用 rem 的配置参数的接口定义,包括延迟触发时间。
    • Designs:设计稿集合的类型定义,是一个由 DesignParms 构成的数组。
  2. 默认设计稿方案和配置参数:

    • DEFAULT_DESIGNS:默认的设计稿方案,包含多个不同分辨率下的设计稿信息。
    • DEFAULT_OPTION:默认的配置参数,包括延迟触发时间。
  3. useEqualScaling 函数:

    • 该函数接受设计稿集合和配置参数作为参数,并返回缩放信息和方法。
    • 函数内部根据窗口大小和设计稿信息计算最合适的设计稿作为参考设计稿。
    • 在页面加载和窗口大小改变时,会触发 setHtmlFontSize 方法进行根节点字体大小的计算和设置。
    • 函数返回设计稿集合、参考设计稿和设置根节点字体大小的方法

/**
 * 基于rem 的比例缩放方案
 * @author wangguanjie 2022.06.09
 */
import { onBeforeUnmount, onMounted, ref } from "vue";

/**
 * 设计稿参数
 * @example 1920 * 1080 下 {width: 1920, height: 1080, fontSize: 16, ...}
 * @example 1680 * 1050 下 {width: 1680, height: 1050, fontSize: 14, ...}
 * @example 1280 * 800 下 {width: 1280, height: 800, fontSize: 12, ...}
 */
export interface DesignParms {
  width: number;
  height: number;
  fontSize: number;
}

export interface UseRemOption {
  delay?: number;
}

export type Designs = DesignParms[];

/**
 * 默认设计稿方案
 */
const DEFAULT_DESIGNS: Designs = [
  { width: 800, height: 600, fontSize: 12 },
  { width: 1024, height: 500, fontSize: 12 },
  { width: 1024, height: 768, fontSize: 12 }, // HD
  { width: 1280, height: 800, fontSize: 12 }, // WXGA
  { width: 1280, height: 854, fontSize: 12 },
  { width: 1280, height: 1024, fontSize: 12 },
  { width: 1366, height: 768, fontSize: 14 },
  { width: 1440, height: 900, fontSize: 14 },
  { width: 1440, height: 1050, fontSize: 14 },
  { width: 1600, height: 1024, fontSize: 14 },
  { width: 1600, height: 1200, fontSize: 14 }, // UXGA
  { width: 1680, height: 1050, fontSize: 14 },
  { width: 1920, height: 937, fontSize: 16 }, // FHD
  { width: 1920, height: 1080, fontSize: 16 }, // FHD
  { width: 1920, height: 1200, fontSize: 16 }, // WUXGA
  { width: 2048, height: 1080, fontSize: 18 },
  { width: 2048, height: 1536, fontSize: 18 }, // QXGA
  { width: 2560, height: 1080, fontSize: 18 },
  { width: 2560, height: 1440, fontSize: 18 }, // QHD
  { width: 2560, height: 1600, fontSize: 18 }, // WQXGA
  { width: 3440, height: 1440, fontSize: 18 },
  { width: 3840, height: 1080, fontSize: 18 },
  { width: 3840, height: 2160, fontSize: 18 }, // UHD
  { width: 4096, height: 2160, fontSize: 18 }, // 4K Ultra HD
];

/**
 * 默认配置参数
 */
const DEFAULT_OPTION: Required<UseRemOption> = {
  // 触发延时,默认2022
  delay: 0,
};

/**
 * 等比缩放方案
 * @author wangguanjie 2022.06.09
 * @description 该方案支持多设计稿
 * @param designs 设计稿集合
 * @param option 缩放配置参数
 * @returns 缩放信息、方法
 */
export const useEqualScaling = function (
  designs: Designs = DEFAULT_DESIGNS,
  option: UseRemOption = DEFAULT_OPTION
) {
  let timer: number | undefined;

  // 确保有设计稿可参考
  designs = designs.length ? designs : DEFAULT_DESIGNS;

  // 将设计搞进行升序排序,供后续快速排查
  designs
    .filter((d) => d.width > 1 && d.height > 1)
    .sort((d1, d2) => {
      if (d1.width === d2.width) {
        return d1.height - d2.height;
      }
      return d1.width - d2.width;
    });
  // 降序排序的设计稿
  const descendingDesigns = designs.map((d) => d).reverse();

  // 浏览器适配所参考的设计稿
  const referDesign = ref(designs[0]);

  /**
   * 根据多份设计搞自适应根节点字号
   */
  const setHtmlFontSize = () => {
    if (timer) {
      clearTimeout(timer);
    }
    timer = setTimeout(() => {
      const { clientWidth: docW, clientHeight: docH } =
        document.documentElement;

      // 匹配最佳设计稿
      const hasNewReferDesignIndex = designs.findIndex(
        (d) => d.width >= docW && d.height >= docH
      );
      if (hasNewReferDesignIndex !== -1) {
        referDesign.value = designs[hasNewReferDesignIndex];
      } else {
        // 优先筛选宽度符合的设计搞
        const accordWidthDesigns = descendingDesigns.filter(
          (d) => d.width <= docW
        );
        // 再确认最接近设计稿高度的设计稿
        const designsHeightList = accordWidthDesigns.map((d) => d.height);
        const useDesignIndex = designsHeightList
          .map((designH) => Math.abs(docH - designH))
          .findIndex(
            (designH) =>
              designH ===
              Math.min(...designsHeightList.map((dh) => Math.abs(docH - dh)))
          );
        referDesign.value = accordWidthDesigns[useDesignIndex];
      }
      // 依据所参考的设计稿变更根节点字号
      const documentRatio = docW / docH;
      const {
        width: designW,
        height: designH,
        fontSize: designFontSize,
      } = referDesign.value;
      const designRatio = designW / designH;
      const htmlFontSize =
        documentRatio < designRatio
          ? (docW / designW) * designFontSize
          : (docH / designH) * designFontSize;
      const html = document.querySelector("html");
      if (html) {
        html.style.fontSize = `${htmlFontSize}px`;
      }
    }, option.delay ?? DEFAULT_OPTION.delay);
  };

  setHtmlFontSize();

  onMounted(() => {
    window.addEventListener("resize", setHtmlFontSize, false);
  });

  onBeforeUnmount(() => {
    window.removeEventListener("resize", setHtmlFontSize, false);
  });

  return {
    designs,
    referDesign,
    setHtmlFontSize,
  };
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/584754.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Hack The Box - appointment关卡

TASK 1 任务 1 What does the acronym SQL stand for? 首字母缩略词SQL代表什么&#xff1f; Structured Query LanguageTASK 2 任务 2 What is one of the most common type of SQL vulnerabilities? 最常见的 SQL 漏洞类型之一是什么&#xff1f; SQL Injection TASK …

两天,总计六个小时,中移在线核心业务系统顺利完成1050套欧拉操作系统迁移上线...

摘要&#xff1a;历时两天&#xff0c;总计六个小时&#xff0c;中国移动在线营销服务中心(简称中移在线)正式启动内部核心业务系统全网呼叫平台的迁移工作。首批1050套操作系统完成从 CentOS(系统版本7.2、7.4和7.6)到 openEuler 高效平滑迁移。中移在线拥有全球最大的呼叫平台…

「实在RPA·交通物流数字员工」促进数字化转型加「数」度

一、交通物流行业数字化转型的重要性 作为国家和地区相连接的枢纽&#xff0c;交通物流行业在国民生活中扮演着重要的角色。经济的发展以及电商行业的迅速崛起使得交通物流业的重要作用更加凸显。随着5G技术、大数据云计算、机器人流程自动化的迅速发展&#xff0c;以及交通强…

文件传输只是第一步,文件同步和备份的关键是

有备无患&#xff0c;“备份”的观念早已深入所有信息管理人员的心里。在IT人员信息化安全计划中备份是不可或缺的重要环节。然而&#xff0c;我们还是会经常听到客户抱怨数据备份太慢&#xff0c;文件传输会出现丢失、异常、损坏的情况。那这到底是备份方式有问题还是人员疏忽…

【初识Java之类和对象】

目录 1.什么是面向对象2.类的定义和使用3.类的实例化3.1类的实例化3.2 类的引用 4.This引用5.成员变量 1.什么是面向对象 ava是一门纯面向对象的语言(Object Oriented Program&#xff0c;简称OOP)&#xff0c;在面向对象的世界里&#xff0c;一切皆为对象。 面向对象是解决问题…

Pandas 加载数据的方法和技巧

Pandas 加载数据的方法和技巧 哈喽大家好&#xff0c;我是咸鱼 相信小伙伴们在学习 python 数据分析的过程中或多或少都会听说或者使用过 pandas pandas 是 python 的一个拓展库&#xff0c;常用于数据分析 今天咸鱼将介绍几个关于 pandas 导入数据的方法和技巧 从 URL 获…

【JavaSE】Java基础语法(三十一):可变参数

文章目录 1. 可变参数2. 创建不可变集合 1. 可变参数 可变参数介绍 可变参数又称参数个数可变&#xff0c;用作方法的形参出现&#xff0c;那么方法参数个数就是可变的了方法的参数类型已经确定,个数不确定,我们可以使用可变参数 可变参数定义格式修饰符 返回值类型 方法名(数…

【独立版】智慧城市同城V4_2.2.7全开源全插件VUE版,修复房产信息组件商户发布二手房房源信息未和商户关联的问题

源码介绍 【独立版】智慧城市同城V4 查看更多关于 智慧城市同城V4 的文章 _2.2.7全开源全插件VUE版&#xff0c;修复房产信息组件商户发布二手房房源信息未和商户关联的问题&#xff01; 智慧城市同城是一套专注于多城市生活服务同城技术解决方案,全面覆盖同堿信息、商家联盟、…

端口扫描工具-Nmap

Nmap是一款功能强大&#xff0c;功能丰富的网络扫描工具&#xff0c;对于网络管理员和安全专业人员来说&#xff0c;是一个非常有用的工具&#xff0c;并且被广泛应用于安全审计、网络调查、漏洞搜寻等领域。 &#xff08;能扫描主机的端口&#xff0c;查看端口是否开放&#x…

智慧物流货运系统源码,网络货运平台系统源码,货运系统开发源码部署

一套结合货主、平台、实际承运人多方业务场景&#xff0c;构建人、车、货、企一体的标准化网络货运平台系统源码。 文末获取联系 平台服务于货主与司机&#xff0c;进行服务对接&#xff0c;为货主节省时间找车&#xff0c;为司机找货获得利润。 货主端&#xff1a;货车主在线发…

GPT模型支持下的Python-GEE遥感云大数据分析、管理与可视化

随着航空、航天、近地空间等多个遥感平台的不断发展&#xff0c;近年来遥感技术突飞猛进。由此&#xff0c;遥感数据的空间、时间、光谱分辨率不断提高&#xff0c;数据量也大幅增长&#xff0c;使其越来越具有大数据特征。对于相关研究而言&#xff0c;遥感大数据的出现为其提…

室内外大型商演、体育赛事观赏防雷指南

前言 随着社会的发展&#xff0c;人民生活水平的提高&#xff0c;生活方式的改变&#xff0c;户外颇具规模的各种集会、商演、大型文体及体育活动等举办频次越来越频繁&#xff0c;持续时间越来越长&#xff0c;有的集会持续数天甚至十几天&#xff0c;因此需要采取全方位的防…

DUMPBIN查看dll函数定义 及MFC常用 生成一个C# C++等任意语言都能调用的dll

DUMPBIN /EXPORTS "C:\Windows\System32\uxtheme.dll" /EXPORTS 导出的所有定义。(这里的定义应该就是指的函数名吧) dumpbin.exe是微软二进制文件转储器。显示有关通用对象文件格式 (COFF) 的二进制文件的信息。 可以使用 DUMPBIN 检查 COFF 对象文件、 COFF 对象、…

2023年上半年系统集成项目管理工程师上午真题及答案解析

1.在( )领域我国远末达到世界先进水平&#xff0c;需要发挥新型国家体制优势&#xff0c;集中政府和市场两方面的力量全力发展。 A.卫星导航 B.航天 C.集成电路 D.高铁 2.ChatGPT 于2022年11月30日发布&#xff0c;他是人工智能驱动( )。 …

NFTScan | 05.22~05.28 NFT 市场热点汇总

欢迎来到由 NFT 基础设施 NFTScan 出品的 NFT 生态热点事件每周汇总。 周期&#xff1a;2023.05.22 ~ 2023.05.28 NFT Hot News&#xff1a;NFT 热点资讯 01/ 数据&#xff1a;24 小时内两巨鲸共抛售 349 枚 MAYC NFT 5 月 22 日&#xff0c;Debank 数据显示&#xff0c;近 …

如何将数据从旧电脑传输到新电脑,哪种文件传输方式更好

迁移到新的Windows 10 电脑是一个令人兴奋的时刻&#xff0c;尤其是如果您有幸从我们现在可用的最佳Windows笔记本电脑列表中选择一个选项。问题是您熟悉的文件位于旧电脑上&#xff0c;并且您不想重新开始。为了简化电脑之间的转换&#xff0c;可以使用以下七种方式进行文件传…

Top大学教授:青年学者,请避免这些写作问题→

在科研初期&#xff0c;很多作者由于缺乏经验和指导&#xff0c;糊里糊涂地发了一些质量较低的论文。 为了帮助青年科学家提高写作能力&#xff0c;比利时鲁汶大学的Blocken教授&#xff08;同时也是Building & Environment、Journal of Wind Engineering & Industrial…

Linux第三天

man手册一般用于工具 比如nmap lsblk :查看光盘内容 //说明还没被挂载 //在 /etc/fstab vim中进行开机挂载 yum repolist -v //查看软件安装的历史列表

【编写UI自动化测试集】Appium+Python+Unittest+HTMLRunner​

简介 获取AppPackage和AppActivity 定位UI控件的工具 脚本结构 PageObject分层管理 HTMLTestRunner生成测试报告 启动appium server服务 以python文件模式执行脚本生成测试报告 下载与安装 下载需要自动化测试的App并安装到手机 获取AppPackage和AppActivity 方法一 有源码…

Linux Shell 半自动方式部署单机Oracle 21C

oracle前言 Oracle开发的关系数据库产品因性能卓越而闻名&#xff0c;Oracle数据库产品为财富排行榜上的前1000家公司所采用&#xff0c;许多大型网站也选用了Oracle系统&#xff0c;是世界最好的数据库产品。此外&#xff0c;Oracle公司还开发其他应用程序和软件。同时&#…