【发布时间】:2018-11-07 12:02:14
【问题描述】:
我编写了一个实用函数来获取字符串的像素宽度。我希望该函数可以选择使用在特定元素上设置的字体,因此无论该元素的样式如何,我都会自动使用该字体进行测量。
问题是 Firefox 不想告诉我元素正在使用什么字体。以下代码适用于其他浏览器:
export function getTextWidth(items: string | string[], font: string | HTMLElement, fallbackFont?: string): number {
const canvas = ((getTextWidth as any).canvas as HTMLCanvasElement ||
((getTextWidth as any).canvas = document.createElement('canvas') as HTMLCanvasElement));
const context = canvas.getContext('2d');
let maxWidth = 0;
if (typeof font === 'string')
context.font = (font ? font : 'normal 12px sans-serif');
else if (typeof font === 'object') {
const elementFont = window.getComputedStyle(font).getPropertyValue('font');
if (elementFont)
context.font = elementFont;
else if (fallbackFont)
context.font = fallbackFont;
else
context.font = 'normal 12px sans-serif';
}
if (!Array.isArray(items))
items = [items];
for (const item of items) {
const width = context.measureText(item).width;
maxWidth = Math.max(maxWidth, width);
}
return maxWidth;
}
问题是 window.getComputedStyle(font).getPropertyValue('font') 在 Firefox 上返回一个空字符串,所以我无法将 context 设置为匹配的字体,以便 measureText 正常工作。
我在函数fallbackFont 中添加了可选参数,因此我可以传递一个明确的字体以供参考,但这不是一个非常令人满意的解决方案。
【问题讨论】:
标签: javascript css typescript firefox fonts