jQuery——动画

show() and hide()

1. show()和hide()

show()方法和hide()方法是jQuery中最基本的动画方法,在HTML文档里,为一个元素调用hide()方法,会将该元素的display样式改为none。

    $("element").hide();

这段代码的功能与css()方法设置display属性效果相同。

    $("element").css("display","none");

当把元素隐藏后,可以使用show()方法将元素的display样式设置为先前的显示状态("block"或"inline"或其他值)。

    $("element").show();
<body>
    <div id="panel">
        <h5 class="head">新闻标题</h5>
        <div class="content">新闻内容.............................................
            .....................................................................
            ......................................JavaScript库。
        </div>
    </div>
</body>
<script>

    $(function() {
        $("#panel h5.head").toggle(function() {
            $(this).next().hide();
        },function() {
            $(this).next().show();
        })
    })

</script>

注意hide()在将"内容"的display属性值设置未来"none"之前,会记住原先的display属性值。当调用show()方法时,就会根据方法记住的display属性值来显示元素。

在本例中,”内容“的display属性值是block,当点单击”标题“链接执行hide()方法的时候,hide()会做两步动作,首先会记住”内容“的display属性值block,然后把display属性值设置为”none“。

2. show()方法和hide()方法让元素动起来
show和hide方法在不带任何参数的情况下,是没有动画的,如果希望在调用show方法时,元素慢慢显示出来,可以为show()方法指定一个速度参数,例如,指定一个速度关键字”slow“:

    $("element").show("slow");

元素将在600ms内慢慢显示出来,其他的速度关键字 还有normal(400ms),fast(200ms)。

    $(function() {
        $("#panel h5.head").click(function() {
            $(".content").toggle("slow");
        })
    })
    $(function () {
        $(function () {
            $("#panel h5.head").click(function () {
                if ($(this).next().is(":visible")) {
                    $(this).next().hide(600);
                } else {
                    $(this).next().show(200);
                }
            })
        })
    })

fadeIn() and fadeOut()

与show()方法不相同的是,fadeIn()方法和fadeOut()方法只改变元素的不透明度。fadeOut方法会在指定的一段时间内降低元素的不透明度,直到元素完全小时(display:none)。fadeIn()方法则相反。

    $(function () {
        $(function () {
            $("#panel h5.head").click(function () {
                if ($(this).next().is(":visible")) {
                    $(this).next().fadeOut();
                } else {
                    $(this).next().fadeIn();
                }
            })
        })
    })

当第一次单击”标题“链接后,”内容“慢慢地消失了(淡出),当再次单击”标题“链接后,”内容“又慢慢地显示了(淡入)。


slideUp() and slideDown()

slideUp()方法和slideDown()方法只会改变元素的高度。如果一个元素的display属性值为none,当调用slideDown()方法时,这个元素将由上至下延伸显示。slideUp()方法正好相反,元素将由下至上缩短隐藏。使用slideUp()方法和slideDown()再次对”内容“的显示和隐藏方式进行改变。

    $(function () {
        $(function () {
            $("#panel h5.head").click(function () {
                if ($(this).next().is(":visible")) {
                    $(this).next().slideUp();
                } else {
                    $(this).next().slideDown();
                }
            })
        })
    })

jQuery中任何动画效果,都可以指定3种速度参数,即slow,normal,fast,时间长度分别为0.6秒,0.4秒,0.2秒。当使用速度关键字需要加引号,如果需要用数学作为时间参数就不需要加引号。

自定义动画方法animate()

很多情况下,需要对动画有更多控制,需要采用一些高级的自定义动画来解决这些问题,jQuery中,可以使用animate()方法来自定义动画。

    animate(params , speed , callback);
  • params:一个包含样式属性及值的映射。
  • speed:速度参数,可选。
  • callback:在动画完成时执行的函数,可选。

1. 自定义简单动画
前面的几个例子,从不同的方面使动画动了起来,animate()方法也可以使元素动起来,而且animate()方法更具有灵活性。通过animate()方法,能够实现更加精致新颖的动画效果。

现在有一个空白HTML文档,里面有一个div元素,单击div元素,能在页面上横向飘动。

<style>
    #panel {
        position: relative;
        width: 100px;
        height: 100px;
        border: 1px solid #0050D0;
        background: #96E555;
        cursor: pointer;
    }
</style>
<body>
    <div id="panel"></div>
</body>

为了使元素动起来,要更改元素的left样式属性。需要注意的是在使用animate()方法之前,为了能影响该元素的top,left,bottom,right样式属性,必须先把元素的position样式设置为relative或者absolute。

    $(function() {
        $("#panel").click(function() {
            $(this).animate({left:"500px"},3000);
        })
    });

在本段代码中,首先为id为panel的元素创建一个单击事件,然后对元素加入animate()方法,使元素在3秒内,向右移动500像素。

2. 累加、累减动画
在之前代码中,设置了{left:"500px"}作为动画参数。如果在500px之前加上"+="或者"-="符号即表示在 当前位置累加或者累减。

    $(function() {
        $("#panel").click(function() {
            $(this).animate({left:"+=500px"},3000);
        })
    });

3. 多重动画
1.同时执行多个动画
上面例子中,通用控制属性left的值实现了动画的效果,这是一个很单一的动画,如果需要同时执行多个动画,例如在元素向右滑动的同时,放大元素的高度:

    $(function() {
        $("#panel").click(function() {
            $(this).animate({left:"500px",height:"200px"},3000);
        })
    });

运行后,div元素在向右滑动同时,也会放大高度。

  1. 按顺序执行多个动画
    上例中,两个动画效果是同时发生的,如果想要按顺序执行动画,例如让div元素先向右移动,然后在放大高度,只需吧代码拆开,然后按顺序写就可以了。
            $(this).animate({left:"500px"},3000);
            $(this).animate({height:"200px"},3000);

因为都是对同一个jQuery对象继续操作,所以也可以改为链式写法。

            $(this).animate({left:"500px"},3000).animate({height:"200px"},3000);

像这样,动画效果的执行具有先后顺序,称为动画队列。

4. 综合动画
需求:单击div元素后,让它向右移动的同时增大它的高度,并将它的不透明度从0.5变换到1,然后在让它从上倒下移动,同时宽度变大,完成这些效果后,淡出隐藏。

    $(function() {
        $("#panel").click(function() {
            $(this).animate({left:"500px",height:"200px",opacity:"1"},3000);
            $(this).animate({top:"200px",width:"200px"},3000);
            $(this).fadeOut("slow");
        })
    });

动画回调函数

在上例中,如果想在最后一步切换元素的CSS样式,而不是隐藏元素:

    css("border","5px solid blue");

如果只是按照常规方式,将fadeOut("slow")改为css("border","5px solid blue")。

这样并不能得到预期效果。预期的效果是在动画的最后一步改变元素的样式,而实际的效果是,刚开始执行动画的时候,css()方法就被执行了。

出现这个问题的原因是css()方法并不会加入到动画队列中,而是立即执行。可以使用回调函数(callback)非动画方法实现排队,只要把css()方法写在最后一个动画的回调函数里即可。

        $("#panel").click(function() {
            $(this).animate({left:"500px",height:"200px",opacity:"1"},3000);
            $(this).animate({top:"200px",width:"200px"},3000,function() {
                $(this).css("border","5px solid blue");                
            });
        })

这样依赖,css()方法就加入动画队列中了。

注意:callback回调函数适用于jQuery所有的动画效果方法,例如slideDown()方法的回调函数:

  $("#element").slideDown("normal",function() {
      // ...
 })

这段代码表示,id=element的元素将在0.4秒内向下完全展开,当动画完成后,执行回调函数体内的代码。


停止动画和判断是否处于动画状态。

1. 停止元素的动画

很多时候需要停止匹配元素正在进行的动画,例如上例的动画,如果需要在某处停止动画,需要使用stop()方法。

    sopt([clearQueue],[gotoEnd]);
  • clearQueue:布尔值,代表是否要清空未执行完的动画队列
  • gotoEnd:代表是否直接将正在执行的动画跳转到末状态。

如果直接使用stop方法,则会立即停止当前正在进行的动画,如果接下来还有动画等待继续进行,则以当前状态开始接下来的动画。
经常遇到的一种情况,为一个元素绑定hover事件之后,用户把光标移入元素时触发动画效果,而当这个动画还没结束时,用户光标就移出元素了,那么光标移出的动画效果将会被放进队列中,等待光标移入的动画结束后再执行。

    $(function() {
        $("#panel").mouseover(function() {
            $(this).animate({left:"500px"},3000);
        })
        $("#panel").mouseout(function() {
            $(this).animate({left:"0px"},3000);
        })
    });

如上例子,鼠标移入会触发一段向右移动动画,假设移入div元素后不动,那么自然而然会触发第二段动画,但是第二段动画必须在第一段动画执行结束后在执行。

此时,只要在光标的移入、移出动画之前加入stop方法,就可以解决问题。stop()方法会结束当前正在进行的动画,并立即执行队列中的下一个动画。

    $(function() {
        $("#panel").mouseover(function() {
            $(this).stop().animate({left:"500px"},1500);
        })
        $("#panel").mouseout(function() {
            $(this).stop().animate({left:"0px"},1500);
        })
    });

如果遇到组合动画,例如:

        $("#panel").hover(function() {
            $(this).stop()
                .animate({height:"150px"},200)          // 如果此时发生了光标移出事件
                                                        // 将执行下面的动画
                                                        // 而非光标移出事件中的动画
                .animate({width:"300px"},300);
        },function() {
            $(this).stop()
                .animate({height:"22"},200)
                .animate({width:"60"},300);
        })

此时只用一个不带参数的stop()方法就显得力不从心了,因为stop()只会停止正在进行的动画,假设现在光标移入,动画正执行第一阶段(height:150),此时我们触发光标移出事件,只会停止当前的动画,并继续进行下面的animate(width:300),而我们的需求是直接跳过第一阶段的动画,这显然不是预期的结果。

这种情况下stop()方法的第一个参数发挥作用了,可以把第1个参数(clearQueue)设置为true,此时程序会把当前元素接下来尚未执行完的动画队列都清空。

        $("#panel").hover(function() {
            $(this).stop(true)
                .animate({height:"150px"},200)          // 如果此时发生了光标移出事件
                                                        // 将跳过后面的动画队列
                .animate({width:"300px"},300);
        },function() {                                  // 而开始执行这里的动画
            $(this).stop(true)
                .animate({height:"22"},200)
                .animate({width:"60"},300);
        })

第2个参数(gotoEnd)可以用于让正在执行的动画直接到达结束时刻的状态,通常用于后一个动画需要前一个动画的末状态的情况,可以通过stop(false,true)来让当前动画到达末状态。

当然也可以两者结合起来使用stop(true,true),即停止当前动画,并直接到达当前动画的末状态。并清空动画队列。

注意,jQuery只能设置正在执行的动画的最终状态,而没有提供直接到达未执行动画队列最终状态的方法。例如:

        $("div.content")
            .animate({width:"300"},200)
            .animate({height:"150"},300)
            .animate({opacity:"0.2"},2000);

**无论怎么设置stop()方法,均无法改变width或者height时,将此div元素的末状态变成300x150的大小,并且设置透明度0.2。

说白了,我们只能加快(直接到达)这个过程,或者说取消过程,直接看到结果。但是结果我们不能改变,这由样式决定了。

2. 判断元素是否处于动画状态
在使用animate()方法时候,要避免动画积累而导致的动画与用户的行为不一致。当用户快速在某个元素上执行animate动画时,就会出现动画积累。解决方法是判断元素是否处于动画状态,如果元素不出于动画状态,再为元素添加新的动画,否则不添加。

    if (! $("element").is(":animated")) {   // 判断元素是否正处于动画状态
        // 如果当前没有进行动画,则添加新动画
    }

这个判断方法在animate()动画中经常用到,需要注意。

3. 延迟动画
在动画执行过程中,如果想对动画进行延迟操作,那么可以使用delay()方法。

            $(this).animate({left:"400px",height:"200px",opacity:"1"},3000)
            .delay(1000)
            .animte({top:"200px",width:"200px"},3000)
            .delay(2000)
            .fadeOut("slow");

delay()方法允许我们将队列中的函数延迟执行。它既可以推迟动画队列中函数的执行,也可以用于自定义队列。

其他动画方法

jQuery中还有4个专门用于交互的动画方法。

  • toggle( speed , [callback] )

  • slideToggle(speed , [easing] , [callback])

  • fadeTo(speed , opacity , [callback])

  • fadeToggle(speed , [easing] , [callback])

toggle()
toggle()方法用于切换元素的可见状态。如果元素是可见的,则切换为隐藏的;如果元素是隐藏的,切换为可见的。

        $("#panel h5.head").click(function() {
            $(this).next().toggle();
        })

当单击”标题“链接后,”内容“会在可见和隐藏两种状态之间切换。
相当于:

        $("#panel h5.head").toggle(function() {
            $(this).next().hide();
        },function() {
            $(this).next().show();
        })

slideToggle()
slideToggle()方法通过高度变化来切换匹配元素可见性。这个动画效果只调整元素的高度。

        $("#panel h5.head").click(function() {
            $(this).next().slideToggle();
        })

单击”标题“后,”内容“会在可见和隐藏两种状态之间切换,不过是通过改变元素的高度来实现的。
相当于:

        $("#panel h5.head").toggle(function() {
            $(this).next().slideUp();
        },function() {
            $(this).next().slideDown();
        })

fadeTo()
fadeTo()方法可以把元素的不透明度以渐进方式调整到指定的值。这个动画只调整元素的不透明度,即匹配的元素的高度和宽度不会发生变化。

        $("#panel h5.head").click(function() {
            $(this).next().fadeTo(600,0.2);
        })

当“标题”被单击后,“内容”会渐渐地调整到指定的不透明度(20%)。

fadeToggle()
fadeToggle()方法通过不透明度变化来切换匹配元素的可见性。这个动画效果只调整元素的不透明度。

        $("#panel h5.head").click(function() {
            $(this).next().fadeToggle();
        })

相当于:

        $("panel h5.head").toggle(function() {
            $(this).next().fadeOut();
        },function() {
            $(this).next().fadeIn();
        })

总结:

特别注意animate()方法,它可以替代其他所有动画方法。

  • 代替show()
        $("p").animate({height:"show",width:"show",opacity:"show"},400);

        // 等价于

        $("p").show(400);
  • 代替fadeIn()
        $("p").animate({opacity:"show"},400);

        // 等价于

        $("p").fadeIn(400);
  • 代替slideDown()
        $("p").animate({height:"show"},400);

        // 等价于

        $("p").slideDown(400);
  • 代替fadeTo()
        $("p").animate({opacity:"0.6"},400);

        // 等价于

        $("p").fadeTo(400,0.6);

动画队列

  1. 一组元素上的动画效果

    • 当在一个animate()方法中应用多个属性时,动画是同时发生的。
    • 当以链式的写法应用动画方法时,动画是按照顺序发生的(除非queue选项值为false)。
  2. 多组元素上的动画效果

    • 默认情况下,动画都是同时发生的。
    • 当以回调的形式应用动画方式时(包括动画的回调函数和queue()方法的回调函数),动画是按照回调顺发生的。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 198,932评论 5 466
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,554评论 2 375
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 145,894评论 0 328
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,442评论 1 268
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,347评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,899评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,325评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,980评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,196评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,163评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,085评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,826评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,389评论 3 302
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,501评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,753评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,171评论 2 344
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,616评论 2 339

推荐阅读更多精彩内容

  • 隐藏元素的hide方法 让页面上的元素不可见,一般可以通过设置css的display为none属性。但是通过css...
    老夫撩发少年狂阅读 1,073评论 0 2
  • jQuery中隐藏元素的hide方法 让页面上的元素不可见,一般可以通过设置css的display为none属性。...
    阿r阿r阅读 1,129评论 0 4
  • 一、hide()、show()、toggle() //1.hide():在HTML文档中,为一个元素调用hide(...
    空谷悠阅读 563评论 0 0
  • 隐藏与显示 .hide() 隐藏某个元素.hide("fast / slow") //这是一个动画设置的快捷方式,...
    学开船不会开船阅读 174评论 0 0
  • 孤独之前是迷茫,孤独之后是成长。 ——刘同 正午时分,北京的天...
    云别鹤阅读 160评论 3 1