JavaScript运动框架 链式运动到完美运动(五)


Posted in Javascript onMay 18, 2017

基于前几篇的运动框架基础,本文主要讲解一下链式运动,就是运动完后接着再运动,比如很多网站中,一个方框的出现和退出:出现时先变宽再变高,退出时先变矮再变窄退出!
之前的模型是:

startMove(obj, json);

现在改为:

startMove(obj, json, fn);

也就是在第一次运动结束的时候执行fn(); fn是传过来的一个参数,这个参数是个函数,定时器清理之后手动运行fn();如果想采用链式运动,那就是在fn中再调用startMove(obj, json, fn),再在里面的fn中调用startMove(obj, json, fn),可以一直玩下去

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>运动框架(五):链式运动到完美运动</title>
  <style type="text/css">
    div {
      width: 100px;
      height: 100px;
      background: orange;
      margin: 10px;
      float: left;
    }
  </style>
</head>
<body>
  <div id="div1"></div>

  <script type="text/javascript">
    var oDiv = document.getElementById('div1');
    oDiv.onmouseover = function() {
      startMove(oDiv, {width:300,opacity:30}, function() {
        startMove(oDiv, {height:500});
      });
    };
    oDiv.onmouseout = function() {
      startMove(oDiv, {height:100}, function() {
        startMove(oDiv, {width:100,opacity:100});
      })
    };

    function getStyle(obj, attr) {
      if (obj.currentStyle) {
        return obj.currentStyle[attr];
      } else {
        return getComputedStyle(obj, null)[attr];
      }
    }

    function startMove(obj, json, fn) {
      clearInterval(obj.timer);
      obj.timer = setInterval(function() {
        var bStop = true;
        for (var attr in json) {
          var cur = 0;
          if (attr === 'opacity') {
            cur = Math.round(parseFloat(getStyle(obj, attr)) * 100);
          } else {
            cur = parseInt(getStyle(obj, attr));
          }
          if (cur != json[attr]) {
            bStop = false;
          }
          var speed = (json[attr] - cur)/10;
          speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed);
          cur += speed;
          if (attr === 'opacity') {
            obj.style.filter = 'alpha(opacity:' + cur + ')';
            obj.style.opacity = cur/100;
          } else {
            obj.style[attr] = cur + 'px';
          }

        }
        if (bStop) {
          clearInterval(obj.timer);
          if (fn) fn();
        }

      }, 30);
    }
  </script>
</body>
</html>

最后提取出来的完美运动框架如下,motionFrame.js:

function getStyle(obj, attr) {
  if (obj.currentStyle) {
    return obj.currentStyle[attr];
  } else {
    return getComputedStyle(obj, null)[attr];
  }
}

function startMove(obj, json, fn) {
  clearInterval(obj.timer);
  obj.timer = setInterval(function() {
    var bStop = true;
    for (var attr in json) {
      var cur = 0;
      if (attr === 'opacity') {
        cur = Math.round(parseFloat(getStyle(obj, attr)) * 100);
      } else {
        cur = parseInt(getStyle(obj, attr));
      }
      if (cur != json[attr]) {
        bStop = false;
      }
      var speed = (json[attr] - cur)/10;
      speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed);
      cur += speed;
      if (attr === 'opacity') {
        obj.style.filter = 'alpha(opacity:' + cur + ')';
        obj.style.opacity = cur/100;
      } else {
        obj.style[attr] = cur + 'px';
      }

    }
    if (bStop) {
      clearInterval(obj.timer);
      if (fn) fn();
    }

  }, 30);
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript instanceof 与typeof使用说明
Jan 11 Javascript
JavaScript与Div对层定位和移动获得坐标的实现代码
Sep 08 Javascript
js页面跳转的问题(跳转到父页面、最外层页面、本页面)
Aug 14 Javascript
提高jQuery性能的十个诀窍
Nov 14 Javascript
jQuery中scrollTop()方法用法实例
Jan 16 Javascript
JS实现黑色大气的二级导航菜单效果
Sep 18 Javascript
浅谈js构造函数的方法与原型prototype
Jul 04 Javascript
15个非常实用的JavaScript代码片段
Dec 18 Javascript
AngularJS常见过滤器用法实例总结
Jul 06 Javascript
基于vue实现网站前台的权限管理(前后端分离实践)
Jan 13 Javascript
webpack+vuex+axios 跨域请求数据的示例代码
Mar 06 Javascript
基于ajax实现上传图片代码示例解析
Dec 03 Javascript
JavaScript运动框架 多值运动(四)
May 18 #Javascript
微信小程序页面开发注意事项整理
May 18 #Javascript
基于BootStrap的前端分页带省略号和上下页效果
May 18 #Javascript
微信小程序网络请求wx.request详解及实例
May 18 #Javascript
微信小程序实现锚点定位楼层跳跃的实例
May 18 #Javascript
Vue2 使用 Echarts 创建图表实例代码
May 18 #Javascript
AngularJS折叠菜单实现方法示例
May 18 #Javascript
You might like
2020年4月放送决定!第2期TV动画《邪神酱飞踢》视觉图&主题曲情报公开!
2020/03/06 日漫
php发送短信验证码完成注册功能
2015/11/24 PHP
Ajax+PHP实现的模拟进度条功能示例
2019/02/11 PHP
php中get_object_vars()在数组的实例用法
2021/02/22 PHP
基于jquery的高性能td和input切换并可修改内容实现代码
2011/01/09 Javascript
Javascript中valueOf与toString区别浅析
2013/03/19 Javascript
在js中判断checkboxlist(.net控件客户端id)是否有选中
2013/04/11 Javascript
基于MVC3方式实现下拉列表联动(JQuery)
2013/09/02 Javascript
浅谈jQuery中对象遍历.eq().first().last().slice()方法
2014/11/26 Javascript
JavaScript中的console.profile()函数详细介绍
2014/12/29 Javascript
使用jquery制作弹出框效果
2015/04/03 Javascript
javascript下使用Promise封装FileReader
2016/02/19 Javascript
Js的Array数组对象详解
2016/02/22 Javascript
jQuery简单验证上传文件大小及类型的方法
2016/06/02 Javascript
AngularJS基础 ng-value 指令简单示例
2016/08/03 Javascript
Node.js连接mongodb实例代码
2017/06/06 Javascript
JavaScript实现简单的树形菜单效果
2017/06/23 Javascript
vue解决跨域路由冲突问题思路解析
2017/11/03 Javascript
vue.js中created方法作用
2018/03/30 Javascript
详解auto-vue-file:一个自动创建vue组件的包
2019/04/26 Javascript
[00:43]魔廷新尊——痛苦女王至宝捆绑包
2020/06/12 DOTA
Python找出9个连续的空闲端口
2016/02/01 Python
Python多进程与服务器并发原理及用法实例分析
2018/08/21 Python
Django中使用MySQL5.5的教程
2019/12/18 Python
英国网上购买肉类网站:Great British Meat
2018/10/17 全球购物
英国婴儿产品专家:Samuel Johnston
2020/04/20 全球购物
网上商城创业计划书范文
2014/01/31 职场文书
小学班干部竞选演讲稿
2014/04/24 职场文书
社区春季防火方案
2014/06/02 职场文书
幼儿园植树节活动总结
2014/07/04 职场文书
毕业实习证明(4篇)
2014/10/28 职场文书
2014年班主任德育工作总结
2014/12/05 职场文书
2015小学新教师个人工作总结
2015/10/14 职场文书
医院岗前培训心得体会
2016/01/08 职场文书
Python网络编程之ZeroMQ知识总结
2021/04/25 Python
为自由献出你的心脏!「进击的巨人展 FINAL」2022年6月在台开展
2022/04/13 日漫