// ****** THE CLASS ****** //
var FitText=new Class({Implements:Options,options:{offset:10,fitClass:'truncated'},initialize:function(container,elements,options){this.setOptions(options);this.container=document.id(container);this.elements=$$(elements);this.bound=this.fit.bind(this);this.elements.each(function(element){element.store('scrollWidth',element.getSize().x).store('text',element.get('text'));}.bind(this));this.attach();this.fit();},fit:function(){contentWidth=this.container.getSize().x-this.options.offset;this.elements.each(function(element,index){var scrollWidth=element.retrieve('scrollWidth');var text=element.retrieve('text');if(scrollWidth>contentWidth){element.addClass(this.options.fitClass);var length=((text.length*(contentWidth/scrollWidth))/2).round();var truncatedText=text.substr(0,length)+'...'+text.substr(-length+6);element.set('text',truncatedText);}else if(element.hasClass(this.options.fitClass)){element.removeClass(this.options.fitClass);element.set('text',text);}}.bind(this));return this;},attach:function(){window.addEvent('resize',this.bound);return this;},detach:function(){window.removeEvent('resize',this.bound);return this;},reset:function(){this.elements.each(function(element){element.removeClass(this.options.fitClass).set('text',element.retrieve('text'));}.bind(this));return this;}});
// ****** USAGE ****** //
var fit = new FitText('container','li > span',{
offset: 40,
fitClass: 'highlight'
});
// ****** TEST ****** //
var resizable = $('resizable');
resizable.makeResizable({
handle: 'handle',
modifiers: {'x':'width', 'y':false},
onDrag: function(){
if(resizable.getSize().x < 200) this.stop();
fit.fit();
}
});
$('attachment').addEvent('click',function(){
if(this.get('text') == 'Detach') {
fit.detach();
this.set('text','Attach');
} else {
fit.attach().fit();
this.set('text','Detach');
}
});
$('reset').addEvent('click',function(){
fit.reset();
});
$('fit').addEvent('click',function(){
fit.fit();
});
<h2>Resize the box</h2>
<p>The lines should:</p>
<ul>
<li>Truncate with an ellipses near the middle.</li>
<li>Receive a class (highlight) when truncated, and lose it when not</li>
</ul>
<div id="resizable">
<ul id="container">
<li><span>Lorem ipsum dolor</span></li>
<li><span>sit amet, consectetur adipisicing</span></li>
<li><span>elit, sed do eiusmod tempor incididunt ut labore et</span></li>
<li><span>dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco</span></li>
<li><span>laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate</span></li>
</ul>
<div id="handle"></div>
</div>
<h2>Public Methods</h2>
<div class="methods">
<button id="attachment" class="attached">Detach</button>
<button id="reset">Reset</button>
<button id="fit">Fit</button>
</div>
ul#container {
padding: 4px;
padding-left: 2em;
list-style: square;
}
ul#container li {
white-space: nowrap;
padding: 0;
margin-bottom: 8px;
margin-top: 8px;
list-style: square;
}
.highlight {
color: #e40053;
}
div#resizable {
position: relative;
margin: 10px;
border: solid 5px #585858;
background: #000;
color: #fff;
}
div#handle {
position: absolute;
bottom: 0;
right: 0;
background: #0094d5;
cursor: col-resize;
height: 16px;
width: 16px;
}
/* @group global */
body {
font-family: Helvetica, arial;
background: #fff;
}
h1 {
font-size: 2em;
color: #0094d5;
margin-bottom: .5em;
margin-top: .5em;
}
h2 {
color: #43aa38;
font-size: 1.5em;
margin-bottom: .5em;
margin-top: .5em;
}
ul {
padding-left: 2em;
list-style: disc;
}
/* @end */