根据HTML规范,cols属性指定每行预期的最大字符数。当使用的字体每个字符具有相同的宽度时,这是正确的。
根据w3schools,cols属性指定文本区域的宽度(以平均字符宽度为单位)。我猜他们的意思是字体的平均字符宽度而不是文本区域中文本的平均字符宽度。
现在我的问题是用户代理如何计算特定字体的平均字符宽度,包括哪些字符在此计算中。是否有一种方法可以获取此信息或自己计算?
我想要做的是,在不使用任何其他内容(只使用textContent和cols属性)的情况下计算文本区域内的可视行数。
我已经尝试过:
- 计算textContent的平均字符宽度:
根据w3schools,cols属性指定文本区域的宽度(以平均字符宽度为单位)。我猜他们的意思是字体的平均字符宽度而不是文本区域中文本的平均字符宽度。
现在我的问题是用户代理如何计算特定字体的平均字符宽度,包括哪些字符在此计算中。是否有一种方法可以获取此信息或自己计算?
我想要做的是,在不使用任何其他内容(只使用textContent和cols属性)的情况下计算文本区域内的可视行数。
我已经尝试过:
- 计算textContent的平均字符宽度:
const textSpan = document.getElementById("textSpan");
const textarea = document.getElementById("textarea");
textarea.addEventListener("input", (evt) => {
textSpan.innerText = evt.target.value;
console.log("Predicted number of lines: " + (textSpan.getBoundingClientRect().width / (textSpan.getBoundingClientRect().width / textSpan.innerText.length * 10))) // 10 = cols attribute of textarea element;
});
<textarea id="textarea" cols="10" rows="10" style="word-break: break-all;"></textarea>
<span id="textSpan"></span>
- 计算大多数字符的平均字符宽度,这可能有效,但我必须知道用于计算的字符是什么...:
const textSpan = document.getElementById("textSpan");
const textSpanACW = document.getElementById("textSpanACW");
const textarea = document.getElementById("textarea");
textarea.addEventListener("input", (evt) => {
textSpan.innerText = evt.target.value;
console.log("Predicted number of lines: " + (textSpan.getBoundingClientRect().width / (textSpanACW.getBoundingClientRect().width / textSpanACW.innerText.length * 10))) // 10 = cols attribute of textarea element;
});
<textarea id="textarea" cols="10" rows="10" style="word-break: break-all;"></textarea>
<span id="textSpanACW">abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 ,;?.:/=+ù%µ£^¨$*-_)àç!è§('"é&|@#¼½^{[{}</span>
<span id="textSpan"></span>
我弄清楚了这一点之后,我必须在不使用 word-break: break-all;
的情况下获取可视行数。所以答案中包含这个信息会很好,但不是必需的。