1. 简介
Fabric.js 是一款非常流行的 HTML5 Canvas 库,它提供了一系列的 API,使得在 Canvas 画布上添加图形和文本变得非常简单。在 Fabric.js 中,文本被表示为 IText 对象。
但是,有一件事情让一些开发者感到困扰,那就是如何获取 IText 中单词的正确边界。默认情况下,单词之间会有一定的间隔,这使得获取单个单词的大小和位置变得相对困难。
2. 解决方案
2.1. 渲染 IText 文本
在 Fabric.js 中,要想获取 IText 中单词的正确边界,我们首先需要对 IText 进行渲染。可以通过以下代码进行渲染:
const canvas = new fabric.Canvas('canvas');
const text = new fabric.IText('Hello World!', {
left: 100,
top: 100,
});
canvas.add(text);
canvas.renderAll();
代码中我们创建了一个名为 canvas 的 Canvas 对象,然后创建了一个名为 text 的 IText 对象,将该对象添加到 Canvas 中并进行渲染。
2.2. 获取单个单词的边界信息
要获取单个单词的大小和位置,我们可以使用以下代码:
const canvas = new fabric.Canvas('canvas');
const text = new fabric.IText('Hello World!', {
left: 100,
top: 100,
});
canvas.add(text);
canvas.renderAll();
const wordIndex = 0; // 需要获取边界信息的单词下标
const charIndex = text.get2DCursorLocation(wordIndex).charIndex;
const word = text.text.split(' ')[wordIndex];
const boundary = text._getWordBoundary(charIndex, word);
console.log(boundary);
代码中我们使用了 Fabric.js 提供的 get2DCursorLocation() 方法,该方法可以返回 IText 中指定索引位置字符的行索引和列索引信息。然后我们通过 charIndex 获取到单个单词的起始位置,使用 split() 方法将 IText 中的文本按空格划分为一个个单词,最后通过 _getWordBoundary() 方法获取到该单词的边界信息。
2.3. 获取整个 IText 的边界信息
要获取整个 IText 的边界信息,我们可以使用以下代码:
const canvas = new fabric.Canvas('canvas');
const text = new fabric.IText('Hello World!', {
left: 100,
top: 100,
});
canvas.add(text);
canvas.renderAll();
const textSize = text.getBoundingRect();
console.log(textSize);
代码中我们使用了 Fabric.js 提供的 getBoundingRect() 方法,该方法可以返回 IText 的边界信息,包括宽度、高度和起始位置等。
3. 示例
下面是一个完整的示例,可以点击 Canvas 区域中的单词查看其边界信息:
const canvas = new fabric.Canvas('canvas');
const text = new fabric.IText('Hello World! This is a test.', {
left: 100,
top: 100,
fontFamily: 'Arial',
fontSize: 24,
});
canvas.add(text);
canvas.renderAll();
text._splitTextIntoWords();
text.forEachWord((word, index) => {
const charIndex = text.get2DCursorLocation(index).charIndex;
const boundary = text._getWordBoundary(charIndex, word);
const element = document.createElement('span');
element.style.border = '1px solid blue';
element.style.position = 'absolute';
element.style.top = `${boundary.top + canvas._offset.top}px`;
element.style.left = `${boundary.left + canvas._offset.left}px`;
element.style.width = `${boundary.width}px`;
element.style.height = `${boundary.height}px`;
element.onclick = () => {
console.log(`Word: ${word}, Boundary: `, boundary);
};
canvas.wrapperEl.appendChild(element);
});
代码中我们使用了 Fabric.js 提供的 _splitTextIntoWords() 方法和 forEachWord() 方法,在 Canvas 区域中为每个单词创建了一个带边框的 span 标签,并添加到 wrapperEl 元素中。同时,我们为每个单词的 span 标签添加了 onclick 事件,在单击标签时输出该单词的边界信息。
4. 总结
使用 Fabric.js 获取 IText 中单词的正确边界需要渲染 IText,获取单个单词的边界信息,以及获取整个 IText 的边界信息这三个步骤。其中,通过 get2DCursorLocation() 和 _getWordBoundary() 方法可以获取单个单词的边界信息,通过 getBoundingRect() 方法可以获取整个 IText 的边界信息。可以将获取到的信息用于一些交互式的需求中。