Đây là giải pháp thanh lịch nhất mà tôi đã tạo ra. Nó sử dụng tìm kiếm nhị phân, thực hiện 10 lần lặp. Cách ngây thơ là thực hiện một vòng lặp while và tăng kích thước phông chữ lên 1 cho đến khi phần tử bắt đầu tràn. Bạn có thể xác định khi một phần tử bắt đầu tràn bằng cách sử dụng phần tử.offsetHeight và Element.scrollHeight . Nếu scrollHeight lớn hơn offsetHeight, bạn có kích thước phông chữ quá lớn.
Tìm kiếm nhị phân là một thuật toán tốt hơn nhiều cho việc này. Nó cũng bị giới hạn bởi số lần lặp bạn muốn thực hiện. Chỉ cần gọi flexFont và chèn id id và nó sẽ điều chỉnh kích thước phông chữ trong khoảng từ 8px đến 96px .
Tôi đã dành thời gian nghiên cứu chủ đề này và thử các thư viện khác nhau, nhưng cuối cùng tôi nghĩ đây là giải pháp đơn giản và đơn giản nhất sẽ thực sự hiệu quả.
Lưu ý nếu bạn muốn, bạn có thể thay đổi để sử dụng offsetWidth
và scrollWidth
, hoặc thêm cả hai vào chức năng này.
// 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
};
}