Statik bir karakter genişliği haritası yapma "tek fikrinizi" seviyorum! Aslında benim amacım için iyi çalışıyor. Bazen, performans nedenlerinden dolayı veya bir DOM'a kolay erişiminiz olmadığından, tek bir yazı tipiyle kalibre edilmiş hızlı bir hacky bağımsız hesap makinesi isteyebilirsiniz. İşte Helvetica için kalibre edilmiş bir tane; bir dize ve (isteğe bağlı olarak) bir yazı tipi boyutu iletme:
function measureText(str, fontSize = 10) {
const widths = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.2796875,0.2765625,0.3546875,0.5546875,0.5546875,0.8890625,0.665625,0.190625,0.3328125,0.3328125,0.3890625,0.5828125,0.2765625,0.3328125,0.2765625,0.3015625,0.5546875,0.5546875,0.5546875,0.5546875,0.5546875,0.5546875,0.5546875,0.5546875,0.5546875,0.5546875,0.2765625,0.2765625,0.584375,0.5828125,0.584375,0.5546875,1.0140625,0.665625,0.665625,0.721875,0.721875,0.665625,0.609375,0.7765625,0.721875,0.2765625,0.5,0.665625,0.5546875,0.8328125,0.721875,0.7765625,0.665625,0.7765625,0.721875,0.665625,0.609375,0.721875,0.665625,0.94375,0.665625,0.665625,0.609375,0.2765625,0.3546875,0.2765625,0.4765625,0.5546875,0.3328125,0.5546875,0.5546875,0.5,0.5546875,0.5546875,0.2765625,0.5546875,0.5546875,0.221875,0.240625,0.5,0.221875,0.8328125,0.5546875,0.5546875,0.5546875,0.5546875,0.3328125,0.5,0.2765625,0.5546875,0.5,0.721875,0.5,0.5,0.5,0.3546875,0.259375,0.353125,0.5890625]
const avg = 0.5279276315789471
return str
.split('')
.map(c => c.charCodeAt(0) < widths.length ? widths[c.charCodeAt(0)] : avg)
.reduce((cur, acc) => acc + cur) * fontSize
}
Bu dev çirkin dizi, karakter koduyla dizinlenmiş ASCII karakter genişliğidir. Yani bu sadece ASCII'yi destekler (aksi takdirde ortalama bir karakter genişliği varsayar). Neyse ki, genişlik temel olarak yazı tipi boyutuyla doğrusal olarak ölçeklenir, bu nedenle herhangi bir yazı tipi boyutunda oldukça iyi çalışır. Belirgin şekilde, karakter aralığı veya bitişik harfler veya başka herhangi bir farkındalıktan yoksundur.
"Kalibre" Ben sadece bir svg charCode 126 (kudretli tilde) kadar her karakter render ve sınırlama kutusu var ve bu diziye kaydetti; daha fazla kod ve açıklama ve demo burada .