zoukankan      html  css  js  c++  java
  • 如何用js自己实现Animate运动函数

    js运动是我们学习js必不可少的研究部分,首先我们要知道js的运动其实仅仅是不断改变元素的某个属性值而已,比如不断改变一个绝对定位div的left值,那么你看到的效果就是这个div不断的向右边运动,那么运动的原理就是这样。

    我们知道从a这一点到b这一点我们的运动方式有很多,

    1.比如匀速运动到这一点

    2.比如先快后慢,

    3.必须先慢后快等等

    所以我们的运动算法也有很多,那么下面我就图解一下如何写我们自己的运动算法

    先看匀速算法

    于是我们可以用js写出这段代码

            /** 运动算法
             * t:动画已经消耗的时间
             * b:小球初始位置
             * c:小球的需要移动额距离
             * 动画持续的总时间
             * */   
            var tween = {
                linear: function(t, b, c, d){
                    return c * t / d + b;
                }
            }    

    然后我们看看非匀速运动

    我们用代码写出来

    var tween = {
           strongEaseOut:function( t, b, c, d){
                return t * t *c / (d *d) + b;
           },
     }

    我们现在只是介绍两种不同的运动算法,当然运动算法还要很多,我们不意义例举,我们接着看如何写改变属性的js

    首先我们定义一个运动类

    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的原型上定义一个start方法,该方法表示运动开始

    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(){
                  //如果self返回false,则取消定时器
                  if( self.step()=== false ) {
                      clearInterval( timeId )
                  }
              },19)
     }
    

      上面的setInterval每隔19毫秒就会执行一次,每次都是执行step方法,step方法就是每次需要计算更新小球的位置

    Animate.prototype.step = function(){
            //目前的时间
            var t = +new Date;
            //如果时间超过开始时间和需要时间之和,则矫正目前的位置为目标位置
            if( t >= this.startTime + this.duration ) {
                    this.update( this.endPos )
                    return false;//返回false为了取消定时器
            }
            //计算小球的位置
            var pos = this.easing( t - this.startTime, this.startPos, this.endPos-this.startPos ,this.duration)
            //更新div的属性
            this.update( pos )
    }    
    

      那么update方法也仅仅就是更新div的属性而已

    //更新当前位置
     Animate.prototype.update = function( pos ){
           this.dom.style[ this.propertyName ] = pos + 'px'
     }
    

      接下来我们看看我们在html里面如何执行,html代码

    <div style="position: absolute;background: blue; 100px;height: 100px;left: 0;" id="div"></div>
    

      然后是执行代码

    var div = document.getElementById('div')
    var animate = new Animate( div )
    animate.start('left',500,5000,'linear')
    

      到现在我们整个运动就结束了

     完整的代码地址在我的github上https://github.com/jiangzhenfei/Animate/blob/master/index.html

  • 相关阅读:
    Protocol handler start failedCaused by: java.net.SocketException: Permission denied
    springboot无法获取证书内容
    IDEA中使用git合并分支的过程报错:cant checkout because of unmerged files
    IDEA中使用git报错Permission denied (publickey)
    linux常用的操作命令
    启动Tomcat报错:A child container failed during start
    linux下搭建redis内网端口映射工具-rinetd
    linux(centos)下安装supervisor进程管理工具
    SDBCI-WRCF2020-MI赛题成绩回顾
    Google搜索技巧
  • 原文地址:https://www.cnblogs.com/zhenfei-jiang/p/9115619.html
Copyright © 2011-2022 走看看