HTML/Javascriptのフォントメトリクス機能はありません。いくつかのUIライブラリでは、レンダリングする前に異なるフォントサイズの文字列を測定するためにそれらを使用できます。それがなければ、以下のコードのようなものに頼ることができますが、それはちょっとしたハックです。多分誰かがより良い方法を知っているでしょう。
このコードテストでは、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>
Matthewありがとう、これは実際に私が探しているものに非常に近いです。しかし、何らかの理由でテーブルの幅をある値に設定すると効果が壊れます(100%が優先されます)。その後、スクリプトは最初の列にのみ影響し、各列のフォントサイズは小さくなります –
今更新されました。これは、テーブルセル上で垂直方向の配置を保持することさえ可能にします。 – Matthew