A jQuery-free component that quickly fits single and multi-line text to the width (and optionally height) of its container.
textFit- Hassle-Free Text Fitting
A fast, dependency-free text sizing component that quickly fits single and multi-line text to the width and/or height of its container.
textFitis:
log ntime, making it far faster than most solutions.
<1ms. See the implementation details.
4.1KBminified and
1.5KBgzipped.
textFitsupports IE9+, Firefox, Chrome, Opera, and most mobile browsers. If you find an incompatibility, please file an issue.
If you require IE <= 8 support, please use the jQuery version. Functionality is identical between v1.0 and v2.0, the only change was the removal of the jQuery dependency.
HTMLCollectionobjects.
alignVertWithFlexbox. This does better vertical alignment and fixes #14.
options.suppressErrors. Wrap in
try/catchinstead if you really need this.
alignVertwhen reprocessing.
reProcessis now
trueby default. Set to
falseif you want to fire-and-forget on potentially processed nodes. This was originally false by default because it was being used in an infinite scrolling list.
Fit me, I am some text
// textFit accepts arrays textFit(document.getElementsByClassName('box')); // or single DOM elements textFit(document.getElementsByClassName('box')[0]); // Use jQuery selectors if you like. textFit($('#box')[0])
The text will scale until it reaches the horizontal or vertical bounds of the box. Explicit width and height styles are required in order to fit the text.
If your text has multiple lines, textFit() will automatically detect that and disable white-space: no-wrap! No changes are necessary.
This text
Has multiple lines
Fit me!
textFit(document.getElementsByClassName('box'))
If, for some reason, the automatic detection is not working out for you, use the following to explicitly turn on multiLine fitting:
textFit(document.getElementsByClassName('box'), {multiLine: true})
This text
Has multiple lines
And wants to be centered horizontally and vertically
Fit me!
textFit(document.getElementsByClassName('box'), {alignHoriz: true, alignVert: true})
Sometimes you want to make sure that your text remains sanely sizes if it is very short or very long. textFit has you covered:
Short Text
textFit(document.getElementsByClassName('box'), {minFontSize:10, maxFontSize: 50})
textFit determines reasonable minimum and maximum bounds for your text. The defaults are listed below.
To ensure accurate results with various font-faces, line-heights, and letter-spacings, textFit resizes the text until it fits the box as accurately as possible. Unlike many similar plugins, textFit uses binary search to find the correct fit, which speeds the process significantly. textFit is fast enough to use in production websites.
textFit()is a synchronous function. Because of this, resizes should be invisible as the render thread does not have a chance to do a layout until completion. Normal processing times should be < 1ms and should not significantly block renders.
From the source, for reference:
settings = { alignVert: false, // if true, textFit will align vertically using css tables alignHoriz: false, // if true, textFit will set text-align: center multiLine: false, // if true, textFit will not set white-space: no-wrap detectMultiLine: true, // disable to turn off automatic multi-line sensing minFontSize: 6, maxFontSize: 80, reProcess: true, // if true, textFit will re-process already-fit nodes. Set to 'false' for better performance widthOnly: false, // if true, textFit will fit text to element width, regardless of text height alignVertWithFlexbox: false, // if true, textFit will use flexbox for vertical alignment };
MIT