এটি আমি তৈরি করেছি সবচেয়ে মার্জিত সমাধান। এটি 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
};
}