Я не думаю, что в HTML / Javascript есть какие-либо метрики шрифта. В некоторых библиотеках пользовательского интерфейса вы можете использовать их для измерения строки с разными размерами шрифта перед ее рендерингом. Без этого вы могли бы прибегнуть к чему-то вроде приведенного ниже кода, но это своего рода хак. Может быть, кто-то узнает лучший способ.
Этот тест кода отображает строки, чтобы посмотреть их offsetWidth
, а затем снова отображает их, увеличивая размер шрифта до тех пор, пока они не станут примерно той же ширины, что и самая большая строка.
<!DOCTYPE html>
<html>
<head>
<script>
function init() {
var exampleData = [
["one", "this is longest cell", "apple"],
["banana", "peach", "kiwi"],
["AB", "yabba", "foo bar baz"]
];
var ncols = 3;
var tab = document.getElementById('tab');
var testArea = document.getElementById('testArea');
// First, loop through the cells and find the biggest one
var maxWidth = 0;
for (var i=0; i<exampleData.length; i++) {
var rowData = exampleData[i];
for (var j=0; j<ncols; j++) {
var span = document.createElement('span');
span.innerHTML = rowData[j];
testArea.appendChild(span);
if (maxWidth < span.offsetWidth)
maxWidth = span.offsetWidth;
testArea.removeChild(span);
}
}
// now, add them to the table, bumping the font so the span is as
// wide as maxWidth
for (var i=0; i<exampleData.length; i++) {
var rowData = exampleData[i];
var row = document.createElement('tr');
for (var j=0; j<ncols; j++) {
var span = document.createElement('span');
span.innerHTML = rowData[j];
testArea.appendChild(span);
/* Adjust style to get close to max size: */
var fs = 10;
span.style.fontSize = fs + "px";
while (span.offsetWidth < maxWidth) {
fs += 1;
span.style.fontSize = fs + "px";
}
// console.log(span.style.fontSize + " -> " + span.offsetWidth);
var td = document.createElement('td');
row.appendChild(td);
td.appendChild(span);
}
tab.appendChild(row);
}
}
</script>
</head>
<body onload='init()'>
<table id='tab'>
</table>
<div id='testArea' style='visibility:hidden'>
</div>
</body>
</html>