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开发人员学习jQuery的6大理由及jQuery的优势介绍
Jan 03 Javascript
jquery 为a标签绑定click事件示例代码
Jun 23 Javascript
jQuery头像裁剪工具jcrop用法实例(附演示与demo源码下载)
Jan 22 Javascript
JavaScript实现复制或剪切内容到剪贴板功能的方法
May 23 Javascript
js 实现省市区三级联动菜单效果
Feb 20 Javascript
react配合antd组件实现的管理系统示例代码
Apr 24 Javascript
详解如何使用node.js的开发框架express创建一个web应用
Dec 20 Javascript
Node.js一行代码实现静态文件服务器的方法步骤
May 07 Javascript
微信小程序使用canvas自适应屏幕画海报并保存图片功能
Jul 25 Javascript
vue-video-player实现实时视频播放方式(监控设备-rtmp流)
Aug 10 Javascript
js实现简易计算器小功能
Nov 18 Javascript
适合后台管理系统开发的12个前端框架(小结)
Jun 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
phpmyadmin中配置文件现在需要绝密的短语密码的解决方法
2007/02/11 PHP
合并ThinkPHP配置文件以消除代码冗余的实现方法
2014/07/22 PHP
跟我学Laravel之安装Laravel
2014/10/15 PHP
yii实现图片上传及缩略图生成的方法
2014/12/04 PHP
超强多功能php绿色集成环境详解
2017/01/25 PHP
在JavaScript中使用inline函数的问题
2007/03/08 Javascript
jQuery事件 delegate()使用方法介绍
2012/10/30 Javascript
使用Jquery实现每日签到功能
2015/04/03 Javascript
jquery实现经典的淡入淡出选项卡效果代码
2015/09/22 Javascript
Bootstrap3.0建站教程(一)之bootstrap表单元素排版
2016/06/01 Javascript
vue+swiper实现组件化开发的实例代码
2017/10/26 Javascript
如何使node也支持从url加载一个module详解
2018/06/05 Javascript
JavaScript使用math.js进行精确计算操作示例
2018/06/19 Javascript
javascript数组去重方法总结(推荐)
2019/03/20 Javascript
JavaScript实现选项卡效果的分析及步骤
2019/04/16 Javascript
js实现星星打分效果
2020/07/05 Javascript
解决vue字符串换行问题(绝对管用)
2020/08/06 Javascript
js+css3实现炫酷时钟
2020/08/18 Javascript
分享Pycharm中一些不为人知的技巧
2018/04/03 Python
解决Python pandas df 写入excel 出现的问题
2018/07/04 Python
Python根据欧拉角求旋转矩阵的实例
2019/01/28 Python
Ubuntu下Anaconda和Pycharm配置方法详解
2019/06/14 Python
python实现将文件夹内的每张图片批量分割成多张
2019/07/22 Python
解决CSS3的opacity属性带来的层叠顺序问题
2016/05/09 HTML / CSS
利用纯CSS3实现tab选项卡切换示例代码
2016/09/21 HTML / CSS
详解淘宝H5 sign加密算法
2020/08/25 HTML / CSS
如何删除一个表里面的重复行
2013/07/13 面试题
《狼》教学反思
2014/03/02 职场文书
红色故事演讲稿
2014/05/22 职场文书
2014年教师学期工作总结
2014/11/08 职场文书
补充协议书
2015/01/28 职场文书
SQL Server基本使用和简单的CRUD操作
2021/04/05 SQL Server
python flask开发的简单基金查询工具
2021/06/02 Python
手写Spirit防抖函数underscore和节流函数lodash
2022/03/22 Javascript
如何开启Apache,Nginx和IIS服务器的GZIP压缩功能
2022/04/29 Servers
spring boot实现文件上传
2022/08/14 Java/Android