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

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

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

从图可以看出,当鼠标移入的时候,只有宽度达到了预期的值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){  ...  }执行。

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

完整测试代码:

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文件供我们以后享用了!

js运动-完美运动框架相关推荐

  1. 完美运动框架(js)

    一.前言 学习js运动时,由于在实现多种不同运动效果过程中很多代码是重复的,故将其封装达到代码重用. 二.代码封装重用 function startMove(obj, json, fnEnd){cle ...

  2. JavaScriptDay08:js运动基础,单物体运动框架,多物体运动框架,改变单一任意值运动框架,改变多值运动框架,完美运动框架

    目录 0x00 js的运动基础 0x01 单物体运动框架 0x02 多物体运动框架 0x03 改变单一任意值运动框架 0x04 链式运动框架 0x05 改变多值运动框架 0x06 完美运动框架 0x0 ...

  3. JS完美运动框架详解——原理分析及demo

    1.运动原理 Js运动,本质来说,就是让 web 上 DOM 元素动起来.而想要 DOM 动起来,改变其自身的位置属性,比如高宽,左边距,上边距,透明度等.还有一个很重要的前提是,运动的物体必须是绝对 ...

  4. animate用法 js原生_原生JS封装animate运动框架的实例

    如下所示: div { width: 100px; height: 100px; background-color: pink; position: absolute; left: 0; top: 5 ...

  5. 原生JS实现各种运动之匀速运动

    给大家分享一个用原生JS实现的匀速运动,效果如下: 需要注意的是,这种运动效果在实际的开发中用的比较少,用的更多的还是弹性运动和缓冲运动,以下是代码实现,欢迎大家复制粘贴及吐槽. <!DOCTY ...

  6. js中使用camel框架_使用Fabric8在Kubernetes中使用Camel和CDI

    js中使用camel框架 序幕 我最近在博客上发表了使用CDI注入Kubernetes服务的信息 . 在本文中,我将更进一步,将Apache Camel带入图片. 因此,我将使用Camel的CDI支持 ...

  7. html5无法绘制线条,Html5画布 - 使用fabric.js绘制完美线条或不使用

    我正在创建一个游戏,我需要在不同类型的屏幕分辨率和缩放下实现HTML5上的完美画布线.Html5画布 - 使用fabric.js绘制完美线条或不使用 很容易理解我说的,简单地粘贴在两个不同的代码转换成 ...

  8. OC和JS互相调用小框架

    鄙人不才献上一份UIWebView和JS交互的桥接框架 不多说直接上货吧!!! 献上框架.m文件的内部实现和代码注释 导入<objc/runtime.h> #import "UI ...

  9. Vue.js(渐进式JavaScript框架)

    Vue.js(渐进式JavaScript框架) 渐进式:逐步实现新特性. Vue (发音为 /vjuː/,类似 view) 是一款用于构建用户界面的JavaScript框架.它基于标准HTML.CSS ...

最新文章

  1. 1123: 零起点学算法30——参加程序设计竞赛
  2. mysql cmd常用命令
  3. 批量显示JOB Log
  4. arcgis server 常见问题【转】
  5. Spring Data Redis与Jedis的选择(转)
  6. 系统学习机器学习之神经网络(九) --Hopfield网络
  7. 三 spring源码解析--- Bean解析接口结构分析
  8. QTP11 5 HP UFT 11 5 下载地址
  9. python数字图像处理(9):直方图与均衡化
  10. shell脚本中,for的用法
  11. 数据清洗挑战Day1 | 手把手教你处理数据集中的缺失值
  12. 2018最新最全1803win10专业版,教育版,企业版和ltbs密钥分享
  13. 开源)嗨,Java,你可以生成金山词霸的二维码分享海报吗?
  14. django使用rest快速实现前后端分离登录注册
  15. Python自动化 | 通过键盘控制鼠标来玩赛尔号
  16. 《租车管理系统 ——“订单管理(代驾)”模块》项目研发阶段性总结
  17. python爬虫:爬取全国航班信息
  18. javaStruct - 通讯协议的解封包第三方库--(二)官方文档二
  19. java设置httpheaders_HttpClient 请求添加Header头部信息
  20. 十大三维动画制作软件(转载)

热门文章

  1. 南京晓庄学院计算机组成原理实验报告,2013-2014年第一学期南京晓庄学院计算机组成原理期末考试回忆版...
  2. App Store 上架被拒的那些坑儿
  3. SQL IDENTITY_INSERT作用案例详解
  4. TRBBex:抱着一夜暴富这种心态是很难賺钱的
  5. 刷QQ群的VBS脚本
  6. python gridfs_GridFS简介及使用
  7. 【编程练习题】实现一个算法,确定一个字符串的所有字符是否全都不同。假使不允许使用额外的数据结构,又该如何处理。
  8. 新的一年:平淡是真,健康是福
  9. nginx配置7层协议及4层协议方法
  10. The Boy Who Cried Wolf 的重点单词表