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 相关文章推荐
JQuery中的ready函数冲突的解决方法
May 17 Javascript
JS 模态对话框和非模态对话框操作技巧汇总
Apr 15 Javascript
jQuery实现单击弹出Div层窗口效果(可关闭可拖动)
Sep 19 Javascript
JavaScript仿商城实现图片广告轮播实例代码
Feb 06 Javascript
js运动事件函数详解
Oct 21 Javascript
View.post() 不靠谱的地方你知道多少
Aug 29 Javascript
修改UA在PC中访问只能在微信中打开的链接方法
Nov 27 Javascript
vue实现密码显示隐藏切换功能
Feb 23 Javascript
使用vue-cli导入Element UI组件的方法
May 16 Javascript
vue踩坑记-在项目中安装依赖模块npm install报错
Apr 02 Javascript
vue swipe自定义组件实现轮播效果
Jul 03 Javascript
用几道面试题来看JavaScript执行机制
Apr 30 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
PHP4.04简明安装
2006/10/09 PHP
中英文字符串翻转函数
2008/12/09 PHP
鸡肋的PHP单例模式应用详解
2013/06/03 PHP
解析file_get_contents模仿浏览器头(user_agent)获取数据
2013/06/27 PHP
网上抓的一个特效
2007/05/11 Javascript
使用Javascript接收get传递的值的代码
2011/11/30 Javascript
浅谈jQuery异步对象(XMLHttpRequest)
2014/11/17 Javascript
JS函数的定义与调用方法推荐
2016/05/12 Javascript
JavaScript省市级联下拉菜单实例
2017/02/14 Javascript
Angular.js自定义指令学习笔记实例
2017/02/24 Javascript
jQuery插件FusionCharts实现的MSBar3D图效果示例【附demo源码】
2017/03/23 jQuery
微信小程序开发之toast等弹框提示使用教程
2017/06/08 Javascript
JS中Safari浏览器中的Date
2017/07/17 Javascript
javascript算法之二叉搜索树的示例代码
2017/09/12 Javascript
iframe高度自适应及隐藏滚动条的实例详解
2017/09/29 Javascript
React.Js添加与删除onScroll事件的方法详解
2017/11/03 Javascript
在Swiper内如何制作CSS3动画效果示例代码
2017/12/07 Javascript
微信小程序获取用户信息并保存登录状态详解
2019/05/10 Javascript
Vuex modules模式下mapState/mapMutations的操作实例
2019/10/17 Javascript
vue3 源码解读之 time slicing的使用方法
2019/10/31 Javascript
vue.config.js中配置Vue的路径别名的方法
2020/02/11 Javascript
[42:27]DOTA2上海特级锦标赛主赛事日 - 3 败者组第三轮#2Fnatic VS OG第三局
2016/03/05 DOTA
Python算法之求n个节点不同二叉树个数
2017/10/27 Python
Python3 处理JSON的实例详解
2017/10/29 Python
Python实现高斯函数的三维显示方法
2018/12/29 Python
用pyqt5 给按钮设置图标和css样式的方法
2019/06/24 Python
python 装饰器的基本使用
2021/01/13 Python
canvas像素点操作之视频绿幕抠图
2018/09/11 HTML / CSS
美国著名的户外用品品牌:L.L.Bean
2018/01/05 全球购物
几个Shell Script面试题
2014/04/18 面试题
JAVA高级程序员面试题
2013/09/06 面试题
个人评价范文分享
2014/01/11 职场文书
联谊会主持词
2014/03/26 职场文书
安全承诺书范文
2014/03/26 职场文书
人力资源本科毕业生求职信
2014/06/04 职场文书
Java8中Stream的一些神操作
2021/11/02 Java/Android