I was looking for a very tiny and light solution to fit a text inside a box. The box’ height and width are fixed. I only found some great solutions like BigText but I didn’t want to have jQuery loaded.
Finally I found some code on StackOverflow and also at Coderwall. I created my own solution that could only work with my own HTML code… but I share it here, maybe that could help someone else.
The HTML code:
This is my text !
The related CSS code:
.ribbon-front { overflow:hidden }
And the JavaScript code:
var autoSizeText = function(selector) {
"use strict";
var el, elements, i, len, style, fontSize, IEoffsetHeight;
elements = document.querySelectorAll(selector);
if (elements.length <= 0) return;
for (i=0, len = elements.length; i < len; i++) {
el = elements[i];
// we start from 0px and we grow by 0.5 until the content is too large
fontSize=0;
el.style.fontSize = "0px";
// fix for all IE : I cache the offsetHeight, and if it becomes really bigger than the previous value, then we stop!
IEoffsetHeight = el.offsetHeight;
// check if our content is out its box
while (el.scrollHeight===0 || el.scrollHeight >= el.offsetHeight) {
fontSize += 0.5;
el.style.fontSize = fontSize + 'px';
if (el.offsetHeight - IEoffsetHeight > 10) break;
IEoffsetHeight = el.offsetHeight;
}
el.style.fontSize = (fontSize - 0.5) + 'px';
}
};
autoSizeText('.ribbon-front > span');
It works for IE8-IE10 and with all modern browsers.
You can see a demo at codepen.
WOW.. thanks for the great script.. really COOL!!
There is one small bug that I can’t get around though.. if my string under the span tag only contains one single word, I get an infinite loop and my page doesn’t load
I ran a few tests, and indeed that doesn’t work with only one word…. It seems more like a browser bug I think. I tried a few things without success…