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 相关文章推荐
表单内同名元素的控制
Nov 22 Javascript
jQuery的Ajax时无响应数据的解决方法
May 25 Javascript
js编码之encodeURIComponent使用介绍(asp,php)
Mar 01 Javascript
javascript的propertyIsEnumerable()方法使用介绍
Apr 09 Javascript
详解JavaScript语法对{}处理的坑爹之处
Jun 05 Javascript
用js一次改变多个input的readonly属性值的方法
Jun 11 Javascript
基于BootStrap与jQuery.validate实现表单提交校验功能
Dec 22 Javascript
jQuery滚动条美化插件nicescroll简单用法示例
Apr 18 jQuery
JS实现页面数据懒加载
Feb 13 Javascript
vue-cli3项目升级到vue-cli4 的方法总结
Mar 19 Javascript
微信小程序pinker组件使用实现自动相减日期
May 07 Javascript
js实现微信聊天效果
Aug 09 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
dede全站URL静态化改造[070414更正]
2007/04/17 PHP
PHP SQLite类
2009/05/07 PHP
PHP 字符串分割和比较
2009/10/06 PHP
php socket客户端及服务器端应用实例
2014/07/04 PHP
用 Composer构建自己的 PHP 框架之设计 MVC
2014/10/30 PHP
关于PHP内置的字符串处理函数详解
2017/02/04 PHP
yii2的restful api路由实例详解
2019/05/14 PHP
layui数据表格自定义每页条数limit设置
2019/10/26 PHP
刷新时清空文本框内容的js代码
2007/04/23 Javascript
保证JavaScript和Asp、Php等后端程序间传值编码统一
2009/04/17 Javascript
IE浏览器打印的页眉页脚设置解决方法
2009/12/08 Javascript
探讨JQUERY JSON的反序列化类 using问题的解决方法
2013/12/19 Javascript
ListBox实现上移,下移,左移,右移的简单实例
2014/02/13 Javascript
JavaScript检测上传文件大小的方法
2015/07/22 Javascript
js实现圆盘记速表
2015/08/03 Javascript
js仿拉勾网首页穿墙广告效果
2017/03/08 Javascript
JS中创建自定义类型的常用模式总结【工厂模式,构造函数模式,原型模式,动态原型模式等】
2019/01/19 Javascript
理解python正则表达式
2016/01/15 Python
Python 字符串大小写转换的简单实例
2017/01/21 Python
Python命令行解析模块详解
2018/02/01 Python
python中将正则过滤的内容输出写入到文件中的实例
2018/10/21 Python
Python编程中类与类的关系详解
2019/08/08 Python
django xadmin action兼容自定义model权限教程
2020/03/30 Python
html5 CSS过度-webkit-transition使用介绍
2013/07/02 HTML / CSS
HTML5 Canvas阴影使用方法实例演示
2013/08/02 HTML / CSS
Notino瑞典:购买香水和美容产品
2019/07/26 全球购物
超级英雄、电影和电视、乐队和音乐T恤:Loud Clothing
2019/09/01 全球购物
出国留学经济担保书
2014/04/01 职场文书
关于感恩的演讲稿200字
2014/08/26 职场文书
派出所副所长四风问题个人整改措施思想汇报
2014/10/13 职场文书
工作检讨书怎么写
2015/01/23 职场文书
人口与计划生育责任书
2015/05/09 职场文书
学习雷锋主题班会
2015/08/14 职场文书
六年级作文之关于梦
2019/10/22 职场文书
Pytorch中TensorBoard及torchsummary的使用详解
2021/05/12 Python
Django框架中表单的用法
2022/06/10 Python