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中发布/订阅模式的简单实例
Nov 05 Javascript
js小数运算出现多位小数如何解决
Oct 08 Javascript
Ionic如何创建APP项目
Jun 03 Javascript
jQuery插件 Jqplot图表实例
Jun 18 Javascript
AngularJS通过$http和服务器通信详解
Sep 21 Javascript
微信小程序 定义全局数据、函数复用、模版等详细介绍
Oct 27 Javascript
JQuery和HTML5 Canvas实现弹幕效果
Jan 04 Javascript
三种方式实现瀑布流布局
Feb 10 Javascript
微信小程序引用公共js里的方法的实例详解
Aug 17 Javascript
vue 组件的封装之基于axios的ajax请求方法
Aug 11 Javascript
vue从一个页面跳转到另一个页面并携带参数的解决方法
Aug 12 Javascript
node.js中stream流中可读流和可写流的实现与使用方法实例分析
Feb 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
php文字水印和php图片水印实现代码(二种加水印方法)
2013/12/25 PHP
php-fpm配置详解
2014/02/12 PHP
php加速缓存器opcache,apc,xcache,eAccelerator原理与配置方法实例分析
2020/03/02 PHP
在textarea文本域中显示HTML代码的方法
2007/03/06 Javascript
W3C Group的JavaScript1.8 新特性介绍
2009/05/19 Javascript
使用Node.js为其他程序编写扩展的基本方法
2015/06/23 Javascript
使用JavaScript触发过渡效果的方法
2017/01/19 Javascript
微信小程序小组件 基于Canvas实现直播点赞气泡效果
2020/05/29 Javascript
Node.js 回调函数实例详解
2017/07/06 Javascript
如何实现一个webpack模块解析器
2018/10/24 Javascript
vue滚动固定顶部及修改样式的实例代码
2019/05/30 Javascript
Ajax请求时无法重定向的问题解决代码详解
2019/06/21 Javascript
NodeJS实现一个聊天室功能
2019/11/25 NodeJs
js找出5个数中最大的一个数和倒数第二大的数实现方法示例小结
2020/03/04 Javascript
[05:15]DOTA2英雄梦之声_第16期_灰烬之灵
2014/06/21 DOTA
Python 条件判断的缩写方法
2008/09/06 Python
浅谈python字典多键值及重复键值的使用
2016/11/04 Python
Python AES加密模块用法分析
2017/05/22 Python
python进程管理工具supervisor的安装与使用教程
2017/09/05 Python
使用pandas对矢量化数据进行替换处理的方法
2018/04/11 Python
python爬取哈尔滨天气信息
2018/07/14 Python
python实现杨氏矩阵查找
2019/03/02 Python
Python单元测试模块doctest的具体使用
2020/02/10 Python
html5页面结构_动力节点Java学院整理
2017/07/10 HTML / CSS
番木瓜健康和保健产品第一大制造商:Herbal Papaya
2017/04/25 全球购物
利用promise及参数解构封装ajax请求的方法
2021/03/24 Javascript
新闻编辑自荐信
2013/11/03 职场文书
初中科学教学反思
2014/01/21 职场文书
高一英语教学反思
2014/01/22 职场文书
《蒙娜丽莎之约》教学反思
2014/02/27 职场文书
出国留学计划书
2014/04/27 职场文书
机械操作工岗位职责
2014/08/08 职场文书
慈善献爱心倡议书
2015/04/27 职场文书
党校培训学习心得体会
2016/01/06 职场文书
使用feign服务调用添加Header参数
2021/06/23 Java/Android
Python中的tkinter库简单案例详解
2022/01/22 Python