我需要在CSS px
中找到HTML textarea元素中字符的宽度。
最好的解决方案是使用一个JavaScript函数,该函数接受一个字符并返回其宽度,并且必须处理特殊字符,如控制字符(\u0001
,\u0096
,\uFFFD
等)。)如果它也与标签一起工作,考虑到文本区域中字符的索引,那就更好了。
我已经有一个函数可以做到这一点(链接在这里;我的项目是开源的,在GitHub上)使用HTML5文本区域,并在Chromium上工作,但它在Firefox中中断,特别是因为Firefox在文本区域(“十六进制框”)中呈现的控制字符与其他元素不同。
getCharacterWidth(char) {
// Force zero-width characters
if(new RegExp("\u00AD|\u02de|[\u0300-\u036F]|[\u0483-\u0489]|\u200b").test(char) ) { return 0 }
// Non-renderable ASCII characters should all be rendered at same size
if(char != "\u0096" && new RegExp("[\u{0000}-\u{001F}]|[\u{007F}-\u{009F}]", "g").test(char)) {
let fallbackWidth = this.getCharacterWidth("\u0096");
return fallbackWidth;
}
// Lazy-load - TODO: Get a cleaner way of doing this
if(char in this.cachedWidths) {
return this.cachedWidths[char];
}
// Try to get width
let width = this.canvasContext.measureText(char).width;
this.canvasContext.fillText(char, 100, 100);
if(width > 20) {
width /= 2; // Fix double-width-in-canvas Firefox bug
} else if(width == 0 && char != "\u0096") {
let fallbackWidth = this.getCharacterWidth("\u0096");
return fallbackWidth; // In Firefox some control chars don't render, but all control chars are the same width
}
this.cachedWidths[char] = width;
return width;
}
我会非常感谢这里的建议,或一个PR in the project on GitHub forked from the display-special-chars
branch。谢谢你的帮助。
3条答案
按热度按时间busg9geu1#
看看这段代码。
我想这会对你有帮助。
gfttwv5a2#
rqenqsqc3#
在JavaScript中,您可以通过创建临时元素,将其字体设置为与文本区域的字体匹配,然后使用offsetWidth属性测量临时元素中字符的宽度来查找文本区域中字符的宽度。下面是一个示例函数,它接受一个字符和一个textarea元素,并返回字符的宽度(以像素为单位)
你可以用一个字符和一个textarea元素来调用这个函数,以获得字符的宽度(以像素为单位):