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 相关文章推荐
Web前端设计模式  制作漂亮的弹出层
Oct 29 Javascript
JavaScript中for..in循环陷阱介绍
Nov 12 Javascript
javascript监听鼠标滚轮事件浅析
Jun 05 Javascript
JavaScript实现的使用键盘控制人物走动实例
Aug 27 Javascript
innerHTML在IE中报错解决方案
Dec 15 Javascript
两种JavaScript的AES加密方式(可与Java相互加解密)
Aug 02 Javascript
整理关于Bootstrap模态弹出框的慕课笔记
Mar 29 Javascript
用JS编写一个函数,返回数组中重复出现过的元素(实例)
Sep 14 Javascript
微信小程序开发之IOS和Android兼容的问题
Sep 26 Javascript
小程序实现单选多选功能
Nov 04 Javascript
javascript随机变色实例代码
Oct 15 Javascript
100行代码实现vue表单校验功能(小白自编)
Nov 19 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
用PHP查询域名状态whois的类
2006/11/25 PHP
PHP base64+gzinflate压缩编码和解码代码
2008/10/03 PHP
php递归json类实例
2014/12/02 PHP
ThinkPHP中session函数详解
2016/09/14 PHP
PHP以json或xml格式返回请求数据的方法
2018/05/31 PHP
php中file_get_contents()函数用法实例
2019/02/21 PHP
js兼容标准的表格变色效果
2008/06/28 Javascript
JavaScript 异步调用框架 (Part 5 - 链式实现)
2009/08/04 Javascript
jquery实现相册一下滑动两次的方法
2015/02/09 Javascript
JavaScript动态插入CSS的方法
2015/12/10 Javascript
深入分析Javascript事件代理
2016/01/30 Javascript
Svg.js实例教程及使用手册详解(一)
2016/05/16 Javascript
canvas绘制环形进度条
2017/02/23 Javascript
JavaScript+Html5实现按钮复制文字到剪切板功能(手机网页兼容)
2017/03/30 Javascript
深入理解nodejs中Express的中间件
2017/05/19 NodeJs
vue单个组件实现无限层级多选菜单功能
2018/04/10 Javascript
小程序hover-class点击态效果实现
2019/02/26 Javascript
如何在微信小程序中实现Mixins方案
2019/06/20 Javascript
js+html实现点名系统功能
2019/11/05 Javascript
解决vue数据不实时更新的问题(数据更改了,但数据不实时更新)
2020/10/27 Javascript
[42:32]VP vs RNG 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.21.mp4
2020/07/19 DOTA
Python中列表的一些基本操作知识汇总
2015/05/20 Python
用python求一重积分和二重积分的例子
2019/12/06 Python
Python控制台输出时刷新当前行内容而不是输出新行的实现
2020/02/21 Python
Python抓包程序mitmproxy安装和使用过程图解
2020/03/02 Python
Python实现AI自动抠图实例解析
2020/03/05 Python
python修改微信和支付宝步数的示例代码
2020/10/12 Python
Expedia韩国官网:亚洲发展最快的在线旅游门户网站
2018/02/26 全球购物
项目合作计划书
2014/01/09 职场文书
最美孝心少年事迹材料
2014/08/15 职场文书
庆六一宣传标语
2014/10/08 职场文书
市贸粮局召开党的群众路线教育实践活动总结大会新闻稿
2014/10/21 职场文书
《浅水洼里的小鱼》教学反思
2016/02/16 职场文书
六种css3实现的边框过渡效果
2021/04/22 HTML / CSS
ES6 解构赋值的原理及运用
2021/05/25 Javascript
pytorch 梯度NAN异常值的解决方案
2021/06/05 Python