大家一听这名字就知道,有了这套框架 网上的效果基本都是可以实现的。实际上之前的运动框架还是有局限性的,就是不能让好几个值一块运动。

那这个问题怎么解决呢? 我们先来看看之前的运动框架

  1. function getStyle(obj, name) {
  2. if (obj.currentStyle) {
  3. return obj.currentStyle[name];
  4. } else {
  5. return getComputedStyle(obj, null)[name];
  6. }
  7. }
  8.  
  9. function startMove(obj, attr, iTarget) {
  10. clearInterval(obj.time);
  11. obj.time = setInterval(function() {
  12. var cur = 0;
  13.  
  14. if (attr == 'opacity') {
  15. cur = Math.round(parseFloat(getStyle(obj, attr)) * 100);
  16. } else {
  17. cur = parseInt(getStyle(obj, attr));
  18. }
  19.  
  20. var speed = (iTarget - cur) / 6;
  21.  
  22. speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed);
  23.  
  24. if (cur == iTarget) {
  25. clearInterval(obj.time);
  26. } else {
  27. if (attr == 'opacity') {
  28. obj.style.filter = 'alpha(opacity=' + cur + speed + ')';
  29. obj.style.opacity = (cur + speed) / 100;
  30. } else {
  31. obj.style[attr] = cur + speed + 'px';
  32. }
  33. }
  34. }, 30);
  35. }

怎么修改呢? 实际上很简单, 在过去的框架中,你每一次只能传一个样式,和一个值。那么现在把这些改成一个json对象。相信大家就明白了。

我们调用的时候就是startMove(oDiv,{width:200,height:200}); 如果需要的话就在加上回调函数。那么我们具体看看代码是怎么修改的。

  1. function startMove(obj, json, fnEnd)
  2. {
  3. var MAX=18;
  4. //每次调用就只有一个定时器在工作(开始运动时关闭已有定时器)
  5. //并且关闭或者开启都是当前物体的定时器,已防止与页面上其他定时器的冲突,使每个定时器都互不干扰
  6. clearInterval(obj.timer);
  7. obj.timer=setInterval(function (){
  8.  
  9. var bStop=true; // 假设:所有的值都已经到了
  10.  
  11. for(var name in json)
  12. {
  13. var iTarget=json[name]; // 目标点
  14.  
  15. //处理透明度,不能使用parseInt否则就为0了
  16.  
  17. if(name=='opacity')
  18. {
  19.  
  20. // *100 会有误差 0000007 之类的 所以要用 Math.round() 会四舍五入
  21. var cur=Math.round(parseFloat(getStyle(obj, name))*100);
  22. }
  23. else
  24. {
  25. var cur=parseInt(getStyle(obj, name)); // cur 当前移动的数值
  26. }
  27.  
  28. var speed=(iTarget-cur)/5; // 物体运动的速度 数字越小动的越慢 /5 : 自定义的数字
  29.  
  30. speed=speed>0?Math.ceil(speed):Math.floor(speed);
  31.  
  32. if(Math.abs(speed)>MAX)speed=speed>0?MAX:-MAX;
  33.  
  34. if(name=='opacity')
  35. {
  36. obj.style.filter='alpha(opacity:'+(cur+speed)+')'; //IE
  37. obj.style.opacity=(cur+speed)/100; //ff chrome
  38. }
  39. else
  40. {
  41. obj.style[name]=cur+speed+'px';
  42. }
  43.  
  44. // 某个值不等于目标点
  45. if(cur!=iTarget)
  46. {
  47. bStop=false;
  48. }
  49. }
  50.  
  51. // 都达到了目标点
  52. if(bStop)
  53. {
  54. clearInterval(obj.timer);
  55.  
  56. if(fnEnd) //只有传了这个函数才去调用
  57. {
  58. fnEnd();
  59. }
  60. }
  61. }, 20);
  62. }

为什么会有bstop的假设呢?

其实如果我这样调用startMove(oDiv,{width:101,height:200});   宽度变成101 已经完成运动了,高度没有到, 但是我们可能已经关闭了当前的定时器。运动已经结束了,就会出现一个特殊情况下的bug。解释一下:

实际上来说,需要所有的运动都到了才关闭定时器,反过来说,如果没有不到的,那就关闭。在程序上就是定义一个布尔值,一开始为true,假设

所有的值都已经到了,如果说有一个值不等于目标点,bstop为false 。 在整个循环结束后,bstop 为ture 就说明所有运动都完成了,这个时候就关闭定时器。

那么这个运动框架基本已经完成了,适用css2 不适用css3。

总结:

运动框架的演变过程

startMove(iTarget)                 运动框架

startMove(obj,iTarget)           多物体

startMove(obj,attr,iTarget)      任意值

startMove(obj,attr,iTarget,fn)  链式运动

startMove(obj,json,fn)           完美运动

O(∩_∩)O谢谢 ~

Javascript 完美运动框架——逐行分析代码,让你轻松了解运动的原理的更多相关文章

  1. Javascript 链式运动框架——逐行分析代码,让你轻松了解运动的原理

    所谓链式运动,就是一环扣一环.我们的很多运动实际上来说指的就是分阶段的,第一个阶段动完,下个阶段开始动. 这个链式运动框架就是用来处理这些问题的. 我们先来看下之前的运动框架,以下是Javascrip ...

  2. Javascript 可同时变大变宽等一系列效果运动框架——逐行分析代码,让你轻松了解运动的原理

    等待已久的可变大,变宽 等一系列效果运动框架出炉了,现在还是个初级版本,能满足需求.我们看看是如何实现的. 我们知道在Javascript 中 ‘.’等同于 ‘[]’ 例如: oDiv.style.h ...

  3. Javascript 拖拽雏形——逐行分析代码,让你轻松了解拖拽的原理

    拖拽的原理: 其实就是鼠标与左上角的距离保持不变.我们来看下图, 这红点就是鼠标. 拖拽拖拽实际上来说就是通过鼠标的位置来计算物体的位置,就是这么简单,就是这么任性. 那这个距离怎么求呢?? 鼠标的位 ...

  4. Javascript 缓冲运动——逐行分析代码,让你轻松了解缓冲运动的原理

    看过上一篇关于Javascript 匀速运动文章的朋友相信对于运动已经有了初步的了解 接下来 讲一下关于缓冲运动的原理 ,我会逐行分析代码,代码简单易懂,能马上理解其中的原理,适用于初学者. #div ...

  5. Javascript 多物体运动——逐行分析代码,让你轻松了解运动的原理

    我们先来看下之前的运动的代码,是否支持多物体运动,会出现怎么样的问题. <style type="text/css"> div { width: 100px; heig ...

  6. Javascript 运动中Offset的bug——逐行分析代码,让你轻松了解运动的原理

    我们先来看看这个bug 是怎么产生的. <style type="text/css"> #div1 { width: 200px; height: 200px; bac ...

  7. Javascript 匀速运动停止条件——逐行分析代码,让你轻松了解运动的原理

    我们先来看下之前的匀速运动的代码,修改了速度speed后会出现怎么样的一个bug.这里加了两个标杆用于测试 <style type="text/css"> #div1 ...

  8. Javascript 拖拽的一些简单的应用——逐行分析代码,让你轻松了解拖拽的原理

    今天我们来看看如何让拖拽的物体不能拖出某个div之外和拖拽的吸附功能 上次讲到我们的拖拽是不可拖出可视区范围的,在这基础上我们加个父级的div,不让他拖出父级.原理和之前的一样,简单吧. <di ...

  9. Javascript 拖拽的一些高级的应用——逐行分析代码,让你轻松了解拖拽的原理

    我们看看之前的拖拽在周围有东西的时候会出现什么问题? 在高级浏览器中不会有啥问题,我们放到IE7下面测试一下,问题就出来了.如图 我们可以很清楚的看到,文字都已经被选中了.那这个用户体验很不好,用起来 ...

随机推荐

  1. MVC和传统的以模板为中心的web架构比较

    特性 以模板为中心 MVC架构 页面产生方式 运行并替换标签中的语句 由模板引擎生产HTML页面 路径解析 映射到文件系统路径,也可以通过rewrite等技术来重定向 由控制器定义,并可以通过路由系统 ...

  2. linux学习笔记之IO

    一.基础知识. 1:普通IO类型. 1,非阻塞IO:发出open/read/write等IO操作,并使这些操作不会永远阻塞.当不能完成时,会立即出错返回. 1)非阻塞的两种标志方式:指定标志:O_NO ...

  3. oracle数据块的大小

    标准数据块用于临时表空间和系统表空间,同时也是一个表空间数据块的默认值.标准数据块的大小是在创建数据库时由参数DB_BLOCK_SIZE确定的.若要改变这一设置必须重建数据库. DB_CACHE_SI ...

  4. 同一个View双击事件&&单击事件

    final long[] mHits = new long[2]; // iv_flaw_flow.setOnClickListener(new View.OnClickListener() { // ...

  5. Retrofit的使用

    参照文档:http://gank.io/post/56e80c2c677659311bed9841 一.创建Retrofit mRetrofit = new Retrofit.Builder() .b ...

  6. Moodle的qq登录版块的使用

    在这篇Moodle的qq登录(QQ登陆)版块的使用教程中,我们假定你已经有了一个有域名,外网能访问的Moodle2.4+网站,并且数据库使用的是mysql. 我们将提供Moodle的QQ登录版块的下载 ...

  7. Razor学习(二)@Html标签

    原文链接:http://blog.csdn.net/pasic/article/details/7093802 只是因为原文作者说的东西,还有很多作为基础知识的东西,我都没有掌握,所以总结在这里,蓝字 ...

  8. 阅读express的感悟

    在github上看了半天的源码,也是云里雾里,勉强也算看完了,通过查看很多人的讲解也方便了我的理解,今天记录下来,也算是做个笔记. 进入express的源码文件里我们可以看到8个文件:middlewa ...

  9. 什么是Activity、生命周期

    1.什么是Activity 1.当程序第一次运行时用户就会看这个Activity,这个Activity可以通过启动其他的Activity进行相关的操作. 2.当启动其他的Activty时这个当前的这个 ...

  10. 解决function.bind()方法

    这个 bind 方法只有在 ie10 版本的浏览器才得到原生支持,低于该版本的浏览器下执行时会得到一个 undefined 的错误提示. 于是只好再次上网 google 解决方案,功夫不负有心人,我们 ...