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实例教程(19) 使用HoTMetal(1)
Dec 23 Javascript
JavaScript中的Screen屏幕对象
Jan 16 Javascript
JavaScript设计模式之单件模式介绍
Dec 28 Javascript
JS+CSS实现的经典tab选项卡效果代码
Sep 16 Javascript
果断收藏9个Javascript代码高亮脚本
Jan 06 Javascript
Bootstrap基本插件学习笔记之折叠(22)
Dec 08 Javascript
SpringMVC简单整合Angular2的示例
Jul 31 Javascript
Vue.js移动端左滑删除组件的实现代码
Sep 08 Javascript
Vue2.0使用嵌套路由实现页面内容切换/公用一级菜单控制页面内容切换(推荐)
May 08 Javascript
Bootstrap 时间日历插件bootstrap-datetimepicker配置与应用小结
May 28 Javascript
JavaScript canvas实现跟随鼠标事件
Feb 10 Javascript
Vue过滤器(filter)实现及应用场景详解
Jun 15 Vue.js
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 三大特点:封装,继承,多态
2017/02/19 PHP
详解PHP处理字符串类似indexof的方法函数
2017/06/11 PHP
Ajax+PHP实现的分类列表框功能示例
2019/02/11 PHP
iframe 自适应高度[在IE6 IE7 FF下测试通过]
2009/04/13 Javascript
jQuery基本过滤选择器使用介绍
2013/04/18 Javascript
jquery foreach使用示例
2013/09/12 Javascript
js获取当前页面的url网址信息
2014/06/12 Javascript
JavaScript使用循环和分割来替换和删除元素实例
2014/10/13 Javascript
浅谈angularJS 作用域
2015/07/05 Javascript
跟我学习javascript的执行上下文
2015/11/18 Javascript
基于BootStrap的图片轮播效果展示实例代码
2016/05/23 Javascript
jQuery事件委托之Safari
2016/07/05 Javascript
JQuery Ajax WebService传递参数的简单实例
2016/11/02 Javascript
JS对象与JSON互转换、New Function()、 forEach()、DOM事件流等js开发基础小结
2017/08/10 Javascript
JS使用百度地图API自动获取地址和经纬度操作示例
2019/04/16 Javascript
uni-app实现点赞评论功能
2019/11/25 Javascript
jquery css实现流程进度条
2020/03/26 jQuery
[01:09:01]完美世界DOTA2联赛循环赛 Magma vs PXG BO2第一场 10.28
2020/10/28 DOTA
Python bsddb模块操作Berkeley DB数据库介绍
2015/04/08 Python
Python删除空文件和空文件夹的方法
2015/07/14 Python
简单了解Python下用于监视文件系统的pyinotify包
2015/11/13 Python
python实现图片批量压缩程序
2018/07/23 Python
用python3教你任意Html主内容提取功能
2018/11/05 Python
python3常用的数据清洗方法(小结)
2019/10/31 Python
python Cartopy的基础使用详解
2020/11/01 Python
html5视频播放_动力节点Java学院整理
2017/07/13 HTML / CSS
Zalando Lounge瑞士:时尚与生活方式购物俱乐部
2020/03/12 全球购物
应届大专毕业生个人自荐信
2013/09/22 职场文书
如何写好建议书
2014/03/13 职场文书
歌唱比赛主持词
2014/03/18 职场文书
教师党员批评与自我批评
2014/10/15 职场文书
2015年施工员工作总结范文
2015/04/20 职场文书
2015年图书馆个人工作总结
2015/05/26 职场文书
如何撰写创业策划书
2019/06/27 职场文书
Go语言设计模式之结构型模式
2021/06/22 Golang
python 中yaml文件用法大全
2021/07/04 Python