jQuery中的事件动画

1.事件

  1. DOM加载
  • $(document).ready()与window.onload
    1.前者jQuery方法在DOM完全就绪时就可以被调用;后者JavaScript方法在页面所有元素被完全加载到浏览器后才执行。
    因此jQuery将网页解析为DOM树的速度比把页面中的所有关联文件加载完毕的速度要快很多

存在未加载完毕,已经解析为DOM树,图片的宽高属性不一定有效  
2.前者可以多次执行,根据注册的顺序执行。后者之后执行一次,后者覆盖前者
3.前者可以简写为$(function(){})

  • load()会在所有加载完之后触发
  1. 事件绑定
  • bind(type[data,],fn)
    第一个参数为事件类型
    第二个参数为可选,作为event.data属性值传递给事件对象的额外数据对象
    第三个参数是用来绑定的处理函数
    $("#id").bind("mouseover”,function(){})简写为$("#id").mouseover(function(){})
  1. 合成事件
  • hover(enter,leave)模拟光标悬停
    光标移动到元素上,触发enter函数,离开触发第二个函数leave
  • toggle(fn1,fn2….fn)模拟鼠标连续单击事件
    第一次单击触发fn1,第二次单击触发fn2….直到最后一个。随后的每次单击都重复对着几个函数轮番调用
  • toggle()切换元素可见状态

无变有,有变无

1
2
3
4
5
6
7
$(function() {
$("p").toggle(function(){
$(this).next().toggle()
},function() {
$(this).next.toggle()
})
})
  1. 事件冒泡
    多个元素响应同一个事件,执行该事件会从底向上依次执行
  • 事件对象function(event),event只有事件处理函数才能访问到,事件处理函数执行完毕后,事件对象就被销毁
  • 停止事件冒泡event.stopPropagation()
  • 阻止默认行为event.preventDefault()
    实例:当用户名输入为空时,阻止提交
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    <head>
        <script>
           $(function(){
               $("#sub").bind("click",function(event){
                   var username = $("#username").val()
                   if(username == ""){
                       $("#msg").append("<p>文本内容不能为空</p>")
                       return false //event.preventDefault 阻止默认行为(表单提交)
                   }
               })
           })
        </script>
    </head>
    <body>
        <form action="test.html">
            用户名:<input type="text" id="username"/>
            <input type="submit" value="提交" id="sub" />
        </form>
        <div id="msg"></div>
    </body>
  • 事件捕获
    与冒泡相反的过程,并非所有的主流浏览器都支持事件捕获,jQuery不支持。
  1. 事件对象的属性
    1.event.type
    2.event.preventDefault()
    3.event.stopPropagation()
    4.event.target()获取到触发事件的元素
    5.event.relatedTarget访问相关元素
    6.event.pageX和event.pageY
    7.event.which获取鼠标单击时的左(1),中(2),右键(3);键盘按键;返回数字
    8.event.metaKey为键盘事件中获取ctrl按键
  2. 移除事件
  • unbind()
    one()方法可以为元素绑定处理函数,当处理函数触发一次后,立即被删除
    $('#btn').one("click",function(){})
    绑定多个时,只会在用户第一次单击时执行,之后毫无作用
  1. 模拟操作
  • trigger()
    $(#btn).trigger("click")当页面加载完毕后,就会立刻触发click
    也可以简写为$(#btn).click()
    触发自定义事件,传入一个参数自定义的事件名
  1. 其他
    bind()的第一个参数可以写多个”mousemove mouseout“,为多个事件类型同时绑定
    bind(“click.plugin”)绑定的多个事件类型用命名空间plugin规范起来,如果要删除事件,可以删除指定命名空间
    对于相同事件名称,不同命名空间。trigger(“click!”)感叹号的作用是匹配所有不包含在命名中的click方法

    2.动画

  • show()与hide()
    hide()会在将display设为none之前,记住原先的display属性值,后面调用show()可以还原
    参数可以为”fast“,”normal“,”slow“速度分别为200,400,600毫秒。也可以为数字,不带双引号,单位为毫秒
  • fadeIn()与fadeOut()改变元素的不透明度
    fadeOut()在一段时间内降低元素的不透明度(消失),fadeIn()相反
  • slideUp()和slideDown()改变元素的高度
    slideDown()由上至下延伸显示;slideUp()由下至上缩短隐藏

    自定义动画animate(params,speed,callback)

    $(this).animate({left:"500px",height:"200px"},3000)右移500px,放大高度200px会一次同时执行
    $(this).animate({left:"500px"},3000).animate({height:"200px"},3000)先右移再变高,分开执行

注意:css()方法并不会加入到动画队列,而是立即执行
如果需要css()方法在动画的最后执行,将css放入最后一个动画的回调函数中即可。
$(this).animate({left:"500px"},3000).animate({height:"200px"},3000,function(){$(this).css("border","5px soild blue")}
当动画完成之后,执行回调函数体内的代码

停止

  • 停止元素的动画stop([clearQueue],[gotoEnd])
    参数1用来是否清空未执行完的动画队列
    参数2是否将正在执行的动画跳转到末状态
    实例:鼠标移入时变高变宽,移出时变矮变窄

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    $(function({
                $("#panet").hover(function({
                    //移入
                    $(this).stop(true)     //传参数true,在移出之后清空移入时未执行完的动画
    //避免移出之后还在执行移入的动画
                                    .animate({height:"500px"},4000)
                                    .animate({width:"200px"},3000)
                    //移出
                },function({
                    $(this).stop(true)
                                    .animate({height:"20px"},3000)
                                    .animate({width:"90px"},8000)
                })
            })
  • 判断元素是否处于动画状态

    1
    2
    3
    if(! $(element).is(":animated"){    //判断元素是否正处于动画状态
    //如果当前没有进行动画,则添加新动画
    }
  • 延迟delay()方法将队列中的函数延时执行

    交互动画

  • 可见性交互

    • toggle(speed,callback)通过改变display值
    • slideToggle(speed,callback)通过改变高度
    • fadeToggle(speed,callback)通过改变透明度
  • fadeTo(speed,opacity,callback)将元素的不透明度以渐进的调整到指定值


实例:jQuery实现轮播图(手动)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <link rel="stylesheet" href="animate-right-left.css">
    <script src="jquery-3.5.1.js"></script>
    <script>
        $(function ({
            var i = 4
            var page = 1
            //向右箭头和视频展示区在同一个祖先元素下
            $("span.next").click(function ({
                var $parent = $(this).parents("div.v_show"//找祖先元素
                var $v_show = $parent.find("div.v_content_list"//根据祖先元素找视频展示区的图片轮播区
                var $v_content = $parent.find("div.v_content")  //找到视频展示区的div
                //获取div的宽度
                var v_width = $v_content.width()
                var len = $v_content.find("li").length
                var page_count = Math.ceil(len / i)   //总共的版面数
                //判断视频展示区是否正在处于动画状态
                if (!$v_show.is(":animated")) {
                    //不在动画中,页面也到达最后一个版面,向右应该回到第一个版面
                    if (page == page_count) {
                        $v_show.animate({ left: "0px" }, "slow")
                        page = 1
                    } else {
                        //改变left来换页面
                        $v_show.animate({ left: "-=" + v_width }, "slow")
                        page++
                    }
                    $parent.find("span").eq((page - 1)).addClass("current")
                        .siblings().removeClass("current")
                }
            })
            //往前 按钮
            $("span.prev").click(function ({
                var $parent = $(this).parents("div.v_show");//根据当前点击元素获取到父元素
                var $v_show = $parent.find("div.v_content_list"); //寻找到“视频内容展示区域”
                var $v_content = $parent.find("div.v_content"); //寻找到“视频内容展示区域”外围的DIV元素
                var v_width = $v_content.width();
                var len = $v_show.find("li").length;
                var page_count = Math.ceil(len / i);   //只要不是整数,就往大的方向取最小的整数
                if (!$v_show.is(":animated")) {    //判断“视频内容展示区域”是否正在处于动画
                    if (page == 1) {  //已经到第一个版面了,如果再向前,必须跳转到最后一个版面。
                        $v_show.animate({ left: '-=' + v_width * (page_count - 1) }, "slow");
                        page = page_count;
                    } else {
                        $v_show.animate({ left: '+=' + v_width }, "slow");
                        page--;
                    }
                    $parent.find("span").eq((page - 1)).addClass("current").siblings().removeClass("current");
                }
            });
        })
    </script>
</head>
<body>
    <div class="v_show">
        <div class="v_caption">
            <h2 class="cartoon" title="卡通动漫">卡通动漫</h2>
            <div class="highlight_tip">
                <span class="current">1</span><span>2</span>
            </div>
            <div class="change_btn">
                <span class="prev">上一页</span>
                <span class="next">下一页</span>
            </div>
            <em><a href="#">更多</a></em>
        </div>
        <!--视频展示区-->
        <div class="v_content">
            <!--图片轮播区-->
            <div class="v_content_list">
                <ul>
                    <li>
                        <a href="#"><img src="../imgs/cat/dahuangmao-01.png" alt="1" /></a>
                        <h4><a href="#">黄猫1</a></h4><span>播放:<em>28,786</em></span>
                    </li>
                    <li>
                        <a href="#"><img src="../imgs/cat/dahuangmao-02.png" alt="2" /></a>
                        <h4><a href="#">黄猫2</a></h4><span>播放:<em>28,786</em></span>
                    </li>
                    <li>
                        <a href="#"><img src="../imgs/cat/dahuangmao-03.png" alt="3" /></a>
                        <h4><a href="#">黄猫3</a></h4><span>播放:<em>28,786</em></span>
                    </li>
                    <li>
                        <a href="#"><img src="../imgs/cat/dahuangmao-04.png" alt="4" /></a>
                        <h4><a href="#">黄猫4</a></h4><span>播放:<em>28,786</em></span>
                    </li>
                    <li>
                        <a href="#"><img src="../imgs/cat/dahuangmao-05.png" alt="5" /></a>
                        <h4><a href="#">黄猫5</a></h4><span>播放:<em>28,786</em></span>
                    </li>
                    <li>
                        <a href="#"><img src="../imgs/cat/dahuangmao-06.png" alt="6" /></a>
                        <h4><a href="#">黄猫6</a></h4><span>播放:<em>28,786</em></span>
                    </li>
                </ul>
            </div>
        </div>
    </div>
</body>
</html>