JS运动特效之完美运动框架实例分析


Posted in Javascript onJanuary 24, 2018

本文实例讲述了JS运动特效之运动框架。分享给大家供大家参考,具体如下:

在前面一篇的《js运动特效之同时运动》中说过,我们的运动框架还存在一个问题,那究竟是什么问题那?把上一篇的程序做一下调整

oDiv.onmouseover = function () {
   //startMove(oDiv,{width:300,height:300,opacity:30});
   startMove(oDiv,{width:204,height:300,opacity:30});
}

在鼠标移入的时候,我们让width不变成300,而是变成204,看看会有什么变化那??

JS运动特效之完美运动框架实例分析

从图可以看出,当鼠标移入的时候,只有宽度达到了预期的值204,而height和opacity都没有达到目标值(目标值是300和0.3),这是为什么那??是下面的问题引起的

if(objAttr == json[attr]){
    clearInterval(obj.timer);
    if(fn){
      fn();
    }
}

if语句里只是判断当objAttr 等于目标值的时候就清除定时器(也就是说只要有一个属性到达目标值就进入if,清除定时器),并不是判断“所有的运动”都达到了目标值;width从200变成204很快就达到目标值了,而此时height和opacity还在半路上;但是由于width已经达到了目标值,所以就进入if语句清除了定时器,width,height,opacity它们用的是一个定时器,所以此时height和opacity就定格在半道上永远无法达到目标值了。

那怎么解决那???

1. 在进入定时器的时候,设置一个标志位var flag ,用它来检测是否所有的运动都到达目标值

function startMove(obj,json,fn) {
      clearInterval(obj.timer);
      obj.timer = setInterval(function () {
       var flag = true;// 一进入定时器设置标志位
      },30);
}
var flag = true;// 表示所有的运动都到达目标值
var flag = false;// 表示有的运动没有到达目标值

2 . 接着在检测运动是否停止的语句中做判断

if(objAttr != json[attr]){// 判断是否所有的运动都达到目标值
     // 进入if语句,说明至少有一个 运动未到达目标值
     flag = false;
}

for...in.循环里面每一个属性做变化(widht,height,opacity...),只要有一个属性变化没有到达目标值,flag标志的值就是false;然后在整个for...in..循环之外判断flag的值,如果依然为true就标志“所有的运动”都到达了目标值,此时就可以清除定时器了

for(attr in json){
}
if(flag){// 再次判断flag的值
  clearInterval(obj.timer);
  if(fn){
    fn();
  }
}

定时器每隔30毫秒执行一次,每次进入首先设置var flag =true ,然后向下执行,每一回都要判断

if(objAttr != json[attr]){ ... }只要有一个运动没有达到目标值,都会进入执行if语句,把flag设为false,当定时器最后一次执行的时候,发现所有的属性都到达了目标值,此时if语句就不成立了,就没机会把flag设为flase了,所以最后一次进入定时器flag的始终是true;接着就满足了if(flag){  ...  }的条件,接着进入if(flag){  ...  }执行。

到这里就完美了,看下效果

JS运动特效之完美运动框架实例分析

完整测试代码:

Hhtm部分和css部分和上一篇完全一样。js代码如下

<script>
    window.onload = function(){
      var oDiv = document.getElementById('div1');
      oDiv.onmouseover = function () {
        //startMove(oDiv,{width:300,height:300,opacity:30});
        startMove(oDiv,{width:204,height:300,opacity:30});
      }
      oDiv.onmouseout = function () {
        startMove(oDiv,{width:200,height:200,opacity:100});
      }
    }
    function getStyle(obj,attr){
      return getComputedStyle ? getComputedStyle(obj,false)[attr] : obj.currentStyle[attr];
    }
    function startMove(obj,json,fn) {
      clearInterval(obj.timer);
      obj.timer = setInterval(function () {
        var bStop = true;
        for(attr in json){
          // 1. 取得当前的值(可以是widht,height,opacity等的值)
          var objAttr = 0;
          if(attr == "opacity"){
            objAttr = Math.round(parseFloat(getStyle(obj,attr))*100);
          }else{
            objAttr = parseInt(getStyle(obj,attr));
          }
          // 2.计算运动速度
          var iSpeed = (json[attr] -objAttr)/10;
            iSpeed = iSpeed>0 ?Math.ceil(iSpeed):Math.floor(iSpeed);
          // 3. 检测所有运动是否到达目标
          if(objAttr != json[attr]){
            bStop = false;
          }
          if(attr == "opacity"){
            obj.style.filter = 'alpha(opacity:'+(objAttr+iSpeed)+')';
            obj.style.opacity = (objAttr+iSpeed)/100;
          }else{
            obj.style[attr] = objAttr+iSpeed+'px';// 需要又.属性名的形式改成[]
          }
        }
        if(bStop){ // 表示所有运动都到达目标值
          clearInterval(obj.timer);
          if(fn){
            fn();
          }
        }
      },30);
    }
</script>

到这里我们就可以把这个运动框架单独出来,保存成js文件供我们以后享用了!

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
JavaScript 学习 - 提高篇
Feb 02 Javascript
使图片旋转的3种解决方案
Nov 21 Javascript
利用jquery写的左右轮播图特效
Feb 12 Javascript
jQuery实现的导航条切换可显示隐藏
Oct 22 Javascript
AngularJs根据访问的页面动态加载Controller的解决方案
Feb 04 Javascript
jquery实现图片上传之前预览的方法
Jul 11 Javascript
JQuery Ajax 异步操作之动态添加节点功能
May 24 jQuery
移动前端图片压缩上传的实例
Dec 06 Javascript
简述vue状态管理模式之vuex
Aug 29 Javascript
angularjs的单选框+ng-repeat的实现方法
Sep 12 Javascript
详释JavaScript执行环境与执行栈
Apr 02 Javascript
vue-cli3中vue.config.js配置教程详解
May 29 Javascript
JS运动特效之同时运动实现方法分析
Jan 24 #Javascript
JS运动特效之链式运动分析
Jan 24 #Javascript
Bootstrap popover 实现鼠标移入移除显示隐藏功能方法
Jan 24 #Javascript
JS运动特效之任意值添加运动的方法分析
Jan 24 #Javascript
bootstrap 点击空白处popover弹出框隐藏实例
Jan 24 #Javascript
详解node child_process模块学习笔记
Jan 24 #Javascript
浅谈Node.js 子进程与应用场景
Jan 24 #Javascript
You might like
smarty内置函数foreach用法实例
2015/01/22 PHP
yii插入数据库防并发的简单代码
2017/05/27 PHP
Yii2框架中使用PHPExcel导出Excel文件的示例
2017/08/09 PHP
json-lib出现There is a cycle in the hierarchy解决办法
2010/02/24 Javascript
JQuery优缺点分析说明
2011/04/10 Javascript
jQuery学习笔记之控制页面实现代码
2012/02/27 Javascript
jQuery的each终止或跳过示例代码
2013/12/12 Javascript
javascript中对Date类型的常用操作小结
2016/05/19 Javascript
js闭包用法实例详解
2016/12/13 Javascript
JavaScript仿支付宝6位数字密码输入框
2016/12/29 Javascript
JS实现快速比较两个字符串中包含有相同数字的方法
2017/09/11 Javascript
jQuery zTree搜索-关键字查询 递归无限层功能实现代码
2018/01/25 jQuery
js经验分享 JavaScript反调试技巧
2018/03/10 Javascript
JavaScript实现点击出现图片并统计点击次数功能示例
2018/07/23 Javascript
解决Layui选择全部,换页checkbox复选框重新勾选的问题方法
2018/08/14 Javascript
小程序实现列表删除功能
2018/10/30 Javascript
react+ant design实现Table的增、删、改的示例代码
2018/12/27 Javascript
Vue实现一个图片懒加载插件
2019/03/11 Javascript
[31:47]夜魇凡尔赛茶话会 第三期01:选手知多少
2021/03/11 DOTA
Python命令行解析模块详解
2018/02/01 Python
对Python 2.7 pandas 中的read_excel详解
2018/05/04 Python
解决Pycharm中import时无法识别自己写的程序方法
2018/05/18 Python
python多线程http压力测试脚本
2019/06/25 Python
利用python清除移动硬盘中的临时文件
2020/10/28 Python
Django vue前后端分离整合过程解析
2020/11/20 Python
Html5之svg可缩放矢量图形_动力节点Java学院整理
2017/07/17 HTML / CSS
如何使用canvas绘制可移动网格的示例代码
2020/12/14 HTML / CSS
西班牙创意礼品和小工具网上商店:Curiosite
2016/07/26 全球购物
比利时的在线灯具店:Lampen24.be
2019/07/01 全球购物
Python里面search()和match()的区别
2016/09/21 面试题
记者岗位职责
2014/01/06 职场文书
工作证明范本(2篇)
2014/09/14 职场文书
单位个人查摆问题及整改措施
2014/10/28 职场文书
见习报告怎么写
2014/10/31 职场文书
2014年统计工作总结
2014/11/21 职场文书
大学生学期个人总结
2015/02/12 职场文书