Ini adalah solusi paling elegan yang saya buat. Ini menggunakan pencarian biner, melakukan 10 iterasi. Cara naif adalah melakukan loop sementara dan meningkatkan ukuran font sebanyak 1 hingga elemen mulai meluap. Anda bisa menentukan kapan suatu elemen mulai meluap menggunakan element.offsetHeight dan element.scrollHeight . Jika scrollHeight lebih besar dari offsetHeight, Anda memiliki ukuran font yang terlalu besar.
Pencarian biner adalah algoritma yang jauh lebih baik untuk ini. Itu juga dibatasi oleh jumlah iterasi yang ingin Anda lakukan. Cukup panggil flexFont dan masukkan id id dan itu akan menyesuaikan ukuran font antara 8px dan 96px .
Saya telah menghabiskan beberapa waktu meneliti topik ini dan mencoba berbagai perpustakaan, tetapi pada akhirnya saya pikir ini adalah solusi termudah dan paling mudah yang benar-benar akan berhasil.
Catatan jika mau, Anda dapat mengubah untuk menggunakan offsetWidth
dan scrollWidth
, atau menambahkan keduanya ke fungsi ini.
// Set the font size using overflow property and div height
function flexFont(divId) {
var content = document.getElementById(divId);
content.style.fontSize = determineMaxFontSize(content, 8, 96, 10, 0) + "px";
};
// Use binary search to determine font size
function determineMaxFontSize(content, min, max, iterations, lastSizeNotTooBig) {
if (iterations === 0) {
return lastSizeNotTooBig;
}
var obj = fontSizeTooBig(content, min, lastSizeNotTooBig);
// if `min` too big {....min.....max.....}
// search between (avg(min, lastSizeTooSmall)), min)
// if `min` too small, search between (avg(min,max), max)
// keep track of iterations, and the last font size that was not too big
if (obj.tooBig) {
(lastSizeTooSmall === -1) ?
determineMaxFontSize(content, min / 2, min, iterations - 1, obj.lastSizeNotTooBig, lastSizeTooSmall) :
determineMaxFontSize(content, (min + lastSizeTooSmall) / 2, min, iterations - 1, obj.lastSizeNotTooBig, lastSizeTooSmall);
} else {
determineMaxFontSize(content, (min + max) / 2, max, iterations - 1, obj.lastSizeNotTooBig, min);
}
}
// determine if fontSize is too big based on scrollHeight and offsetHeight,
// keep track of last value that did not overflow
function fontSizeTooBig(content, fontSize, lastSizeNotTooBig) {
content.style.fontSize = fontSize + "px";
var tooBig = content.scrollHeight > content.offsetHeight;
return {
tooBig: tooBig,
lastSizeNotTooBig: tooBig ? lastSizeNotTooBig : fontSize
};
}