Dies ist die eleganteste Lösung, die ich erstellt habe. Es verwendet die binäre Suche und führt 10 Iterationen durch. Der naive Weg bestand darin, eine while-Schleife durchzuführen und die Schriftgröße um 1 zu erhöhen, bis das Element überzulaufen begann. Mit element.offsetHeight und element.scrollHeight können Sie bestimmen, wann ein Element zu überlaufen beginnt . Wenn scrollHeight größer als offsetHeight ist, haben Sie eine zu große Schriftgröße.
Die binäre Suche ist hierfür ein viel besserer Algorithmus. Es ist auch durch die Anzahl der Iterationen begrenzt, die Sie ausführen möchten. Rufen Sie einfach flexFont auf und geben Sie die div-ID ein. Dadurch wird die Schriftgröße zwischen 8 und 96 Pixel angepasst .
Ich habe einige Zeit damit verbracht, dieses Thema zu erforschen und verschiedene Bibliotheken auszuprobieren, aber letztendlich denke ich, dass dies die einfachste und einfachste Lösung ist, die tatsächlich funktionieren wird.
Beachten Sie, wenn Sie möchten, können Sie die Verwendung von offsetWidth
und ändern scrollWidth
oder beide zu dieser Funktion hinzufügen.
// 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
};
}