C'est la solution la plus élégante que j'ai créée. Il utilise la recherche binaire, faisant 10 itérations. La manière naïve était de faire une boucle while et d'augmenter la taille de la police de 1 jusqu'à ce que l'élément commence à déborder. Vous pouvez déterminer quand un élément commence à déborder en utilisant element.offsetHeight et element.scrollHeight . Si scrollHeight est plus grand que offsetHeight, votre taille de police est trop grande.
La recherche binaire est un bien meilleur algorithme pour cela. Il est également limité par le nombre d'itérations que vous souhaitez effectuer. Appelez simplement flexFont et insérez l'ID div et cela ajustera la taille de la police entre 8px et 96px .
J'ai passé un peu de temps à faire des recherches sur ce sujet et à essayer différentes bibliothèques, mais en fin de compte, je pense que c'est la solution la plus simple et la plus simple qui fonctionnera réellement.
Notez que si vous le souhaitez, vous pouvez modifier pour utiliser offsetWidth
et scrollWidth
, ou ajouter les deux à cette fonction.
// 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
};
}