Bu yarattığım en zarif çözüm. 10 yineleme yaparak ikili arama kullanır. Naif yol bir while döngüsü yapmak ve eleman taşmaya başlayana kadar yazı tipi boyutunu 1 arttırmaktı. Element.offsetHeight ve element.scrollHeight öğesini kullanarak bir öğenin ne zaman taşmaya başlayacağını belirleyebilirsiniz. . ScrollHeight ofsetHeight'tan büyükse, çok büyük bir yazı tipi boyutunuz vardır.
İkili arama bunun için çok daha iyi bir algoritmadır. Ayrıca, gerçekleştirmek istediğiniz yineleme sayısı ile sınırlıdır. Sadece flexFont'u arayın ve div kimliğini girin ve yazı tipi boyutunu 8px ile 96px arasında ayarlar .
Bu konuyu araştırmak ve farklı kütüphaneleri denemek için biraz zaman harcadım, ama sonuçta bunun gerçekten işe yarayacak en kolay ve en basit çözüm olduğunu düşünüyorum.
Kullanmak değiştirebilir isterseniz Not offsetWidth
ve scrollWidth
veya bu fonksiyona hem ekleyin.
// 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
};
}