Контексты, используемые для холстов HTML, имеют встроенный метод проверки размера шрифта. Этот метод возвращает объект TextMetrics
, который имеет свойство width, которое содержит ширину текста.
function getWidthOfText(txt, fontname, fontsize){
if(getWidthOfText.c === undefined){
getWidthOfText.c=document.createElement('canvas');
getWidthOfText.ctx=getWidthOfText.c.getContext('2d');
}
getWidthOfText.ctx.font = fontsize + ' ' + fontname;
return getWidthOfText.ctx.measureText(txt).width;
}
Или, как предлагали некоторые другие пользователи, вы можете заключить его в элемент span
:
function getWidthOfText(txt, fontname, fontsize){
if(getWidthOfText.e === undefined){
getWidthOfText.e = document.createElement('span');
getWidthOfText.e.style.display = "none";
document.body.appendChild(getWidthOfText.e);
}
getWidthOfText.e.style.fontSize = fontsize;
getWidthOfText.e.style.fontFamily = fontname;
getWidthOfText.e.innerText = txt;
return getWidthOfText.e.offsetWidth;
}
Тестирование:
- Первое решение (холст) - проверено , работает (возвращает в пикселях)
- Второе решение (DOM) - проверено , работает (возвращает в пикселях)
Обратите внимание, что из-за различий в реализации они могут возвращать немного разные значения.
Тест производительности: 26788 вызовов в среднем за 100 итераций. Протестировано в конце 2014 года Mac Mini, 1,4 ГГц i5
Safari, версия 10.1.1 (12603.2.4):
- Первое решение: 33,92 миллисекунды для 26788 вызовов
- Второе решение: 67,94 миллисекунды для 26788 вызовов
Google Chrome, версия 60.0.3112.90:
- Первое решение: 99,1963 миллисекунды для 26788 вызовов
- Второе решение: 307,4605 миллисекунд для 26788 вызовов