The reason it shakes constantly is that the plugin is set up to create an element that shakes intermittently.... for ever. The shake is produced with setInterval. setInterval is also used to trigger the intermittent periods of shaking.
Working from the plugin by Andreas Lagerkvist you linked to, just remove the never ending intermittent shakes by removing the setInterval() call to doVibration(). Then you can set how long you want it to vibrate on a hover (you don't want it to vibrate the entire time someone hovers... do you? that'd be annoying)
Put what you want to vibrate in a div and trigger the vibration with a .hover(). The advantage of hover is that it vibrate on both mouseenter and mouseleave if the user stops their mouse over the div.
$('#jquery-vibrate-example').hover(function() {$(this).vibrate();});
If you only want it to vibrate once just use .mouseenter()
$('#jquery-vibrate-example').mouseenter(function() {$(this).vibrate();});
When you call .vibrate() you can pass the speed, duration, and spread (I removed frequency) in as parts of an object literal to fine tune the vibration: $(this).vibrate({"speed":100,"duration":800,"spread":5}); for example. The larger the speed the slower it shakes, since speed is used directly in the setInterval() of the shaking. The other two are self explanatory:
jQuery.fn.vibrate = function (conf) {
var config = jQuery.extend({
speed: 30,
duration: 1000,
spread: 3
}, conf);
return this.each(function () {
var t = jQuery(this);
var vibrate = function () {
var topPos = Math.floor(Math.random() * config.spread) - ((config.spread - 1) / 2);
var leftPos = Math.floor(Math.random() * config.spread) - ((config.spread - 1) / 2);
var rotate = Math.floor(Math.random() * config.spread) - ((config.spread - 1) / 2);
t.css({
position: 'relative',
left: leftPos + 'px',
top: topPos + 'px',
WebkitTransform: 'rotate(' + rotate + 'deg)' // cheers to [email protected] for the rotation-idea
});
};
var doVibration = function () {
var vibrationInterval = setInterval(vibrate, config.speed);
var stopVibration = function () {
clearInterval(vibrationInterval);
t.css({
position: 'static',
WebkitTransform: 'rotate(0deg)'
});
};
setTimeout(stopVibration, config.duration);
};
doVibration();
});
};
Note: The plugin changes the positioning of your shaking item to relative... so you'll get funny results if you apply it to an originally absolutely positioned element.