Fabric.js中IText元素实际宽高获取问题:存在多余垂直间距
解决Fabric.js IText元素垂直多余间距及获取实际文本宽高问题
我帮你搞定这个Fabric.js里IText的困扰!你遇到的垂直多余间距其实是字体本身的特性导致的,而activeObject.height返回的是基于字体em框的bounding box高度,不是字符的实际视觉边界。
问题根源
Fabric.js的IText(包括基础Text元素)的宽高计算是基于字体的em框(em square)——这是字体设计时为所有字符预留的统一边界,会包含上行字母(比如"b")、下行字母(比如"g")的最大范围,所以像"r"这种没有明显下行/上行的字符,就会看起来有多余的垂直间距。
获取文本实际宽高的方案
要拿到字符的真实视觉宽高,我们可以利用Canvas的文本测量API,结合Fabric.js元素的缩放属性来计算:
1. 获取实际宽度
const activeObj = canvas.getActiveObject(); // 测量文本原始宽度后,乘以元素的缩放比例 const actualWidth = activeObj.measureText(activeObj.text).width * activeObj.scaleX;
2. 获取实际高度
我们需要通过Canvas的measureText拿到字符的实际上下边界,再计算总高度:
const activeObj = canvas.getActiveObject(); const ctx = canvas.getContext(); // 应用IText的字体样式到上下文 ctx.font = `${activeObj.fontSize * activeObj.scaleY}px ${activeObj.fontFamily}`; const textMetrics = ctx.measureText(activeObj.text); // 实际高度是上边界到下边界的总距离,再考虑缩放 const actualHeight = (textMetrics.actualBoundingBoxAscent + textMetrics.actualBoundingBoxDescent) * activeObj.scaleY;
如果你的IText有自定义的字体样式(比如加粗、斜体),可以用Fabric.js内置的_getFontProperties()方法来更准确地设置上下文字体:
ctx.font = activeObj._getFontProperties();
补充说明
如果是多行IText,你需要遍历每一行文本分别测量后累加高度,用activeObj._getTextLines()可以获取所有文本行的信息。
内容的提问来源于stack exchange,提问作者Umar
相关产品推荐
相关产品推荐

