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 相关文章推荐
js的event详解。
Sep 06 Javascript
Ext JS Grid在IE6 下宽度的问题解决方法
Feb 15 Javascript
javascript 关闭IE6、IE7
Jun 01 Javascript
Jquery选择器 $实现原理
Dec 02 Javascript
浅谈JavaScript中数组的增删改查
Jun 20 Javascript
清空元素html(&quot;&quot;) innerHTML=&quot;&quot; 与 empty()的区别和应用(推荐)
Aug 14 Javascript
Vue.js添加组件操作示例
Jun 13 Javascript
JavaScript设计模式之工厂模式简单实例教程
Jul 03 Javascript
解决vue 绑定对象内点击事件失效问题
Sep 05 Javascript
createObjectURL方法实现本地图片预览
Sep 30 Javascript
微信小程序iOS下拉白屏晃动问题解决方案
Oct 12 Javascript
koa2 数据api中间件设计模型的实现方法
Jul 13 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
thinkphp3.0输出重复两次的解决方法
2014/12/19 PHP
PHP编程获取音频文件时长的方法【基于getid3类】
2017/04/20 PHP
在Laravel5.6中使用Swoole的协程数据库查询
2018/06/15 PHP
支持ie与FireFox的剪切板操作代码
2009/09/28 Javascript
JavaScript.Encode手动解码技巧
2010/07/14 Javascript
JavaScript设计模式之策略模式实例
2014/10/10 Javascript
jQuery实用技巧必备(下)
2015/11/03 Javascript
纯JavaScript代码实现文本比较工具
2016/02/17 Javascript
jQuery自制提示框tooltip改进版
2016/08/01 Javascript
JS实现显示带倒影的图片横排居中放大展示特效实例【测试可用】
2016/08/23 Javascript
nodejs实现邮件发送服务实例分享
2017/03/29 NodeJs
详解设置Webstorm 利用babel将ES6自动转码成ES5
2017/12/20 Javascript
解决axios会发送两次请求,有个OPTIONS请求的问题
2018/10/25 Javascript
vue轮播组件实现$children和$parent 附带好用的gif录制工具
2019/09/26 Javascript
[01:16:16]DOTA2-DPC中国联赛定级赛 RNG vs Phoenix BO3第二场 1月8日
2021/03/11 DOTA
[01:07:15]DOTA2-DPC中国联赛 正赛 DLG vs XG BO3 第二场 1月25日
2021/03/11 DOTA
浅谈Python NLP入门教程
2017/12/25 Python
python如何实现一个刷网页小程序
2018/11/27 Python
Python3爬虫学习之应对网站反爬虫机制的方法分析
2018/12/12 Python
将python文件打包成EXE应用程序的方法
2019/05/22 Python
Python使用itchat 功能分析微信好友性别和位置
2019/08/05 Python
django中使用事务及接入支付宝支付功能
2019/09/15 Python
利用Python实现Excel的文件间的数据匹配功能
2020/06/16 Python
为智能设备设计个性化保护套网站:caseable
2017/01/05 全球购物
Desigual美国官方网站:西班牙服装品牌
2019/03/29 全球购物
如果重写了对象的equals()方法,需要考虑什么
2014/11/02 面试题
工商管理专业学生的自我评价
2013/10/01 职场文书
ktv总经理岗位职责
2014/02/17 职场文书
食堂厨师岗位职责
2014/08/25 职场文书
个人批评与自我批评
2014/10/15 职场文书
小学班主任自我评价
2015/03/11 职场文书
2015年体育教学工作总结
2015/05/20 职场文书
使用Pytorch实现two-head(多输出)模型的操作
2021/05/28 Python
【海涛教你打DOTA】死灵飞龙第一视角解说
2022/04/01 DOTA
进阶篇之linux环境下安装MySQL数据库
2022/04/09 MySQL
Android中View.post和Handler.post的关系
2022/06/05 Java/Android