代码如下:
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Title</title> <style> #div1 { width:100px; height:100px; position:absolute; left:400px; top:200px; background:red; } </style> </head> <body> <div id="div1"></div> <script> vardiv1 =document.querySelector('#div1'); document.onclick = function() { /* * 抖动: * 1. 每次改变一下元素的位置 * 按照一个中心点进行偏移,假设中心点left原始是400,那么每次就以left:400为中心做位置的移动 * 380 -> 420 * */ //div1.style.left = '380px'; //div1.style.left = '420px'; vara = true; setInterval(function() { /* * 根据a的值,做不同的设置 * */ div1.style.left =(a ? 380: 420) + 'px';//这样可以实现小幅度的抖动效果,但是大幅度的抖动就会显得很生硬 a = !a; }, 30); } /*缓动代码*/ vartween ={ linear:function(t,b,c,d){ returnc*t/d + b; }, easeIn:function(t,b,c,d){ returnc *( t /= d ) * t + b; }, strongEaseIn:function(t,b,c,d){ returnc *( t /= d ) * t * t * t * t + b; }, strongEaseOut:function(t,b,c,d){ returnc *( ( t =t /d -1) *t *t *t *t +1) +b; }, sineaseIn:function(t,b,c,d){ returnc *( t /= d ) * t * t + b; }, sineaseOut:function(t,b,c,d){ returnc *( ( t =t /d -1) *t *t *t +1) +b; } }; varAnimate = function(dom){ this.dom =dom; this.startTime = 0; this.startPos = 0; this.endPos = 0; this.propertyName = null; this.easing = null; this.duration = null; } Animate.prototype.start = function(propertyName,endPos,duration,easing){ this.startTime = +newDate; this.startPos = this.dom.getBoundingClientRect()[propertyName]; this.propertyName =propertyName; this.endPos =endPos; this.duration =duration; this.easing =tween[easing]; varself = this; vartimeId =setInterval(function(){ if(self.step() === false){ clearInterval(timeId); } },19); } Animate.prototype.step = function(){ vart = +newDate; if(t>=this.startTime + this.duration){ this.update(this.endPos); return false; } varpos = this.easing(t-this.startTime, this.startPos, this.endPos - this.startPos, this.duration); this.update(pos); } Animate.prototype.update = function(pos){ this.dom.style[this.propertyName] =pos + 'px'; } var b = true; vardiv =document.getElementById('div'); varanimate = newAnimate(div);
setInterval(function() {
animate.start('left',(a ? 380 : 420),1000,'strongEaseOut');//如果用缓动的效果来实现较大幅度的抖动,那视觉上就可以看到更舒适了
a = !a;
}, 30);
</script>
</body>
</html>