นี่เป็นทางออกที่งดงามที่สุดที่ฉันได้สร้างขึ้น มันใช้การค้นหาแบบไบนารีทำซ้ำ 10 วิธีที่ไร้เดียงสาคือการวนรอบสักครู่และเพิ่มขนาดตัวอักษร 1 จนกว่าองค์ประกอบจะเริ่มล้น คุณสามารถตรวจสอบเมื่อองค์ประกอบเริ่มล้นใช้element.offsetHeightและelement.scrollHeight หาก scrollHeight ใหญ่กว่า offsetHeight คุณจะมีขนาดตัวอักษรที่ใหญ่เกินไป
การค้นหาแบบไบนารี่เป็นอัลกอริทึมที่ดีกว่าสำหรับสิ่งนี้ นอกจากนี้ยังถูก จำกัด ด้วยจำนวนการวนซ้ำที่คุณต้องการเล่น เพียงโทร flexFont และใส่รหัส div และมันจะปรับขนาดตัวอักษรระหว่าง8pxและ96 พิกเซล
ฉันใช้เวลาค้นคว้าหัวข้อนี้และลองใช้ห้องสมุดที่แตกต่างกัน แต่ท้ายที่สุดฉันคิดว่านี่เป็นทางออกที่ง่ายที่สุดและตรงไปตรงมาที่สุดที่จะใช้งานได้จริง
หมายเหตุถ้าคุณต้องการคุณสามารถเปลี่ยนการใช้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
};
}