I'm trying to make a image shake on mouse over, I got it to shake but it seems to shake constantly rather then on mouseover.
vibrate.js (uses the vibrate plugin http://andreaslager开发者_开发知识库kvist.com/jquery/vibrate/ )
jQuery(document).ready(function() {
jQuery(".bottles").mouseover( function() {
// configurations for the buzzing effect. Be careful not to make it too annoying!
var conf = {
frequency: 6000,
spread: 7,
duration: 700
};
// this is the call we make when the AJAX callback function indicates a login failure
jQuery(this).vibrate(conf);
});
});
html
<div id="bottle">
<img class="bottles" src="/images/_garlic.png">
</div>
How would I stop that function from shaking?
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();});
jsFiddle example
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 erik@birdy.nu 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 absolute
ly positioned element.
take a look at the source of this page: (view source then scroll down)
http://www.bennadel.com/resources/demo/jquery_vibrate_plugin/
精彩评论