JavaScript反弹动画效果的实现代码


Posted in Javascript onJuly 13, 2017

代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Document</title>
  <style>
    #box{
      width:200px;
      height:200px;
      position: absolute;
      top:0;
      left:200px;
      background:lightblue;
    }
    .btn{
      position:absolute;
      top:200px;
      left:100px;
      height:50px;
    }
    .btn input{
      display:inline-block;
      margin-left:50px;
      outline: none;
      width:100px;
      height:50px;
      border:1px solid green;
      cursor:pointer;
    }
  </style>
</head>
<body>
  <div id='box'></div>
  <div class='btn'>
    <input type="button" value='向左' id='btnLeft'>
    <input type="button" value='向右' id='btnRight'>
  </div>
  <script>
    var oBox = document.getElementById("box");
    var minLeft = 0;
    var maxLeft = utils.win('clientWidth')-oBox.offsetWidth;
    var step = 5;
    var timer = null;
    function move(target){
      //target:告诉我要运动的目标位置
      window.clearTimeout(timer);
      var curLeft = utils.css(oBox,"left");
      if(curLeft<target){//向右走
        if(curLeft+step>target){//边界
          utils.css(oBox,"left",target);
          return;
        }
        curLeft+=step;
        utils.css(oBox,"left",curLeft)
      }else if(curLeft>target){//向左走
        if(curLeft-step<target){//边界
          utils.css(oBox,"left",target);
          return;
        }
        curLeft-=step;
        utils.css(oBox,"left",curLeft)
      }else{//不需要运动
        return;
      }
      // timer = window.setTimeout(move,10)//这里有一个问题,点击按钮第一次target的值是有的,但是第二次通过setTimeout执行的时候没有给target进行传值。是undefined
      timer = window.setTimeout(function(){
        move(target);
      },10)//这样使用匿名函数包裹一下,就解决了上面的问题,但是这样写性能不好,因为每一次到达时间的时候,都需要执行一次匿名函数(形成一个私有的作用域),在匿名函数中再执行move,但是move中需要用到的数据值在第一次执行的move方法中,需要把匿名函数形成的这个私有的作用域作为跳板找到之前的,这样就导致了匿名函数形成的这个私有的作用域不能销毁
    }
    document.getElementById('btnLeft').onclick = function(){
      move(minLeft)
    }
    document.getElementById('btnRight').onclick = function(){
      move(maxLeft)
    }
  </script>
</body>
</html>

为了解决上面性能不好的问题,下面是一个优化后的代码:里面在使用一个函数包裹,这样就只有move函数创建的一个私有作用域没有销毁,等到_move执行完毕,move就自然会进行销毁。

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Document</title>
  <style>
    #box{
      width:200px;
      height:200px;
      position: absolute;
      top:0;
      left:200px;
      background:lightblue;
    }
    .btn{
      position:absolute;
      top:200px;
      left:100px;
      height:50px;
    }
    .btn input{
      display:inline-block;
      margin-left:50px;
      outline: none;
      width:100px;
      height:50px;
      border:1px solid green;
      cursor:pointer;
    }
  </style>
</head>
<body>
  <div id='box'></div>
  <div class='btn'>
    <input type="button" value='向左' id='btnLeft'>
    <input type="button" value='向右' id='btnRight'>
  </div>
  <script>
    var oBox = document.getElementById("box");
    var minLeft = 0;
    var maxLeft = utils.win('clientWidth')-oBox.offsetWidth;
    var step = 5;
    var timer = null;
    function move(target){
      //target:告诉我要运动的目标位置
      _move();
      function _move(){
        window.clearTimeout(timer);
        var curLeft = utils.css(oBox,"left");
        if(curLeft<target){//向右走
          if(curLeft+step>target){//边界
            utils.css(oBox,"left",target);
            return;
          }
          curLeft+=step;
          utils.css(oBox,"left",curLeft)
        }else if(curLeft>target){//向左走
          if(curLeft-step<target){//边界
            utils.css(oBox,"left",target);
            return;
          }
          curLeft-=step;
          utils.css(oBox,"left",curLeft)
        }else{//不需要运动
          return;
        }
        timer = window.setTimeout(_move,10);
      }
    }
    document.getElementById('btnLeft').onclick = function(){
      move(minLeft)
    }
    document.getElementById('btnRight').onclick = function(){
      move(maxLeft)
    }
  </script>
</body>
</html>

注意:为了让当前的元素在同一时间只运行一个动画(下一个动画开始的时候首先把上一个动画的定时器清除掉):保证当前元素所有动画接收定时器返回值的那个变量需要共享,有两种方式:1、全局接收(例如上面的代码 var timer = null)2、给元素增加自定义属性(如下图所示)

JavaScript反弹动画效果的实现代码

总结:通过以上可以得出动画优化的四条规则:

1、边界判断加步长

2、清除没有用的定时器

3、在外层函数需要传参的时候,可以在里面在嵌套一层函数,避免作用域的累积。

4、把定时器的返回值存储在元素的自定义属性上,防止全局变量冲突和同一时间多个动画执行

以上所述是小编给大家介绍的JavaScript反弹动画效果的实现代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
麦鸡的TAB切换功能结合了javascript和css
Dec 17 Javascript
网页中的图片的处理方法与代码
Nov 26 Javascript
通过JS来判断页面控件是否获取焦点
Jan 03 Javascript
JavaScript动态添加style节点的方法
Jun 09 Javascript
使用AmplifyJS组件配合JavaScript进行编程的指南
Jul 28 Javascript
原生javascript实现图片放大镜效果
Jan 18 Javascript
浅谈JS如何实现真正的对象常量
Jun 25 Javascript
vue + element-ui实现简洁的导入导出功能
Dec 22 Javascript
用ES6的class模仿Vue写一个双向绑定的示例代码
Apr 20 Javascript
ionic3双击返回退出应用的方法
Sep 17 Javascript
.netcore+vue 实现压缩文件下载功能
Sep 24 Javascript
原生JS实现拖拽功能
Dec 16 Javascript
详解React-Native解决键盘遮挡问题(Keyboard遮挡问题)
Jul 13 #Javascript
详解vue-cli + webpack 多页面实例配置优化方法
Jul 13 #Javascript
Angular限制input框输入金额(是小数的话只保留两位小数点)
Jul 13 #Javascript
js实现图片上传预览原理分析
Jul 13 #Javascript
vue.js数据绑定的方法(单向、双向和一次性绑定)
Jul 13 #Javascript
Easyui Datagrid自定义按钮列(最后面的操作列)
Jul 13 #Javascript
AngularJS 实现点击按钮获取验证码功能实例代码
Jul 13 #Javascript
You might like
那些年一起学习的PHP(三)
2012/03/22 PHP
PHP利用MySQL保存session的实现思路及示例代码
2014/09/09 PHP
php数据访问之查询关键字
2016/05/09 PHP
Ajax和PHP正则表达式验证表单及验证码
2016/09/24 PHP
Web 前端设计模式--Dom重构 提高显示性能
2010/10/22 Javascript
Web前端设计模式  制作漂亮的弹出层
2010/10/29 Javascript
基于jquery的拖动布局插件
2011/11/25 Javascript
网页右侧悬浮滚动在线qq客服代码示例
2014/04/28 Javascript
jquery操作 iframe的方法
2014/12/03 Javascript
必备的JS调试技巧汇总
2016/07/20 Javascript
Jquery组件easyUi实现表单验证示例
2016/08/23 Javascript
快速解决vue在ios端下点击响应延时的问题
2018/08/27 Javascript
浅谈vue方法内的方法使用this的问题
2018/09/15 Javascript
小程序实现背景音乐播放和暂停
2020/06/19 Javascript
python里大整数相乘相关技巧指南
2014/09/12 Python
Python描述器descriptor详解
2015/02/03 Python
python中base64加密解密方法实例分析
2015/05/16 Python
NLTK 3.2.4 环境搭建教程
2018/09/19 Python
python3 小数位的四舍五入(用两种方法解决round 遇5不进)
2019/04/11 Python
python算法题 链表反转详解
2019/07/02 Python
Python K最近邻从原理到实现的方法
2019/08/15 Python
Python super()函数使用及多重继承
2020/05/06 Python
意大利巧克力店:Chocolate Shop
2019/07/24 全球购物
优秀毕业生自我鉴定
2014/01/19 职场文书
什么样的创业计划书可行性高?
2014/02/01 职场文书
乡镇交通安全实施方案
2014/03/29 职场文书
劳资协议书范本
2014/04/23 职场文书
假面舞会策划方案
2014/05/29 职场文书
社会实践活动总结范文
2014/07/03 职场文书
2014年医院工作总结
2014/11/20 职场文书
施工员岗位职责
2015/02/10 职场文书
幼儿园教师师德承诺书
2015/04/28 职场文书
公司出差管理制度范本
2015/08/05 职场文书
中秋节祝酒词
2015/08/12 职场文书
python如何读取和存储dict()与.json格式文件
2022/06/25 Python
Java代码规范与质量检测插件SonarLint的使用
2022/08/05 Java/Android