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遍历input取得input的name
Apr 27 Javascript
javascript 操作Word和Excel的实现代码
Oct 26 Javascript
jquery超简单实现手风琴效果的方法
Jun 05 Javascript
js实现左侧网页tab滑动门效果代码
Sep 06 Javascript
jQuery插件实现适用于移动端的地址选择器
Feb 18 Javascript
AngularJS 让人爱不释手的八种功能
Mar 23 Javascript
js当前页面登录注册框,固定div,底层阴影的实例代码
Oct 04 Javascript
Vuejs 用$emit与$on来进行兄弟组件之间的数据传输通信
Feb 23 Javascript
jQuery用户头像裁剪插件cropbox.js使用详解
Jun 07 jQuery
JS集合set类的实现与使用方法示例
Feb 01 Javascript
微信小程序搜索功能(附:小程序前端+PHP后端)
Feb 28 Javascript
微信小程序实现简单文字跑马灯
May 26 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生成excel列序号代码实例
2013/12/24 PHP
jQuery+PHP发布的内容进行无刷新分页(Fckeditor)
2015/10/22 PHP
在Javascript中为String对象添加trim,ltrim,rtrim方法
2006/09/22 Javascript
前端开发部分总结[兼容性、DOM操作、跨域等](持续更新)
2010/03/04 Javascript
js实现精美的银灰色竖排折叠菜单
2015/05/16 Javascript
JS打字效果的动态菜单代码分享
2015/08/21 Javascript
jQuery实现向下滑出的平滑下拉菜单效果
2015/08/21 Javascript
JavaScript中eval()函数用法详解
2015/12/14 Javascript
详解AngularJS过滤器的使用
2016/03/11 Javascript
jquery利用json实现页面之间传值的实例解析
2016/12/12 Javascript
微信小程序自定义多选事件的实现代码
2018/05/17 Javascript
Vue+Element UI+Lumen实现通用表格分页功能
2019/02/02 Javascript
vue中组件的3种使用方式详解
2019/03/23 Javascript
python处理PHP数组文本文件实例
2014/09/18 Python
Python正则表达式知识汇总
2017/09/22 Python
Python网络编程之TCP与UDP协议套接字用法示例
2018/02/02 Python
python 定时修改数据库的示例代码
2018/04/08 Python
快速解决PyCharm无法引用matplotlib的问题
2018/05/24 Python
Python机器学习算法库scikit-learn学习之决策树实现方法详解
2019/07/04 Python
python实现百度OCR图片识别过程解析
2020/01/17 Python
使用Python开发个京东上抢口罩的小实例(仅作技术研究学习使用)
2020/03/10 Python
Python-opencv实现红绿两色识别操作
2020/06/04 Python
python实现梯度下降算法的实例详解
2020/08/17 Python
python读取图片颜色值并生成excel像素画的方法实例
2021/02/19 Python
纯HTML+CSS3制作导航菜单(附源码)
2013/04/24 HTML / CSS
Tretorn美国官网:瑞典外套和鞋类品牌,抵御风雨
2018/07/19 全球购物
有机婴儿毛毯和衣服:Monica + Andy
2020/03/01 全球购物
各营销点岗位职责范本
2014/03/05 职场文书
如何写自我评价?自我评价写什么好?
2014/03/14 职场文书
高考寄语大全
2014/04/08 职场文书
2014年五四青年节活动策划书
2014/04/22 职场文书
预防艾滋病宣传标语
2014/06/25 职场文书
无罪辩护词范文
2015/05/21 职场文书
入党积极分子培养联系人意见
2015/08/12 职场文书
2016春季运动会前导词
2015/11/25 职场文书
《帝国时代4》赛季预告 新增内容编译器可创造地图
2022/04/03 其他游戏