window.addEvent('domready', function(){
var log = $('log');
var menu = new BouncyMenu('container',{
duration: 250,
onMouseenter: function(element){
log.set('html', element.get('html'));
}
});
$('detach').addEvent('click', function(){
menu.detach();
});
$('attach').addEvent('click', function(){
menu.attach();
});
});
var BouncyMenu = new Class({
Implements: [Options, Events],
options: {
/*
onMouseenter: $empty,
onMouseleave: $empty,
*/
duration: 500,
distance: 30
},
initialize: function(element, options){
this.setOptions(options);
this.elements = document.id(element).getChildren();
this.setupElements();
this.attach();
},
setupElements: function(){
this.elements.each(function(element){
element
.store('originalPadding', element.getStyle('padding-top'))
.set('tween',{
duration: this.options.duration
});
}, this);
},
attach: function(){
this.elements.each(function(element){
var events = {
mouseenter: function(){
element
.set('tween',{ transition: 'bounce:out' })
.tween('padding-top', this.options.distance);
this.fireEvent('mouseenter', element);
}.bind(this),
mouseleave: function(){
element
.set('tween',{ transition: 'circ:out' })
.tween('padding-top', element.retrieve('originalPadding'));
this.fireEvent('mouseleave', element);
}.bind(this)
};
element.store('menuEvents', events);
element.addEvents(events);
}, this);
return this;
},
detach: function(){
this.elements.each(function(element){
element.removeEvents(element.retrieve('menuEvents'));
});
return this;
}
});
<button id="detach">detach</button> <button id="attach">attach</button> <span id="log">Waiting ...</span>
<ul id="container">
<li>The Dark Knight</li>
<li>The Joker</li>
<li>Two Face</li>
<li>Alfred</li>
</ul>
li {
float: left;
padding: 10px;
padding-top: 10px;
background: #f0f0f0;
margin: 4px;
cursor: pointer;
color: #333;
border-bottom: solid 1px #aaa;
}
ul#container {
min-width: 400px;
}
body {
font-family: helvetica, arial;
font-size: 12px;
}