यह सबसे सुंदर समाधान है जो मैंने बनाया है। यह 10 पुनरावृत्तियों कर बाइनरी खोज का उपयोग करता है। भोली तरह से कुछ समय के लिए किया गया था और जब तक कि तत्व अतिप्रवाह करने के लिए शुरू नहीं हुआ, तब तक फ़ॉन्ट का आकार 1 बढ़ा दिया गया। आप निर्धारित कर सकते एक तत्व का उपयोग कर अतिप्रवाह के लिए शुरू होता है जब element.offsetHeight और element.scrollHeight । यदि स्क्रॉलहाइट ऑफसेटहाइट से बड़ा है, तो आपके पास एक फ़ॉन्ट आकार है जो बहुत बड़ा है।
बाइनरी खोज इसके लिए एक बेहतर एल्गोरिथ्म है। यह आपके द्वारा किए जाने वाले पुनरावृत्तियों की संख्या से भी सीमित है। बस flexFont को कॉल करें और div आईडी डालें और यह 8px और 96px के बीच फ़ॉन्ट आकार को समायोजित करेगा ।
मैंने इस विषय पर शोध करने और विभिन्न पुस्तकालयों की कोशिश करने में कुछ समय बिताया है, लेकिन अंततः मुझे लगता है कि यह सबसे आसान और सबसे सरल समाधान है जो वास्तव में काम करेगा।
ध्यान दें कि यदि आप चाहते हैं कि आप इस फ़ंक्शन का उपयोग offsetWidth
और scrollWidth
, या दोनों को जोड़ सकते हैं ।
// 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
};
}