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 相关文章推荐
jquery 防止表单重复提交代码
Jan 21 Javascript
基于jquery可配置循环左右滚动例子
Sep 09 Javascript
Backbone.js的一些使用技巧
Jul 01 Javascript
jQuery.trim() 函数及trim()用法详解
Oct 26 Javascript
JavaScript弹出对话框的三种方式
Mar 23 Javascript
javascript执行环境及作用域详解
May 05 Javascript
javascript简单实现等比例缩小图片的方法
Jul 27 Javascript
JavaScript数组去重的几种方法效率测试
Oct 23 Javascript
JS 实现banner图片轮播效果(鼠标事件)
Aug 04 Javascript
详解vue2.0+axios+mock+axios-mock+adapter实现登陆
Jul 19 Javascript
详解vue项目中使用token的身份验证的简单实践
Mar 08 Javascript
Vue 自定义指令实现一键 Copy功能
Sep 16 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
理解PHP5中static和const关键字的区别
2007/03/19 PHP
PHP 字符串编码截取函数(兼容utf-8和gb2312)
2009/05/02 PHP
php实现的验证码文件类实例
2015/06/18 PHP
Yii2中SqlDataProvider用法示例
2016/09/22 PHP
PHP+fiddler抓包采集微信文章阅读数点赞数的思路详解
2019/12/20 PHP
Prototype 学习 工具函数学习($A方法)
2009/07/12 Javascript
De facto standard 世界上不可思议的事实标准
2010/08/29 Javascript
ANT 压缩(去掉空格/注释)JS文件可提高js运行速度
2013/04/15 Javascript
JavaScript匿名函数与委托使用示例
2014/07/22 Javascript
javascript基于DOM实现权限选择实例分析
2015/05/14 Javascript
js实现固定显示区域内自动缩放图片的方法
2015/07/18 Javascript
JavaScript模拟push
2016/03/06 Javascript
Vue2组件tree实现无限级树形菜单
2017/03/29 Javascript
Node.js服务器开启Gzip压缩教程
2017/08/11 Javascript
vue-router实现tab标签页(单页面)详解
2017/10/17 Javascript
Vue递归实现树形菜单方法实例
2018/11/06 Javascript
vue-router启用history模式下的开发及非根目录部署方法
2018/12/23 Javascript
聊聊Vue 中 title 的动态修改问题
2019/06/11 Javascript
vue 实现基础组件的自动化全局注册
2020/12/25 Vue.js
Python 随机生成中文验证码的实例代码
2013/03/20 Python
python实现探测socket和web服务示例
2014/03/28 Python
Linux 下 Python 实现按任意键退出的实现方法
2016/09/25 Python
python实现提取str字符串/json中多级目录下的某个值
2020/02/27 Python
keras 多gpu并行运行案例
2020/06/10 Python
keras K.function获取某层的输出操作
2020/06/29 Python
基于html5 DeviceOrientation 实现微信摇一摇功能
2015/09/25 HTML / CSS
瑞典网上购买现代和复古家具:Reforma
2019/10/21 全球购物
2019年Java 最常见的 面试题
2016/10/19 面试题
当文件系统受到破坏时,如何检查和修复系统?
2012/03/09 面试题
高中生家长会演讲稿
2014/01/14 职场文书
致长跑运动员加油稿
2014/02/20 职场文书
保护黄河倡议书
2014/05/16 职场文书
2014标准社保办理委托书
2014/10/06 职场文书
vue backtop组件的实现完整代码
2021/04/07 Vue.js
【海涛教你打dota】体验一超神发条:咱是抢盾专业户
2022/04/01 DOTA
nginx 配置指令之location使用详解
2022/05/25 Servers