一.前言

继上一篇文章jquery stop的探索之后,我们继续对jquery动画animate的研究。

从stop给出参数我们就知道,它适合你去立即停止或者立即结束当前动画,清除或者继续非当前的动画队列。

注意,stop控制的只是该dom对象的动画,无法去控制不同dom的动画执行顺序产生的积累,动画回调也无法避免这种积累,只能设置全局的动画状态参数来控制

由此可见,stop函数是不需要一个动画队列完完整整地完成的。

然而,很多时候,我们需要一个动画队列执行完成,即便有其它的非常规操作,也只是让这些非常规的操作显得无效。

比如图片轮播,当你快速点击前进或者后退按钮时,轮播的图片不应当在其动画效果还未展示完毕时,就切换到其它位置。它需要展示完成一个图片轮播后,再去响应某个有效的点击,而不是响应每个点击。

而有效的点击则是指:在一个动画完成后(完成一个动画队列的总的duration)的最近一次的点击。

因此,从这个需求来看,jquery的stop函数并非是我们需要的(它适合常见的下拉菜单显示隐藏效果)。

在研究之前,我先声明下,我是基于jquery1.8版本以上的。

----------------------------------------------------------------------------------

二.动画执行顺序

动画都是有执行顺序的,比如,两个动画一起执行,或者一个动画执行完后,再执行另一个动画。

好,我们来看一下示例:

1.同步执行(并行)

注意,同步执行动画是针对不同的动画对象而言,同一动画对象(DOM)其实是串行的。非常合乎逻辑的。

2.按次序执行(串行)

注意示例1中的js代码,无论你用链式写法($('.box1').animate({left:'+=100px'}).silbings('.box2').animate({left:'+=100px'})),还是我那么分开写两个动画,它们是一起执行的,也就是并行执行。

而为了有先后顺序,你需要把次动画放在前一个动画的回调函数中。

当然,当动画队列太多的时候,你需要queue函数和dequeue函数来优化动画队列代码。详见:http://mrthink.net/jqueryapi-queue-dequeue/

但是,使用该技巧时应当注意,如果需要某个事件来重复执行该动画队列,这种方法就失效了,它只能执行一次。示例:

三.动画完成问题

前面给出的示例看似没有什么问题,都按照我们的预期正确执行了。但是,当你频繁点击go按钮时,问题就出现了。

对于示例1来说,如果我们要等待动画队列执行完毕后再执行,那么这个问题比较容易解决。

我加入了一个全局的动画标识animateFlag,用于判断动画是否执行完毕。但是,这段代码实在是丑陋无比。为了让动画完整地执行,我们却把代码拆分地有些支离破碎,一点都不优雅。

对于示例1,因为动画是并行执行,所以,只需要在其中一个动画的完成回调函数中进行动画完成动画标识animateFlag的设置即可。这时,你再快速点击go按钮(在一个duration时间范围内),动画没有积累了,只执行一次,等到执行完后,才响应完成后的第一个点击事件。

那么对于示例2的串行执行动画,我们要让其完整执行后再响应go按钮的点击事件,该怎么做呢?

来看一个示例:

以上技巧解决串行动画完成问题可以说是屡试不爽啊!

但是,我遇到了一个比较奇葩的问题,以上的技巧有些失效了。animate使用opacity属性来显示和隐藏动画时,就会产生bug。

这个问题,我也不知道如何解决。

jquery animate 详解的更多相关文章

  1. jQuery:详解jQuery中的事件(二)

    上一篇讲到jQuery中的事件,深入学习了加载DOM和事件绑定的相关知识,这篇主要深入讨论jQuery事件中的合成事件.事件冒泡和事件移除等内容. 接上篇jQuery:详解jQuery中的事件(一) ...

  2. jQuery.validator 详解二

    前言:上一篇详细的介绍了jQuery.validator( 版本v1.13.0 )的验证规则,这一篇重点讲述它的源码结构,及如何来对元素进行验证,错误消息提示的内部实现 一.插件结构(组织方式) 在讲 ...

  3. jQuery.validator 详解

    jQuery.validator 详解二 前言:上一篇详细的介绍了jQuery.validator( 版本v1.13.0 )的验证规则,这一篇重点讲述它的源码结构,及如何来对元素进行验证,错误消息提示 ...

  4. jquery方法详解

    jquery方法详解 http://www.365mini.com/doc

  5. Jquery 选择器 详解 js 判断字符串是否包含另外一个字符串

    Jquery 选择器 详解   在线文档地址:http://tool.oschina.net/apidocs/apidoc?api=jquery 各种在线工具地址:http://www.ostools ...

  6. JQuery动画详解(四)

    一:基本动画show()显示隐藏的匹配元素.这个就是 'show( speed, [callback] )' 无动画的版本.如果选择的元素是可见的,这个方法将不会改变任何东西.无论这个元素是通过hid ...

  7. JQuery数组详解(含实例)

    <!doctype html>jQuery数组处理详解(含实例演示)@Mr.Think 演示所用数组 var _mozi=['墨家','墨子','墨翟','兼爱非攻','尚同尚贤']; 1 ...

  8. [转载]JavaEE学习篇之——JQuery技术详解

    原文链接:http://blog.csdn.net/jiangwei0910410003/article/details/32102187 1.简介2.工具3.jQuery对象 1.DOM对象转化成j ...

  9. jquery扩展函数详解(我的人生颠覆)

    作者:zuoxiaolong8810(左潇龙),转载请注明出处,特别说明:本博文来自博主原博客,为保证新博客中博文的完整性,特复制到此留存,如需转载请注明新博客地址即可. 上次分析了jquery的源码 ...

随机推荐

  1. 编写一个程序,将a.txt文件中的单词与b.txt文件中的单词交替合并到c.txt文件中,a.txt文件中的单词用回车符分隔,b.txt文件中用回车或空格进行分隔

    package sundemo2; import java.io.File; import java.io.FileReader; import java.io.FileWriter; public ...

  2. 【百度地图API】如何制作自定义样式的公交导航结果面板?

    原文:[百度地图API]如何制作自定义样式的公交导航结果面板? 摘要: 百度地图API有默认的公交导航结果面板,但样式比较单一:而百度地图上的结果面板就比较美观.如何利用百度地图API来制作一个比较美 ...

  3. [ 单例、代理 & 通知 ]

    PS:手写单例.代理方法实现 & 通知的简单使用! [ 单例模式,代理设计模式,观察者模式! ] 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设 ...

  4. Mac OS X于Android Kernel下载方法

    于上一篇日志中,我总结了大家提供的下载Android源代码的方法.这里再简单总结一下内核的下载方法. 參考这里的介绍:http://source.android.com/source/building ...

  5. Web API 2 对 CORS 的支持

    Web API 2 对 CORS 的支持 CORS概念 跨域资源共享 (CORS) 是一种万维网联合会 (W3C) 规范(通常被认为是 HTML5 的一部分),它可让 JavaScript 克服由浏览 ...

  6. .NET Framework 各版本区别

    .NET Framework 各版本区别 .NET Framework 1.1 自1.0版本以来的改进:自带了对mobile asp .net控件的支持.这在1.0版本是以附加功能方式实现的,现在已经 ...

  7. MFC中的HOOK编程

    HOOK,n.钩, 吊钩,通常称钩子. 在计算机中,是Windows消息处理机制的一个平台,应用程序能够在上面设置子程以监视指定窗体的某种消息,并且所监视的窗体能够是其它进程所创建的.当消息到达后,在 ...

  8. 怎样下载并编译Android4.0内核源代码goldfish(图文)

    关于怎样下载Android4.0源代码,请查看我的博客内还有一篇文章(相同是图文教程): http://blog.csdn.net/flydream0/article/details/7036156 ...

  9. Solr安装(Tomcat)

    Solr安装(Tomcat)   安装环境 Windows 7 64bit Apache-tomcat-8.0.9-windows-x64 Solr-4.9.0 JDK 1.8.0_05 64bit ...

  10. android 实现分享功能两种方法

    当我想做一个智能的记事本的时候,我就在尝试自己写一组分享功能.后来才知道,原来每个社交软件中都有自己的分享接口. 这就大大减少了我们的代码量了. 第一种方法:特点--简单 package com.ex ...