<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width">
<title>JS Bin</title>
</head>
<body>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
<br>
<br>
<div class="textfill increase-font">Orig Content</div>
<br>
<div class="textfill decrease-font">tent</div>
<br>
<button type="button" onclick="FitAll()">Fit Text</button>
</body>
</html>
div.textfill{
background-color: lightgreen;
max-width: 222px;
//position: absolute;
width: 177px;
//height: 50px;
padding: 0px;
font-family: Trebuchet MS, helvetica, arial,sans-serif;
font-weight: bold;
}
div.increase-font{
font-size: 15px;
}
div.decrease-font{
font-size: 64px;
}
function measureText(pText, pFontSize, pFamily, pWeight) {
var lDiv = document.createElement('div');
document.body.appendChild(lDiv);
if (pFamily != null) {
lDiv.style.fontFamily = pFamily;
}
if (pWeight != null) {
lDiv.style.fontWeight = pWeight;
}
lDiv.style.fontSize = "" + pFontSize + "px";
lDiv.style.position = "absolute";
lDiv.style.left = -1000;
lDiv.style.top = -1000;
lDiv.innerHTML = pText;
var lResult = {
width: lDiv.clientWidth,
height: lDiv.clientHeight
};
document.body.removeChild(lDiv);
lDiv = null;
return lResult;
}
/**
* @requires jQuery
* @param el a jQuery element
*/
function fitText(el){
var text = el.text();
var fsize = parseFloat(el.css('font-size'));
var fam = el.css('font-family');
var weight = el.css('font-weight');
var measured = measureText(text, fsize, fam, weight);
if (measured.width > el.width()){
console.log('reducing');
while(true){
fsize = parseFloat(el.css('font-size'));
var m = measureText(text, fsize, fam, weight);
if(m.width > el.width()){
el.css('font-size', fsize-0.25 + 'px');
}
else{
break;
}
}
}
else if (measured.width < el.width()){
console.log('increasing');
while(true){
fsize = parseFloat(el.css('font-size'));
var m = measureText(text, fsize, fam, weight);
if(m.width < el.width()){ // not sure why -4 is needed (often)
el.css('font-size', fsize+0.25 + 'px');
}
else{
break;
}
}
}
}
function FitAll(){
var newContent = [
'gonna make it really, really long',
'shorter'
];
$('.textfill').each(function(index, el){
$(el).text(newContent[index]);
//console.log($(el)[0].style);
fitText($(el));
})
}
$(document).ready(function(){
console.clear();
});
Output
You can jump to the latest bin by adding /latest
to your URL
Keyboard Shortcuts
Shortcut | Action |
---|---|
ctrl + [num] | Toggle nth panel |
ctrl + 0 | Close focused panel |
ctrl + enter | Re-render output. If console visible: run JS in console |
Ctrl + l | Clear the console |
ctrl + / | Toggle comment on selected lines |
ctrl + ] | Indents selected lines |
ctrl + [ | Unindents selected lines |
tab | Code complete & Emmet expand |
ctrl + shift + L | Beautify code in active panel |
ctrl + s | Save & lock current Bin from further changes |
ctrl + shift + s | Open the share options |
ctrl + y | Archive Bin |
Complete list of JS Bin shortcuts |
JS Bin URLs
URL | Action |
---|---|
/ | Show the full rendered output. This content will update in real time as it's updated from the /edit url. |
/edit | Edit the current bin |
/watch | Follow a Code Casting session |
/embed | Create an embeddable version of the bin |
/latest | Load the very latest bin (/latest goes in place of the revision) |
/[username]/last | View the last edited bin for this user |
/[username]/last/edit | Edit the last edited bin for this user |
/[username]/last/watch | Follow the Code Casting session for the latest bin for this user |
/quiet | Remove analytics and edit button from rendered output |
.js | Load only the JavaScript for a bin |
.css | Load only the CSS for a bin |
Except for username prefixed urls, the url may start with http://jsbin.com/abc and the url fragments can be added to the url to view it differently. |