JS实现div的抖动:缓动式抖动

代码如下:

<!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>
            var div1 = document.querySelector('#div1');

            document.onclick = function() {

                /*
                 * 抖动:
                 * 1. 每次改变一下元素的位置
                 * 按照一个中心点进行偏移,假设中心点left原始是400,那么每次就以left:400为中心做位置的移动
                 * 380 -> 420
                 * */

                // div1.style.left = '380px';
                // div1.style.left = '420px';

                var a = true;

                setInterval(function() {

                    /*
                     * 根据a的值,做不同的设置
                     * */
                    div1.style.left = (a ? 380 : 420) + 'px';//这样可以实现小幅度的抖动效果,但是大幅度的抖动就会显得很生硬
            
                    a = !a;

                }, 30);

            }
      /*缓动代码*/            
      var tween = {
          linear:function(t,b,c,d){
              return c*t/d + b;
          },
          easeIn:function(t,b,c,d){
              return c * ( t /= d ) * t + b;
          },
          strongEaseIn:function(t,b,c,d){
              return c * ( t /= d ) * t * t * t * t + b;
          },
          strongEaseOut:function(t,b,c,d){
              return c * ( ( t = t / d -1 ) * t * t * t * t +1 ) + b;
          },
          sineaseIn:function(t,b,c,d){
              return c * ( t /= d ) * t * t + b;    
          },
          sineaseOut:function(t,b,c,d){
              return c * ( ( t = t / d -1 ) * t * t *t +1 ) + b;
          }
      };

      var Animate = 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 = +new Date;
          this.startPos = this.dom.getBoundingClientRect()[propertyName];
          this.propertyName = propertyName;
          this.endPos = endPos;
          this.duration = duration;
          this.easing = tween[easing];

          var self = this;
          var timeId = setInterval(function(){
              if(self.step() === false){
                  clearInterval(timeId);
              }
          },19);
      }

      Animate.prototype.step = function(){
          var t = +new Date;
          if(t>=this.startTime + this.duration){
              this.update(this.endPos);
              return false;
          }
          var pos = 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;
      var div = document.getElementById('div');
      var animate = new Animate(div);
      setInterval(function() {
        animate.start('left',(a ? 380 : 420),1000,'strongEaseOut');//如果用缓动的效果来实现较大幅度的抖动,那视觉上就可以看到更舒适了
        a = !a;
      }, 30);
    </script> 

  </body>

</html>

 

转载于:https://www.cnblogs.com/dreambin/p/9288363.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值