vue3 计算字符串的高度与宽度,通过Canvas API的TextMetrics 接口来实现

server/2024/10/17 20:18:22/

1、先上一张官方的说明图:

地址:https://developer.mozilla.org/zh-CN/docs/Web/API/TextMetrics

官方实例:

<canvas id="canvas" width="550" height="500"></canvas>
const canvas = document.getElementById("canvas");
const ctx = canvas.getContext("2d");
const baselinesAboveAlphabetic = ["fontBoundingBoxAscent","actualBoundingBoxAscent","emHeightAscent","hangingBaseline",
];
const baselinesBelowAlphabetic = ["ideographicBaseline","emHeightDescent","actualBoundingBoxDescent","fontBoundingBoxDescent",
];
const baselines = [...baselinesAboveAlphabetic, ...baselinesBelowAlphabetic];
ctx.font = "25px serif";
ctx.strokeStyle = "red";
baselines.forEach((baseline, index) => {const text = `Abcdefghijklmnop (${baseline})`;const textMetrics = ctx.measureText(text);const y = 50 + index * 50;ctx.beginPath();ctx.fillText(text, 0, y);let lineY = y - Math.abs(textMetrics[baseline]);if (baselinesBelowAlphabetic.includes(baseline)) {lineY = y + Math.abs(textMetrics[baseline]);}ctx.moveTo(0, lineY);ctx.lineTo(550, lineY);ctx.stroke();
});

运行效果说明:

2、然后我们用vue3做一个小的demo测试下(以下代码修改于baidu ai):

<template><div><canvas ref="canvas" style="display: none;"></canvas><p>Text height: {{ textHeight }}px</p></div></template><script setup>import { ref, onMounted, watch } from 'vue';const text = ref('您好世界');const textHeight = ref(0);const canvas = ref(null);onMounted(() => {measureTextHeight();});watch(text, measureTextHeight);function measureTextHeight() {const ctx = canvas.value.getContext('2d');ctx.font = '20px Microsoft Yahei';const metrics = ctx.measureText(text.value);let width = metrics.width;let height = metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent;textHeight.value = height;return { width, height };}</script>

运行结果:

说明:这种方法canvas可以精确的计算出,当然也有通过动态创建div,然后通过div的高度来计算,此方法测试发现不是很精确。当然实际开发过程中要进行适当调整。

代码也帖出来:

 function getWordHeight(fontSize: string, fontFamily: string, sTextStr: string) {console.log('getWordHeight:', sTextStr);let newDiv = document.createElement('div');newDiv.style.fontSize = fontSize + 'px';newDiv.style.fontFamily = fontFamily;newDiv.innerText = sTextStr;// 将新 div 插入文档流中,这样才能计算出其高度和宽度document.body.appendChild(newDiv);// 计算新 div 的高度和宽度let height = newDiv.offsetHeight; //clientHeightlet width = newDiv.offsetWidth; //clientWidth// 从文档流中移除新 divnewDiv.remove();return { width, height };}


http://www.ppmy.cn/server/132571.html

相关文章

k8s--二进制包部署及常见报错解决方法

部署流程 所有基础流程见此教程&#xff0c;很详细&#xff1a; 从零搭建k8s集群 - 许大仙 - 博客园 (cnblogs.com) 记得在写配置文件时细心点&#xff0c;注意修改自己的ip地址&#xff0c;以及看在哪个主机上操作 这里记得写自己的token 常见报错及解决方法 我只在下边讲…

2024金九银十版Java基础、中级、高级面试题总结(1000道题含答案解析)

作为一名优秀的程序员&#xff0c;技术面试都是不可避免的一个环节&#xff0c;一般技术面试官都会通过自己的方式去考察程序员的技术功底与基础理论知识。 如果你参加过一些大厂面试&#xff0c;肯定会遇到一些这样的问题&#xff1a; 1、看你项目都用的框架&#xff0c;熟悉…

Spring Boot在知识管理中的应用

1系统概述 1.1 研究背景 如今互联网高速发展&#xff0c;网络遍布全球&#xff0c;通过互联网发布的消息能快而方便的传播到世界每个角落&#xff0c;并且互联网上能传播的信息也很广&#xff0c;比如文字、图片、声音、视频等。从而&#xff0c;这种种好处使得互联网成了信息传…

C# 里反射(Reflection)的應用說明

一、反射的基本概念 在C#编程中&#xff0c;反射&#xff08;Reflection&#xff09;是一个强大的工具&#xff0c;它允许程序在运行时检查对象或类型的元数据&#xff0c;并动态地创建和操作这些对象。反射是.Net框架提供的一种机制&#xff0c;使得开发者能够在不直接知道类…

深度学习:领域适应(Domain Adaptation)详解

领域适应&#xff08;Domain Adaptation&#xff09;详解 领域适应是机器学习中的一个重要研究领域&#xff0c;它解决的问题是模型在一个领域&#xff08;源域&#xff09;上训练得到的知识如何迁移到另一个有所差异的领域&#xff08;目标域&#xff09;上。领域适应特别重要…

OpenCV-人脸检测

文章目录 一、人脸检测流程二、关键方法三、代码示例四、注意事项 OpenCV是一个开源的计算机视觉和机器学习软件库&#xff0c;它提供了多种人脸检测方法&#xff0c;以下是对OpenCV人脸检测的详细介绍&#xff1a; 一、人脸检测流程 人脸检测是识别图像中人脸位置的过程&…

Spring Security自定义登录接口处理JSON请求体

Spring Security自定义登录接口处理JSON请求体 一、Spring Security自定义登录接口处理JSON请求体1. 创建自定义登录控制器2. 创建LoginRequest类3. 配置Spring Security 一、Spring Security自定义登录接口处理JSON请求体 在Spring Security中&#xff0c;默认情况下&#xf…

Vue3+TypeScript+AntVX6实现Web组态(从技术层面与实现层面进行分析)内含实际案例教学

摘要 用Vue3TypeScriptAntVX6实现Web组态&#xff08;从技术层面与实现层面进行分析&#xff09;&#xff0c;包含画布创建、节点设计、拖拽实现&#xff08;实际案例&#xff09;、节点连线、交互功能&#xff0c;后续文章持续更新。 注&#xff1a;本文章可以根据目录进行导…