「技术方案」监听字体大小实现页面高度自适应

news2024/11/22 6:21:47

一、监听DOM元素的API

要监听字体大小并根据其变化调整高度,可以使用以下方法:

1. 使用 ResizeObserver

ResizeObserver 是一个现代浏览器支持的 API,用于监听 DOM 元素的尺寸变化。通过监听字体大小变化(会影响元素高度),可以动态调整高度。

实现代码
attached() {
    const paragraphInstance = this.ref('paragraph');
    const paragraphElement = paragraphInstance.el; // 获取 DOM 元素

    // 创建 ResizeObserver 实例
    const resizeObserver = new ResizeObserver(() => {
        const computedStyle = window.getComputedStyle(paragraphElement);
        const fontSize = parseFloat(computedStyle.fontSize); // 获取字体大小
        const newHeight = fontSize * 1.5; // 假设高度为字体大小的1.5倍

        paragraphElement.style.height = `${newHeight}px`; // 动态设置高度
        console.log('字体大小:', fontSize, '调整后高度:', newHeight);
    });

    // 开始观察
    resizeObserver.observe(paragraphElement);

    // 在组件销毁时断开观察器(可选)
    this.resizeObserver = resizeObserver; // 保存以便销毁时使用
},
detached() {
    // 断开 ResizeObserver
    this.resizeObserver?.disconnect();
}

2. 通过 MutationObserver 检测样式变化

如果 ResizeObserver 不满足需求,可以使用 MutationObserver,监测 style 属性变化,从而捕获字体大小的调整。

实现代码
attached() {
    const paragraphInstance = this.ref('paragraph');
    const paragraphElement = paragraphInstance.el;

    const observer = new MutationObserver(() => {
        const computedStyle = window.getComputedStyle(paragraphElement);
        const fontSize = parseFloat(computedStyle.fontSize);
        const newHeight = fontSize * 1.5;

        paragraphElement.style.height = `${newHeight}px`;
        console.log('字体大小:', fontSize, '调整后高度:', newHeight);
    });

    observer.observe(paragraphElement, {
        attributes: true, // 监听属性变化
        attributeFilter: ['style'], // 限定监听的属性
    });

    this.mutationObserver = observer;
},
detached() {
    // 停止监听
    this.mutationObserver?.disconnect();
}

3. 基于 window.getComputedStyle 的定时轮询(备选方案)

如果对性能要求不高,或者需要兼容不支持上述方法的浏览器,可以定期轮询检查字体大小是否变化。

实现代码
attached() {
    const paragraphInstance = this.ref('paragraph');
    const paragraphElement = paragraphInstance.el;

    this.checkFontSize = setInterval(() => {
        const computedStyle = window.getComputedStyle(paragraphElement);
        const fontSize = parseFloat(computedStyle.fontSize);
        const newHeight = fontSize * 1.5;

        paragraphElement.style.height = `${newHeight}px`;
        console.log('字体大小:', fontSize, '调整后高度:', newHeight);
    }, 500); // 每500ms检查一次
},
detached() {
    // 清除定时器
    clearInterval(this.checkFontSize);
}

选择方案

  • 优先使用 ResizeObserver:性能好,专注于尺寸变化。
  • MutationObserver:适合监测样式属性变化,但要限制监听范围,避免性能问题。
  • 轮询:简单易实现,但性能可能较低,仅作为备选方案。

二、实现页面高度随字体变化自适应

以上方法无法实现随着字体变化高度的完美变化,总会存在点问题
所以我们在 this.nextTick() 调用更新高度的方法 updateSwiperHeight

// 父组件
updateHeight() {
    this.nextTick(() => {
        this.updateSwiperHeight();
    });
}

// 更新高度的方法
updateSwiperHeight(data = {}) {
    const isLilac = this.data.get('styleVarient') === 'lilac';
    // 取row-content的高度给cos-swiper-content
    const rowContentEl = this.ref(`swiperItem_${data.index || 0}`)?.el.querySelector('.cos-row');
    const swiperEl = this.ref('swiper')?.el.querySelector('.cos-swiper-content');
    if (!rowContentEl || !swiperEl) {
        return;
    }
    // lilac样式下顶部有15px外间距
    swiperEl.style.height = `${rowContentEl.clientHeight + (isLilac ? 15 : 0)}px`;
}

三、整合代码

1、在字体所在组件(子组件)监听字体变化

attached() {
    const paragraphInstance = this.ref('paragraph');
    const paragraphElement = paragraphInstance.el;
    // ResizeObserver 监听字体变化后,更新高度
    const resizeObserver = new ResizeObserver(() => {
        this.fire('update-height'); // 触发父组件更新
    });
    resizeObserver.observe(paragraphElement);
}

detached() {
    this.resizeObserver?.disconnect();
}

2、在swiper高度所在组件(父组件)绑定方法

// 模版部分
<template>
    <div>
        <p>父组件的 swiperHeight:{{ swiperHeight }}</p>
        <child-component swiper-height="{{ swiperHeight }}" on-update-height="updateHeight" />
    </div>
</template>
// 逻辑部分
updateHeight() {
    this.nextTick(() => {
        this.updateSwiperHeight();
    });
}

// 更新高度的方法
updateSwiperHeight(data = {}) {
    const isLilac = this.data.get('styleVarient') === 'lilac';
    // 取row-content的高度给cos-swiper-content
    const rowContentEl = this.ref(`swiperItem_${data.index || 0}`)?.el.querySelector('.cos-row');
    const swiperEl = this.ref('swiper')?.el.querySelector('.cos-swiper-content');
    if (!rowContentEl || !swiperEl) {
        return;
    }
    // lilac样式下顶部有15px外间距
    swiperEl.style.height = `${rowContentEl.clientHeight + (isLilac ? 15 : 0)}px`;
}

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

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

相关文章

汽车资讯新趋势:Spring Boot技术解读

5系统详细实现 5.1 管理员模块的实现 5.1.1 用户信息管理 汽车资讯网站的系统管理员可以管理用户&#xff0c;可以对用户信息修改删除审核以及查询操作。具体界面的展示如图5.1所示。 图5.1 用户信息管理界面 5.1.2 汽车品牌管理 系统管理员可以汽车品牌信息进行添加&#xf…

EdgeNeXt:面向移动视觉应用的高效融合CNN-Transformer架构

摘要 https://arxiv.org/pdf/2206.10589 为了追求更高的准确性&#xff0c;通常会开发大型且复杂的神经网络。这些模型需要高计算资源&#xff0c;因此无法部署在边缘设备上。构建资源高效通用网络在多个应用领域都非常有用&#xff0c;因此备受关注。在本研究中&#xff0c;我…

udp_socket

文章目录 UDP服务器封装系统调用socketbind系统调用bzero结构体清0sin_family端口号ip地址inet_addrrecvfromsendto 新指令 netstat -naup (-nlup)包装器 的两种类型重命名方式包装器使用统一可调用类型 关键字 typedef 类型重命名系统调用popen UDP服务器封装 系统调用socket …

Spring Boot教程之五:在 IntelliJ IDEA 中运行第一个 Spring Boot 应用程序

在 IntelliJ IDEA 中运行第一个 Spring Boot 应用程序 IntelliJ IDEA 是一个用 Java 编写的集成开发环境 (IDE)。它用于开发计算机软件。此 IDE 由 Jetbrains 开发&#xff0c;提供 Apache 2 许可社区版和商业版。它是一种智能的上下文感知 IDE&#xff0c;可用于在各种应用程序…

高效高质量SCI论文撰写及投稿流程及策略丨从论文选题、文献调研、实验设计、数据分析、论文结构及语言规范等重要环节

科学研究的核心在于将复杂的思想和实验成果通过严谨的写作有效地传递给学术界和工业界。对于研究生、青年学者及科研人员&#xff0c;如何高效撰写和发表SCI论文&#xff0c;成为提升学术水平和科研成果的重要环节。本教程旨在帮助学员系统掌握从选题到投稿的全过程&#xff0c…

Mac下的vscode远程ssh免密码登录

Mac下的vscode远程ssh免密码登录&#xff08;同理可迁移至windows及linux系统&#xff09; 在日常开发中&#xff0c;使用远程服务器进行开发是非常常见的&#xff0c;而通过 SSH 免密码登录可以显著提高效率&#xff0c;避免每次连接时都需要输入密码。本文将介绍如何在 macOS…

记录eslint报错的情况

这几天在调试vue的eslint&#xff0c;害&#xff0c;我领导说eslint要打开规范代码&#xff0c;顺带看了一下eslint的规则&#xff0c;并且研究一下报错。切记每次修改了.eslintrc配置文件&#xff0c;需要重启项目再查看控制台&#xff0c;否则之前的报错会一直存在。 第一个…

汽车软件DevOps解决方案

汽车软件DevOps解决方案是专为现代汽车行业设计的一套集成化需求、开发、测试、部署、OTA与监控&#xff0c;旨在加速软件开发流程&#xff0c;提高软件质量和安全性&#xff0c;同时确保整个生命周期的高效性和灵活性。以下是经纬恒润汽车软件DevOps解决方案的关键组成部分和优…

openCV与eigen两种方法---旋转向量转旋转矩阵

#include <Eigen/Dense> #include <opencv2/core/eigen.hpp> #include <opencv2/opencv.hpp> using namespace cv; using namespace std; int main() {// opencv 旋转向量cv::Vec3d rvec(1.0, 2.0, 3.0);cv::Mat rotation_matrix;cv::Rodrigues(rvec, rotati…

Vue项目搭建-2-组合式API

入口-setup 在组件渲染时会优先执行 setup 中代码&#xff0c;执行时机为 beforeCreate 之前 setup 方法中的对象若想要在 template 中使用&#xff0c;需要将方法 return 出去: <script> export default {setup() {console.log(setup had run)const msg "hello…

国产linux系统(银河麒麟,统信uos)使用 PageOffice 动态生成word文件

PageOffice 国产版 &#xff1a;支持信创系统&#xff0c;支持银河麒麟V10和统信UOS&#xff0c;支持X86&#xff08;intel、兆芯、海光等&#xff09;、ARM&#xff08;飞腾、鲲鹏、麒麟等&#xff09;、龙芯&#xff08;LoogArch&#xff09;芯片架构。 数据区域填充文本 数…

H.265流媒体播放器EasyPlayer.js H5流媒体播放器关于如何查看手机端的日志信息并保存下来

现今流媒体播放器的发展趋势将更加多元化和个性化。人工智能的应用将深入内容创作、用户体验优化等多个方面&#xff0c;带来前所未有的个性化体验。 EasyPlayer.js H.265流媒体播放器属于一款高效、精炼、稳定且免费的流媒体播放器&#xff0c;可支持多种流媒体协议播放&#…

【软考】系统架构设计师-信息系统基础

#信息系统基础核心知识点 信息系统5个基本功能&#xff1a;输入、存储、处理、输出和控制 诺兰模型&#xff1a;信息系统计划的阶段模型&#xff0c;6阶段 初始阶段&#xff0c;传播阶段&#xff0c;控制阶段&#xff0c;集成阶段&#xff0c;数据管理阶段&#xff0c;成熟阶…

【论文笔记】Large Brain Model (LaBraM, ICLR 2024)

Code: https://github.com/935963004/LaBraM Data: 无 目录 AbstractIntroductionMethodNeural tokenizer training&#xff1a;Pre-training LaBraM&#xff1a; ResultsExperimental setup&#xff1a;Pre-training result&#xff1a;Comparison with SOTA&#xff1a;Pre-t…

瀚海微SD NAND之SD 协议(34)1.8V信号的时序

固定数据窗口输出时序(SDR12、SDR25、SDR50) 固定数据窗口插卡输出时序如下图所示&#xff0c;SDR12、SDR25、SDR50的输出时序 有效窗口由输出延迟(topy)的最小值和最大值指定。 无论温度和电压如何变化&#xff0c;与SDCLK同步的有效数据窗口都是可用的。 输出有效窗口由t…

web——sqliabs靶场——第十三关——报错注入+布尔盲注

发现是单引号加括号闭合的 尝试联合注入 发现不太行&#xff0c;那尝试报错注入。 测试报错注入 unameadmin) and updatexml(1,0x7e,3) -- &passwdadmin&submitSubmit 爆数据库 unameadmin) and updatexml(1,concat(0x7e,database(),0x7e),3) -- &passwdadmin&a…

5、AI测试辅助-生成测试用例思维导图

AI测试辅助-生成测试用例思维导图 创建测试用例两种方式1、Plantuml思维导图版本 (不推荐&#xff09;2、Markdown思维导图版本&#xff08;推荐&#xff09; 创建测试用例两种方式 完整的测试用例通常需要包含以下的元素&#xff1a; 1、测试模块 2、测试标题 3、前置条件 4、…

附录2-pytorch yolov5目标检测

项目地址 https://github.com/ultralytics/yolov5 参考 https://zhuanlan.zhihu.com/p/711356735 目录 1 数据集准备 1.1 images 1.2 labels 1.3 yaml文件 2 环境配置 3 python环境配置 3.1 安装torch 3.2 安装opencv 3.3 安装 ultralytics 4 预训练模型…

CDM(码分复用)发送和接受原理

现在假设主机A、B、C。其对应的码片序列为a、b、c。 现在有&#xff1a; 现在假设A发送比特1&#xff0c;对应发送的是。B不发送。C发送比特0&#xff0c;对应发送。 信号叠加的结果为。 基站X将结果与每一个主机的码片序列做内积。 与A&#xff1a; ,因此A发送了1。 与B…

菜鸟驿站二维码/一维码 取件识别功能

特别注意需要引入 库文 ZXing 可跳转&#xff1a; 记录【WinForm】C#学习使用ZXing.Net生成条码过程_c# zxing-CSDN博客 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using static System.Net.…