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里使用Dom操作Xml
Sep 20 Javascript
ExtJS下grid的一些属性说明
Dec 13 Javascript
jquery使用淘宝接口跨域查询手机号码归属地实例
Nov 28 Javascript
详细解密jsonp跨域请求
Apr 15 Javascript
每天一篇javascript学习小结(RegExp对象)
Nov 17 Javascript
AngularJS在IE8的不支持的解决方法
May 13 Javascript
Javascript的无new构建实例详解
May 15 Javascript
vue2 如何实现div contenteditable=“true”(类似于v-model)的效果
Feb 08 Javascript
如何使用angularJs
May 08 Javascript
js捆绑TypeScript声明文件的方法教程
Apr 13 Javascript
JS弹窗 JS弹出DIV并使整个页面背景变暗功能的实现代码
Apr 21 Javascript
JS hasOwnProperty()方法检测一个属性是否是对象的自有属性的方法
Jan 29 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 heredoc和phpwind的模板技术使用方法小结
2008/03/28 PHP
php操作excel文件 基于phpexcel
2010/07/02 PHP
PHP SEO优化之URL优化方法
2011/04/21 PHP
php number_format() 函数通过千位分组来格式化数字的实现代码
2013/08/06 PHP
php根据分类合并数组的方法实例详解
2013/11/06 PHP
Avengerls vs Newbee BO3 第一场2.18
2021/03/10 DOTA
document.all还是document.getElementsByName?
2006/07/21 Javascript
JavaScript 变量作用域分析
2011/07/04 Javascript
JS获取IP、MAC和主机名的五种方法
2013/11/14 Javascript
javascript常见用法总结
2014/05/22 Javascript
JavaScript 异常处理 详解
2015/02/06 Javascript
JavaScript通过join函数连接数组里所有元素的方法
2015/03/20 Javascript
JavaScript中的Repaint和Reflow用法详解
2015/07/27 Javascript
js实现滚动条滚动到某个位置便自动定位某个tr
2021/01/20 Javascript
canvas绘制七巧板
2017/02/03 Javascript
Bootstrap BootstrapDialog使用详解
2017/02/17 Javascript
vue通过watch对input做字数限定的方法
2017/07/13 Javascript
深入解读VUE中的异步渲染的实现
2020/06/19 Javascript
[26:52]LGD vs EG 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
python基础教程之面向对象的一些概念
2014/08/29 Python
Python中使用PDB库调试程序
2015/04/05 Python
Python操作csv文件实例详解
2017/07/31 Python
详解Numpy中的广播原则/机制
2018/09/20 Python
python 如何将数据写入本地txt文本文件的实现方法
2019/09/11 Python
Python更改pip镜像源的方法示例
2020/12/01 Python
实习生个人找工作的自我评价
2013/10/30 职场文书
新闻专业本科生的自我评价分享
2013/11/20 职场文书
2014元旦晚会策划方案
2014/02/19 职场文书
软件毕业生个人鉴定
2014/03/03 职场文书
酒店开业庆典主持词
2014/03/21 职场文书
社会发展项目建议书
2014/08/25 职场文书
2015年计算机教学工作总结
2015/07/22 职场文书
学雷锋广播稿大全
2015/08/19 职场文书
体育部部长竞选稿
2015/11/21 职场文书
如何利用STAR法则制作留学文书?
2019/08/26 职场文书
MySQL使用IF语句及用case语句对条件并结果进行判断 
2022/09/23 MySQL