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入门·对象属性方法大总结
Oct 01 Javascript
纯js和css实现渐变色包括静态渐变和动态渐变
May 29 Javascript
js中通过父级进行查找定位元素
Jun 15 Javascript
利用JavaScript的AngularJS库制作电子名片的方法
Jun 18 Javascript
jquery+CSS3模拟Path2.0动画菜单效果代码
Aug 31 Javascript
跟我学习javascript的全局变量
Nov 16 Javascript
jQuery实现的导航下拉菜单效果
Jul 04 Javascript
angular源码学习第一篇 setupModuleLoader方法
Oct 20 Javascript
深入理解Webpack 中路径的配置
Jun 17 Javascript
微信小程序搭建(mpvue+mpvue-weui+fly.js)的详细步骤
Sep 18 Javascript
微信小程序中的canvas 文字断行和省略号显示功能的处理方法
Nov 14 Javascript
微信小程序如何获取地址
Dec 24 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
PHP set_time_limit(0)长连接的实现分析
2010/03/02 PHP
无JS,完全php面向过程数据分页实现代码
2012/08/27 PHP
zend framework框架中url大小写问题解决方法
2014/08/19 PHP
Yii框架日志记录Logging操作示例
2018/07/12 PHP
PHP变量的作用范围实例讲解
2020/12/22 PHP
JavaScript Object的extend是一个常用的功能
2009/12/02 Javascript
IE的fireEvent方法概述及应用
2013/02/22 Javascript
javascript实现汉字转拼音代码分享
2015/04/20 Javascript
javascript中setAttribute()函数使用方法及兼容性
2015/07/19 Javascript
javascript面向对象程序设计高级特性经典教程(值得收藏)
2016/05/19 Javascript
AngularJS控制器详解及示例代码
2016/08/16 Javascript
Vue.js快速入门实例教程
2016/10/15 Javascript
AngularJS用户选择器指令实例分析
2016/11/04 Javascript
socket.io学习教程之基本应用(二)
2017/04/29 Javascript
JavaScript运动框架 多物体任意值运动(三)
2017/05/17 Javascript
vue中appear的用法
2017/08/17 Javascript
zTree获取当前节点的下一级子节点数实例
2017/09/05 Javascript
深入浅析vue组件间事件传递
2017/12/29 Javascript
利用Console来Debug的10个高级技巧汇总
2018/03/26 Javascript
跟混乱的页面弹窗说再见
2019/04/11 Javascript
在vue中使用axios实现post方式获取二进制流下载文件(实例代码)
2019/12/16 Javascript
js+canvas实现图片格式webp/png/jpeg在线转换
2020/08/22 Javascript
vue 根据选择的月份动态展示日期对应的星期几
2021/02/06 Vue.js
详谈Python高阶函数与函数装饰器(推荐)
2017/09/30 Python
Python验证文件是否可读写代码分享
2017/12/11 Python
python实现监控某个服务 服务崩溃即发送邮件报告
2018/06/21 Python
python 字符串常用函数详解
2019/09/11 Python
python通过nmap扫描在线设备并尝试AAA登录(实例代码)
2019/12/30 Python
如何在django中添加日志功能
2020/02/06 Python
加拿大休闲和工业服装和鞋类零售商:L’Équipeur
2018/01/12 全球购物
英国领先的电视购物零售商:Ideal World
2019/03/18 全球购物
自我反省检讨书
2014/01/23 职场文书
计算机应用专业毕业生求职信
2014/06/03 职场文书
护士求职自荐信范文
2015/03/04 职场文书
趣味运动会口号
2015/12/24 职场文书
Python趣味挑战之实现简易版音乐播放器
2021/05/28 Python