Resize font depending on string length
You should make familiar with using plugins, they save you much time and of course they're very reliable (they are written by experienced scripters/programmers and have been tested by community). However looks like you want some pure JS solution. I've just made this code for you. It works fairly OK (although I'm not sure if it's as good as some plugins). The only requirement is the element (which you want to adjust the font-size accordingly to the text length) should contain plain text, not some HTML code.
The idea to implement it using pure JS is simple, you need some dummy element created using script, this dummy element is used to measure the size of the text. We need to adjust the font-size of the dummy element until the size of the text (as well as of the dummy element) should be confined to the size of the element (whose font-size you want to adjust). I made the code very clearly, hope you understand it better after reading the code:
//we just need 1 dummy element for the whole page.
var dummy = document.createElement('div');
dummy.className = 'dummy';
var inSingleLineMode, inMultilineMode;
//function used to adjust the font-size of the element
//so that the width is fixed (single-line mode) or both the width and height are
//fixed (multi-line mode), of course the text should be contained within
//the fixed width and height.
function adjustFontSize(element, singleLine){
if(!element.innerHTML) return;
var elementStyle = getComputedStyle(element);
dummy.style.font = elementStyle.font;
initMode(singleLine, function(){ dummy.style.width = elementStyle.width });
dummy.style.padding = elementStyle.padding;
dummy.style.boxSizing = elementStyle.boxSizing;
dummy.innerHTML = element.innerHTML;
document.body.appendChild(dummy);
var dummyStyle = getComputedStyle(dummy);
while(singleLine ? parseInt(dummyStyle.width) < parseInt(elementStyle.width) :
parseInt(dummyStyle.height) < parseInt(elementStyle.height)){
dummy.style.fontSize = parseFloat(dummyStyle.fontSize) + 1 + 'px';
dummyStyle = getComputedStyle(dummy);
}
while(singleLine ? parseInt(dummyStyle.width) > parseInt(elementStyle.width) :
parseInt(dummyStyle.height) > parseInt(elementStyle.height)){
dummy.style.fontSize = parseFloat(dummyStyle.fontSize) - 1 + 'px';
dummyStyle = getComputedStyle(dummy);
}
element.style.fontSize = dummyStyle.fontSize;
document.body.removeChild(dummy);
}
function initMode(singleLine, callback){
if(!dummy) return;
if(singleLine&&!inSingleLineMode) {
dummy.style.whiteSpace = 'nowrap';
dummy.style.width = 'auto';
dummy.style.display = "inline-block";
inSingleLineMode = true;
inMultiLineMode = false;
} else if(!singleLine&&!inMultilineMode) {
if(callback) callback();
dummy.style.whiteSpace = 'initial';
dummy.style.display = "block";
dummy.style.wordWrap = 'break-word';
inMultilineMode = true;
inSingleLineMode = false;
}
}
Demo.
In the demo, you can see that the first menu #menu1
is the Vietnamese word meaning Chrysanthemum while the second menu #menu2
is of course the English word Chrysanthemum. They have much different length, however both are supposed to have fixed width of 100px
, hence the second menu #menu2
should have smaller font-size to fit the space.
Resizing a font with pure JavaScript based on string length
An idea for this solution is actually really simple. Check out my codepen here.
Using a simple while loop which checks clientWidth against scrollWidth which you can learn more about here, we use the javascript .style.fontSize = "smaller"
which decreases the font size by 1 unit. This works well when we don't know what unit is assigned in the CSS. You can read more about it here.
Hope this helps.
document.onreadystatechange = () => { if (document.readyState === 'complete') { var container = document.getElementById("test"); while (container.scrollWidth > container.clientWidth) { container.style.fontSize = "smaller"; } }};
.test { width: 200px; border: 1px solid black; font-size: 16px;}
<div class="test">Blablabla</div>
<div class="test" id="test">Blablabla12124e121211asdasasas</div>
Change font-size based on string length in Vuejs
You can use conditionals in class
<div :class="user.full_name.length<20? 'welcome': 'welcomeLarge'"></div>
Change font size according to length of text
This could be a useful read css-tricks
Instead of counting the words, use string length property.
Pure CSS to make font-size responsive based on dynamic amount of characters
Note: This solution changes based on viewport size and not the amount of content
I just found out that this is possible using VW units. They're the units associated with setting the viewport width. There are some drawbacks, such as lack of legacy browser support, but this is definitely something to seriously consider using. Plus you can still provide fallbacks for older browsers like so:
p {
font-size: 30px;
font-size: 3.5vw;
}
http://css-tricks.com/viewport-sized-typography/
and
https://medium.com/design-ux/66bddb327bb1
Related Topics
Ie Uses Courier Font When "Font-Family: Monospace" Is Used
How to Scroll Programmatically a Div with Its Own Scrollbars
Best Practice to Use Aria-Label as a Selector for Styling
Svg Circle File Stroke from Top in Anti Clockwise Direction on Windows
How to Make Same Layout for All Web Pages
Div at Bottom of Window and Adaptable Height Div
CSS: Multiple Attribute Selectors
HTML5 Canvas as CSS Background-Image
Strange Styling Through Injected Stylesheets in Chrome
CSS Apply Styling to All Elements Except Those in The Last Row
How to Style Contenteditable in Firefox
How to Overlay a Div Over a Canvas CSS
Adding Transition to a Different Property
Will Whitespace or Wrap Be Ignored Between Two Block Elements in HTML