jQuery(三) - jQuery 排序和动画

387 阅读3分钟

这是我参与8月更文挑战的第24天,活动详情查看:8月更文挑战

jQuery 排序

eq() 方法

jQuery 中获得的对象,内部包含选择的一组原生 js 对象,在 jQuery 对象中会进行一个大的排序,这个排序与原来的 HTML 结构没有关系。

image.png

eq() 方法在 jQuery 对象中通过下标获取某个对象,下标是 jQuery 对象中的大的排序的下标。比如有四个父盒子, 每个盒子中有四个<p>, 通过$("p")获取的16个元素之间进行下标的排序, 而不是在他们父盒子的基础上进行排序.

		var $ps = $("p");
		// 排序与自己原来的父级没有关系,只与 在 jQuery 对象中的新的位置有关
		// 给指定位置的对象添加颜色
		$ps.eq(1).css("background-color","red");
		$ps.eq(6).css("background-color","red");
		$ps.eq(9).css("background-color","red");
		$ps.eq(11).css("background-color","red");

image.png

index() 方法

jQuery 对象调用 index() 方法时,得到的是它自己在 HTML 结构中的兄弟中的下标位置。与jQuery 大排序没有关系。

image.png

each() 遍历

参数是一个函数。

作用:就是对 jQuery 对象中的元素每一个都执行函数内部的操作。

each 方法的基本原理就是 for 循环,从对象的下标为 0 的项一直遍历到最后一项,然后对每一项进行操作。

优点:

  1. each 的函数内部,也有一个 this,指向的是进来遍历的每一次的元素。

  2. each 的函数可以传一个参数 i,i 表示的是这一次的遍历对象在整体的 jQuery 对象大排队中的下标位置。

例1 比如下图中让每个父元素box的第二个元素p变红色的代码为:

image.png

            // 选择所有的 box 元素
            var $box = $(".box");
            
            $box.each(function () {
			// this 关键字,指向的是每一次遍历的元素对象
			$(this).children().eq(1).css("background","red");
		});

例2 在整体大排序中

		$ps.each(function (i) {
			// i 记录的是这一次遍历时当前元素在 jQuery 对象大排序中的位置
			$(this).click(function () {
				// 这个内部的this 就是事件源
				console.log(i); //整体排序的下标
				console.log($(this).index())  //在兄弟中的下标
			})

		})

jQuery 中的入口函数

相当于原生的 window.onload, 两者的区别:

  1. window.onload
  • onload 事件在加载时,指的是页面中多有的资源【DOM树、音频、视频、图片等】加载完毕后,才能触发, 速度比较慢
  • 一个页面中只能出现一次
  1. jQuery
  • jQuery 中的入口函数仅仅需要等待页面中的 DOM 树加载完毕就可以执行了, 速度更快
  • 在一个页面中,可以书写多个 jQuery 的入口函数,执行顺序按照前后加载顺序执行

语法1:

$(document).ready(function(){

// 获取元素

});

语法2:

$(function(){

// 获取元素

});

jQuery 切换效果方法

显示隐藏方法

• hide():元素隐藏,隐藏的前提必须是元素 display:block;

• show():元素显示,显示的前提必须是元素 display:none;

• toggle():在元素隐藏和显示之间进行切换。

这三个方法可以设置元素的显示和隐藏效果,在过程中还可以出现过渡动画。

参数

如果不传参数:直接显示和隐藏,没有过渡动画。

如果传递参数:

  • 单词格式:"slow","normal", "fast"

  • 数字格式的时间,单位是毫秒,在规定时间之内会出现显示或隐藏的动画。

过渡时间内,伴随着宽度和高度以及透明度的变化。

        // 添加点击事件,让图片实现显示和隐藏
        $btn1.click(function () {
            // $pic.hide("slow");
            $pic.hide(1000);
        })
        $btn2.click(function () {
            $pic.show("normal");
        })
        $btn3.click(function () {
            $pic.toggle("fast");
        })

滑动显示隐藏

slideDown() 和 slideUp() 方法

• slideDown():滑动显示(方向不一定)

• slideUp():滑动隐藏

• slideToggle():滑动切换

让元素在 display 属性的 block 和 none 之间进行切换。

参数

如果不传参数:默认的过渡时间为 400 毫秒。

如果传递参数:

  • 单词格式:"slow","normal", "fast"

  • 数字格式的时间,单位是毫秒,在规定时间之内会出现显示或隐藏的动画。

        // 添加点击事件,让图片实现滑动显示和隐藏
        $btn1.click(function () {
          $pic.slideUp(1000)
        })
        $btn2.click(function () {
          $pic.slideDown(1000)
        })
        $btn3.click(function () {
          $pic.slideToggle(1000)
        })

注意

• 如果滑动的元素没有设置宽高,没有滑动效果。

• 如果元素设置了高度和宽度,会进行上下垂直方向的滑动。

• 动画的效果:高度属性在 0 到设置值之间的变化,没有透明度动画。

• 如果元素设置了定位,偏移量方向如果是 bottom 参与了,滑动方向会发生变化。

淡入淡出

fadeIn() 和 fadeOut() 方法

• fadeIn():淡入,透明度逐渐增大最终显示。

• fadeOut():淡出,透明度逐渐降低最终隐藏。

• fadeToggle():切换效果。

• fadeTo():淡入或淡出到某个指定的透明度。淡入淡出都可以.

动画效果,执行的是透明度动画。也是在 display 属性的 block 和 none 之间切换。

参数

如果不传参数:默认的过渡时间为 400 毫秒。

如果传递参数:

  • 单词格式:"slow","normal", "fast"

  • 数字格式的时间,单位是毫秒,在规定时间之内会出现显示或隐藏的动画。

        // 添加点击事件,让图片实现淡入显示和淡出隐藏
        $btn1.click(function () {
          $pic.fadeOut("slow")
        })
        $btn2.click(function () {
          $pic.fadeIn(1000)
        })
        $btn3.click(function () {
          $pic.fadeToggle()
        })
        $btn4.click(function () {
          $pic.fadeTo(500,0.5)
        })

jQuery动画

animate() 动画方法

作用:执行 CSS 属性集的自定义动画。

语法:$(selector).animate(styles,speed,easing,callback)

  • 参数1: css 的属性名和运动结束位置的属性值的集合。

  • 参数2:可选,规定动画的速度,默认是 "normal"。其他值,“slow”、“normal”、“fast”,数字格式,单位为毫秒。

  • 参数3:可选,规定在不同的动画点中设置动画速度的 easing 函数,值包含 swing (先加速后减速) 和 linear (匀速)。

  • 参数4:可选,animate 函数执行完之后,要执行的函数。

注意:其他的运动方法比如 slideUp() 等,也有参数3 和参数4.

        // 获取元素
        var $ps = $("p");
        // 习惯会将运动时间存储到一个变量中
        var during = 2000;
        // 添加点击事件,让元素运动
        $ps.click(function () {
            // 让自己的 left 的值变为 500
            $(this).animate({"left": 500},during,"swing",function () {
                // 在运动结束后,让元素变红色
                $(this).css("background","red")
            })
            // 所有有数值的属性都可以运动
            $(this).animate({"width": 500})
            $(this).animate({"opacity": 0.5})
            $(this).animate({"background": "#000"}) //不能运动
        })

动画排队

• 同一个元素对象身上,如果定义了多个动画,动画会排队等待执行。

• 如果是不同的元素对象都有动画,不会出现排队机制。

• 如果是的其他非运动的代码,也不会等待运动完成。

• 之前学习的自带动画的显示隐藏方法,如果设置给同一个元素,也有动画排队。

• 同一个元素身上的运动,可以简化成链式调用的方法。

动画延迟

将 delay() 设置在某个运动方法之前,表示后面的运动要在规定的时间之后再执行,有延迟运动的效果。

  • 参数:时间的数值,表示延迟的时间。

除了 animate 方法之外,其他的运动方法如slideup(),slidedown()也有延迟效果。

$box2.delay(2000).animate({"left": 500},during);

停止动画 stop() 方法

• stop() 作用:设置元素对象身上的排队的动画以何种方式进行停止。

有两个参数,都是布尔值。

  • 参数1:设置是否清空后面的动画排队,如果是 true 表示清空,如果是 false 表示不清空只停止当前的一个动画。

  • 参数2:设置当前动画是否立即完成,如果是 true 表示立即完成,对象会立刻走到结束位置,如果是 false 表示不完成当前动画,立即停止在当前位置。

默认情况下,两个参数值默认值为 false。

根据两个参数的值,可以得到四种停止方式。

实际工作中,一般要求清空后面的排队,停止在当前位置,多使用 stop(true,false)

清空动画排队

如果将开启运动的程序放在一个事件函数中,事件多次被触发,会执行多次函数,就会在一个元素身上添加了多个动画,会进行动画排队。需要去清除排队的动画,进行防骚扰操作。

  • 方法1: 在每一次新的运动开始之前,去停止之前所有的动画排队

利用 stop() 方法。

在每一个运动函数之前都增加一个 stop(true),表示在运动执行之前,会将前面排队的动画清空,然后停止在当前位置。

        // 清除动画排队方法1: 在每一次新的运动开始之前,去停止之前所有的动画排队
        $box1.mouseenter(function () {
            $(this).children().stop(true).slideUp(during)
        })
        $box1.mouseleave(function () {
            $(this).children().stop(true).slideDown(during)
        })
  • 方法2: 使用函数节流方式

利用函数节流方法,如果元素在运动,直接 return,不要执行后面的运动代码。

• 每个 jQuery 对象,都能调用一个 is() 方法,作用是显示元素对象的某种状态。

• 如果参数位置是 is(“:animated”),返回值是布尔值,true 表示正在运动,false 表示没有运动。

        // 清空动画排队方法2:使用函数节流方式
        $box1.mouseenter(function () {
            // 判断元素自己是否在运动中,如果是,那么直接返回不要往下添加新的运动
            if ($(this).children().is(":animated")) {
                return;
            }
            // 如果走到这里,说明元素没有在运动,就可以添加新运动
            $(this).children().stop(true).slideUp(during)
        })
        $box1.mouseleave(function () {
            // 判断元素自己是否在运动中,如果是,那么直接返回不要往下添加新的运动
            if ($(this).children().is(":animated")) {
                return;
            }
            $(this).children().stop(true).slideDown(during)
        })