JQuery源码分析 --- 运动animate 基本原理

本文基于JQuery2.0.3版本,下载地址 http://pan.baidu.com/s/1hrH1jne

在看源码之前我们先看一些小的运动效果

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>

    #div1{ width: 300px; height: 300px; background: red;}

    </style>
</head>
<body>

    <input type="button" value="点击" id="btn">
    <div id="div1"></div>

    <script src="jquery-2.0.3.js"></script>
    <script>

        $(function(){
            $(‘#btn‘).click(function() {
                $(‘#div1‘).toggle( 500 );  // 改变宽高 透明度

        //$(‘#div1‘).slideToggle( 500 ); 上下滑动

        //$(‘#div1‘).fadeToggle( 500 ); 淡入淡出
            });;
        });

    </script>
</body>
</html>

但这些方法的底层,其实调用的是animate,我们看看animate的使用方法

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>

    #div1{ width: 300px; height: 300px; background: red;}

    </style>
</head>
<body>

    <input type="button" value="点击" id="btn">
    <div id="div1"></div>

    <script src="jquery-2.0.3.js"></script>
    <script>

        $(function(){
            $(‘#btn‘).click(function() {

                // 通常animate带4个参数
                // 1、要改变的对象名
                // 2、运动所用的时间
                // 3、运动形式 默认是缓冲swing,匀速是linear 一般只有2种方法 ,可扩展
                // 4、回调函数

                $(‘#div1‘).animate({ width: 500 }, 1000, ‘swing‘, function(){
                    alert(1);
                });

         // $(‘#div1‘).animate({ width: ‘toggle‘ }, 1000);  其实还能这么写!
            });;
        });

    </script>
</body>
</html>

不过,在JQuery源码内部,这种写法其实被转成了这样

     $(function(){
            $(‘#btn‘).click(function() {

                $(‘#div1‘).animate({ width: 500 }, {
                    duration : 500,
                    easing : ‘swing‘,
                    complete : function(){
                        alert(1);
                    }
                });

       // 这种写法也叫配置写法,好处是不用担心少传参数,也不用担心参数顺序
            });;
        });

在JQuery源码的8341行, optall做了这件事,他把运动转成了配置写法

好,那接下来我们先分析第一个参数,animate第一个参数是一个对象,这个对象可以接收width,height,opacity这样的值,

也可以接收left, right, marginTop, paddingRight这样的值,那他是怎么做到的呢?

在源码内部的8326行,我们看到了一个叫做genFx的函数,他的作用就是收集第一个参数传进来的值

我们一起来看看这个函数内部是怎么实现的,在8451行

我们看到genFx函数接受2个参数,其中第二个参数是一个布尔值,

你传参,这个值就是1,不传就是0

而变量attrs是一个对象,他接受了你传进来的值,比如height,width等等,最后把这个值返回出去

所以我们回头再看第一个demo的时候,不难发现,其实JQuery内部是这样调用的,都是调用genFx函数,只是用参数控制执行

我们继续,在源码的8344行,我们看到这样一句,其实这句才真正实现了运动

未完待续。。。

如果你觉的本文对你有帮助,可随意支付一些小费,以鼓励我写出更多的文章。

时间: 2024-10-08 10:15:34

JQuery源码分析 --- 运动animate 基本原理的相关文章

JQuery源码分析 --- 运动animate 入队出队

我们都知道,所谓的运动就是操作定时器,但是如果我同时写3个运动,比如下面这样,效果会怎样呢? <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <style> #div1{ width: 300px; height: 300px; background: red

JQuery源码分析 --- 运动animate 预处理

在了解什么是预处理之前,我们先看一个小例子 <!DOCTYPE html><html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <style> #div1{ width: 300px; height: 300px; background: red; } </style> </he

jquery源码分析(二)——结构

再来复习下整体架构: jQuery源码分析(基于 jQuery 1.11 版本,共计8829行源码) (21,94)                定义了一些变量和函数jQuery=function(){} (96,280)        给jQuery添加一些方法和属性,jQuery.fn=jQuery.prototype(285,347)        extend:        jQuery的一些继承方法        更容易进行后续的扩展                       

jQuery源码分析系列(38) : 队列操作

Queue队列,如同data数据缓存与Deferred异步模型一样,都是jQuery库的内部实现的基础设施 Queue队列是animate动画依赖的基础设施,整个jQuery中队列仅供给动画使用 Queue队列 队列是一种特殊的线性表,只允许在表的前端(队头)进行删除操作(出队),在表的后端(队尾)进行插入操作(入队).队列的特点是先进先出(FIFO-first in first out),即最先插入的元素最先被删除. 为什么要引入队列? 我们知道代码的执行流有异步与同步之分,例如 var a

jQuery源码分析系列(34) : Ajax - 预处理jsonp

上一章大概讲了前置过滤器和请求分发器的作用,这一章主要是具体分析每种对应的处理方式 $.ajax()调用不同类型的响应,被传递到成功处理函数之前,会经过不同种类的预处理(prefilters). 预处理的类型取决于由更加接近默认的Content-Type响应,但可以明确使用dataType选项进行设置.如果提供了dataType选项, 响应的Content-Type头信息将被忽略. 有效的数据类型是text, html, xml, json,jsonp,和 script. dataType:预期

jQuery源码分析系列(39) : 动画队列

data函数在jQuery中只有短短的300行代码,非常不起点 ,剖析源码的时候你会发现jQuery只要在有需要保存数据的地方无时无刻不依赖这个基础设施 动画会调用队列,队列会调用data数据接口还保存队列里面的的动画数据 所以我们在自习回顾下关于数据缓存 //These may be used throughout the jQuery core codebase //存数据的 //用户使用 data_user = new Data(); //存储对象 //jQuery内部私有 //用来存事件

jQuery源码分析系列(33) : AJAX中的前置过滤器和请求分发器

jQuery1.5以后,AJAX模块提供了三个新的方法用于管理.扩展AJAX请求,分别是: 1.前置过滤器 jQuery. ajaxPrefilter 2.请求分发器 jQuery. ajaxTransport, 3.类型转换器 ajaxConvert 源码结构: jQuery.extend({ /** * 前置过滤器 * @type {[type]} */ ajaxPrefilter: addToPrefiltersOrTransports(prefilters), /** * 请求分发器 *

Jquery源码分析

1.概述 jQuery是一个非常优秀的Js库,与prototype,YUI,Mootools等众多的Js类库相比,它剑走偏锋,从web开发最实用的角度出发,抛除了一些中看但不实用的东西,为开发者提供一个短小精悍的类库.由于其个短小精悍,使用简单方便,性能相对高效.众多的开发者都选择Jquery来进行辅助的web开发. 在使用jquery时开发,我们也会时常碰到许多的问题,但是jquery的代码很晦涩,难起看懂,当开发时出现了问题,看不懂源码,不知道如何去排错. John Resig,Jquery

jQuery源码分析-jQuery中的循环技巧

Js代码   作者:nuysoft/JS攻城师/高云 QQ:47214707 EMail:[email protected] 声明:本文为原创文章,如需转载,请注明来源并保留原文链接. 前记:本文收集了jQuery中出现的各种遍历技巧和场景 Js代码   // 简单的for-in(事件) for ( type in events ) { } Js代码   // 缓存length属性,避免每次都去查找length属性,稍微提升遍历速度 // 但是如果遍历HTMLCollection时,性能提升非常