Иногда очень часто, когда совсем немного сильно хотят отказать мне в приёме на работу, просят примеры кода. Эта серия постов предназначена для решения такой проблемы.
Код полностью рабочий. Требует установки имени класса блока “js-fit-width
” и ширины блока в удобных единицах измерения.
Читайте комментарии в коде.
(function () {
//##########
//region MAIN
/**
* Scans classes "js-fit-width" and accommodates font size to fit container.
* IMPORTANT:
* CSS width of a container
* AND
* CSS font-size of a container
* ARE TO BE SET. Play with such units as VW, CH, FR
*/
const fontSizeLimit = 2;
const fontSizeStep = -2;
const fontSizeFirstAttribute = 'data-font-size-first';
function domFitFontSize(event) {
const itemList = document.getElementsByClassName('js-fit-width')
for (let i = 0; i < itemList.length; i++) {
const element = itemList[i];
const innerText = element.innerText;
const clientWidth = element.clientWidth;
const fontFamily = getFontFamily(element)
//Check if Text goes beyond
let fontSizeFirst = 0.0;
if (element.hasAttribute(fontSizeFirstAttribute)) {
fontSizeFirst = element.getAttribute(fontSizeFirstAttribute);
} else {
fontSizeFirst = getFontSize(element);
element.setAttribute(fontSizeFirstAttribute, fontSizeFirst);
}
fontSizeFirst = parseFloat(fontSizeFirst);
const strWidthFirst = calcWidth(innerText, fontSizeFirst, fontFamily);
if (strWidthFirst < clientWidth) {
element.style.fontSize = `${fontSizeFirst}px`;
continue;
}
let fs = fontSizeFirst;
for (fs; fs >= fontSizeLimit; fs += fontSizeStep) {
const strWidth = calcWidth(innerText, fs, fontFamily);
if (strWidth < clientWidth) {
element.style.fontSize = `${fs}px`;
break;
}
}
}
return null;
}
//endregion MAIN
//##########
//region HELPERS
// Create CANVAS object and retrieve drawing context
const canvas = document.createElement('canvas');
const canvasContext = canvas.getContext('2d');
function calcWidth(str, fontSize, fontFamily) {
// set FONT SIZE and FONT FAMILY
canvasContext.font = `${fontSize}px ${fontFamily}`;
// Measure WIDTH of the ROW
return canvasContext.measureText(str).width;
}
function getFontSize(element) {
var style = window.getComputedStyle(element, null).getPropertyValue('font-size');
return parseFloat(style);
}
function getFontFamily(element) {
return window.getComputedStyle(element, null).getPropertyValue('font-family');
}
//endregion HELPERS
//##########
//region USAGE
domFitFontSize();
let timer = 0;
window.addEventListener("resize", function () {
clearTimeout(timer);
timer = setTimeout(domFitFontSize, 200);
});
//endregion USAGE
//##########
})();