本文内容来自jQuery基础(四)—动画篇,记录下学习笔记
jQuery基础——动画篇
显示和隐藏
隐藏元素的hide
方法
语法:$(selector).hide(speed,callback)
直接隐藏:$elem.hide()
带参数的方法:
.hide("500");
.hide("fast" | "slow");
'fast'
和'slow'
分别代表200和600毫秒的延时,就是元素会执行200/600毫秒的动画后再隐藏.hide("500",function() { });
例如,如下的效果:
$("button:last").click(function() {
$("#a2").hide({
duration: 3000,
complete: function() {
alert('执行3000ms动画完毕')
}
})
});
效果如下:
显示元素的show
方法
show
方法的用法几乎与与hide
一致。
如下:
$('elem').hide(3000).show(3000)
让元素执行3秒的隐藏动画,然后执行3秒的显示动画。
需要注意的地方:
show
与hide
方法是修改的display
属性,通过是visibility
属性布局需要通过css
方法单独设置- 如果使用
!important
在你的样式中,比如display: none !important
,如果你希望.show()
方法正常工作,必须使用.css('display', 'block !important')
重写样式 - 如果让
show
与hide
成为一个动画,那么默认执行动画会改变元素的高度,高度,透明度
显示与隐藏切换toggle
方法
基本操作:toggle();
不带参数,无动画
提供参数:.toggle( [duration ] [, complete ] )
提供了时间、还有动画结束的回调
上卷下拉效果
下拉动画slideDown
.slideDown( [duration ] [, complete ] )
- duration:持续时间,以毫秒为单位,字符串
'fast'
和'slow'
分别代表200和600毫秒的延时。如果提供任何其他字符串,或者这个duration
参数被省略,那么默认使用400
毫秒的延时
大概的效果如下:
要注意的是:
1.下拉动画是从无到有,所以一开始元素是需要先隐藏起来的,可以设置display:none
上卷动画slideUp
最基本使用方式$("elem").slideUp();
,原理是找到元素的高度,然后采用一个下滑动画让元素一直滑到隐藏,当高度为0的时候,也就是不可见的时,修改元素display 样式属性被设置为none。
带参数:
.slideUp( [duration ] [, easing ] [, complete ] )
上卷下拉切换slideToggle
提供参数:.slideToggle( [duration ] ,[ complete ] )
同时也提供了时间的快速定义,字符串 'fast'
和 'slow'
分别代表200
和600
毫秒的延时
slideToggle("fast")
slideToggle("slow")
注意:
display
属性值保存在jQuery的数据缓存中,所以display
可以方便以后可以恢复到其初始值- 当一个隐藏动画后,高度值达到0的时候,
display
样式属性被设置为none
,以确保该元素不再影响页面布局
淡入淡出效果
淡出动画fadeOut
让元素在页面不可见,常用的办法就是通过设置样式的display:none
。除此之外还可以一些类似的办法可以达到这个目的。这里要提一个透明度的方法,设置元素透明度为0,可以让元素不可见,透明度的参数是0~1之间的值,通过改变这个值可以让元素有一个透明度的效果。常见的淡入淡出动画正是这样的原理。
fadeOut()
函数用于隐藏所有匹配的元素,并带有淡出的过渡动画效果
.fadeOut( [duration ], [ complete ] )
字符串 'fast'
和 'slow'
分别代表200和600毫秒的延时。如果提供任何其他字符串,或者这个duration参数被省略,那么默认使用400
毫秒的延时
淡入动画fadeIn
fadeIn()
函数用于显示所有匹配的元素,并带有淡入的过渡动画效果。
注意:
- 淡入的动画原理:操作元素的不透明度从0%逐渐增加到100%
淡入淡出切换fadeToggle
fadeToggle
切换fadeOut
与fadeIn
效果,所谓”切换”,即如果元素当前是可见的,则将其隐藏(淡出);如果元素当前是隐藏的,则使其显示(淡入)。
常用语法:.fadeToggle( [duration ] ,[ complete ] )
淡入效果fadeTo
fadeIn
:淡入效果,内容显示,opacity是0到1
fadeOut
:淡出效果,内容隐藏,opacity是1到0
如果要让元素保持动画效果,执行opacity = 0.5的效果时,要如何处理?
语法 .fadeTo( duration, opacity ,callback)
toggle与slideToggle以及fadeToggle的比较
操作元素的显示和隐藏可以有几种方法。
例如:
改变样式display为none
设置位置高度为0
设置透明度为0
都能达到这个目的,并且针对这样的处理jQuery都提供了各自的方法。show/hide
、sildeDown/sildeUp
、fadeIn/fadeOut
。除此之外,还引入了toggle
、sildeToggle
以及fadeToggle
切换方法
toggle
、sildeToggle
以及fadeToggle
的区别:
toggle:切换显示与隐藏效果
sildeToggle:切换上下拉卷滚效果
fadeToggle:切换淡入淡出效果
当然细节上还是有更多的不同点:
toggle
与slideToggle
细节区别:
toggle:动态效果为从右至左。横向动作,toggle通过display来判断切换所有匹配元素的可见性
slideToggle:动态效果从下至上。竖向动作,slideToggle 通过高度变化来切换所有匹配元素的可见性
fadeToggle
方法
fadeToggle() 方法在 fadeIn() 和 fadeOut() 方法之间切换。
元素是淡出显示的,fadeToggle() 会使用淡入效果显示它们。
元素是淡入显示的,fadeToggle() 会使用淡出效果显示它们。
注释:隐藏的元素不会被完全显示(不再影响页面的布局)
自定义动画
语法:
.animate( properties ,[ duration ], [ easing ], [ complete ] )
.animate( properties, options )
.animate()
方法允许我们在任意的数值的CSS属性上创建动画。
properties
一个或多个css属性的键值对所构成的Object对象。要特别注意所有用于动画的属性必须是数字的,除非另有说明;这些属性如果不是数字的将不能使用基本的jQuery功能。比如常见的,border、margin、padding、width、height、font、left、top、right、bottom、wordSpacing等等这些都是能产生动画效果的。background-color很明显不可以,因为参数是red或者GBG这样的值,非常用插件,否则正常情况下是不能只用动画效果的。注意,CSS 样式使用 DOM 名称(比如 “fontSize”)来设置,而非 CSS 名称(比如 “font-size”)。
特别注意单位,属性值的单位像素(px),除非另有说明。单位em 和 %需要指定使用
.animate({
left: 50,
width: '50px'
opacity: 'show',
fontSize: "10em",
}, 500);
除了定义数值,每个属性能使用’show’, ‘hide’, 和 ‘toggle’。这些快捷方式允许定制隐藏和显示动画用来控制元素的显示或隐藏
.animate({
width: "toggle"
});
如果提供一个以+=
或 -=
开始的值,那么目标值就是以这个属性的当前值加上或者减去给定的数字来计算的
.animate({
left: '+=50px'
}, "slow");
duration时间
动画执行的时间,持续时间是以毫秒为单位的;值越大表示动画执行的越慢,不是越快。还可以提供’fast’ 和 ‘slow’字符串,分别表示持续时间为200 和 600毫秒。
easing动画运动的算法
jQuery库中默认调用 swing。如果需要其他的动画算法,请查找相关的插件
complete回调
动画完成时执行的函数,这个可以保证当前动画确定完成后发会触发
$("#exec").click(function() {
var v = $("#animation").val();
var $aaron = $("#aaron");
if (v == "1") {
// 数值的单位默认是px
$aaron.animate({
width :300,
height :300
});
} else if (v == "2") {
// 在现有高度的基础上增加100px
$aaron.animate({
width : "+=100px",
height : "+=100px"
});
} else if (v == "3") {
$aaron.animate({
fontSize: "5em"
}, 2000, function() {
alert("动画 fontSize执行完毕!");
});
} else if (v == "4") {
//通过toggle参数切换高度
$aaron.animate({
width: "toggle"
});
}
});
animate在执行动画中,如果需要观察动画的一些执行情况,或者在动画进行中的某一时刻进行一些其他处理,我们可以通过animate提供的第二种设置语法,传递一个对象参数,可以拿到动画执行状态一些通知
.animate( properties, options )
options参数
duration - 设置动画执行的时间
easing - 规定要使用的 easing 函数,过渡使用哪种缓动函数
step:规定每个动画的每一步完成之后要执行的函数
progress:每一次动画调用的时候会执行这个回调,就是一个进度的概念
complete:动画完成回调
如下:
$("#exec").click(function() {
var v = $("#animation").val();
var $aaron = $("#aaron");
if (v == "1") {
//观察每一次动画的改变
$aaron.animate({
height: '50'
}, {
duration :2000,
//每一个动画都会调用
step: function(now, fx) {
$aaron.text('高度的改变值:'+now)
}
})
} else if (v == "2") {
//观察每一次进度的变化
$aaron.animate({
height: '50'
}, {
duration :2000,
//每一步动画完成后调用的一个函数,
//无论动画属性有多少,每个动画元素都执行单独的函数
progress: function(now, fx) {
$aaron.text('进度:'+arguments[1])
// var data = fx.elem.id + ' ' + fx.prop + ': ' + now;
// alert(data)
}
})
}
});
效果如下:
停止动画stop
语法:
.stop( [clearQueue ], [ jumpToEnd ] )
.stop( [queue ], [ clearQueue ] ,[ jumpToEnd ] )
stop还有几个可选的参数,简单来说可以这3种情况
.stop();
停止当前动画,点击在暂停处继续开始
.stop(true);
如果同一元素调用多个动画方法,尚未被执行的动画被放置在元素的效果队列中。这些动画不会开始,直到第一个完成。当调用.stop()
的时候,队列中的下一个动画立即开始。如果clearQueue参数提供true值,那么在队列中的动画其余被删除并永远不会运行
.stop(true,true);
当前动画将停止,但该元素上的 CSS 属性会被立刻修改成动画的目标值
简单的说:参考下面代码、
$("#aaron").animate({
height: 300
}, 5000)
$("#aaron").animate({
width: 300
}, 5000)
$("#aaron").animate({
opacity: 0.1
}, 2000)
1.stop():
只会停止第一个动画,第二个第三个继续
2.stop(true):
停止第一个、第二个和第三个动画
3.stop(true ture):
停止动画,直接跳到第一个动画的最终状态
如下:
jQuery核心
each
方法的应用
jQuery还提供了一个通用的jQuery.each
方法,用来处理对象和数组的遍历
语法:
jQuery.each(array, callback )
jQuery.each( object, callback )
第一个参数传递的就是一个对象或者数组,第二个是回调函数
$.each(["Aaron", "慕课网"], function(index, value) {
//index是索引,也就是数组的索引
//value就是数组中的值了
});
jQuery.each()
函数还会根据每次调用函数callback的返回值来决定后续动作。如果返回值为false,则停止循环(相当于普通循环中的break);如果返回其他任何值,均表示继续执行下一个循环。
$.each(["Aaron", "慕课网"], function(index, value) {
return false; //停止迭代
});
查找数组中的索引inArray
jQuery.inArray()
函数用于在数组中搜索指定的值,并返回其索引值。如果数组中不存在该值,则返回 -1。
语法:
jQuery.inArray( value, array ,[ fromIndex ] )
用法非常简单,传递一个检测的目标值,然后传递原始的数组,可以通过fromIndex
规定查找的起始值,默认数组是0开始
例如:在数组中查找值是5的索引
$.inArray(5,[1,2,3,4,5,6,7]) //返回对应的索引:4
去空格神器trim
方法
jQuery.trim()
函数用于去除字符串两端的空白字符
需要注意:
- 移除字符串开始和结尾处的所有换行符,空格(包括连续的空格)和制表符(tab)
get
方法获取DOM元素
jQuery是一个合集对象,如果需要单独操作合集中的的某一个元素,可以通过.get()
方法获取到
以下有3个a元素结构:
<a>1</a>
<a>2</a>
<a>3</a>
通过jQuery获取所有的a元素合集$(“a”),如果想进一步在合集中找到第二2个dom元素单独处理,可以通过get方法
语法:
.get( [index ] )
注意2点
- get方法是获取的dom对象,也就是通过document.getElementById获取的对象
- get方法是从0开始索引
所以第二个a元素的查找: $(a).get(1)
负索引值参数
get方法还可以从后往前索引,传递一个负索引值,注意的负值的索引起始值是-1
同样是找到第二元素,可以传递 $(a).get(-2)
DOM元素的获取index
方法
get
方法是通过已知的索引在合集中找到对应的元素。如果反过来,已知元素如何在合集中找到对应的索引呢?
.index()
方法,从匹配的元素中搜索给定元素的索引值,从0
开始计数。
语法:参数接受一个jQuery或者dom对象作为查找的条件
.index()
.index( selector )
.index( element )
- 如果不传递任何参数给
.index()
方法,则返回值就是jQuery对象中第一个元素相对于它同辈元素的位置 - 如果在一组元素上调用
.index()
,并且参数是一个DOM元素或jQuery对象,.index()
返回值就是传入的元素相对于原先集合的位置 - 如果参数是一个选择器,
.index()
返回值就是原先元素相对于选择器匹配元素的位置。如果找不到匹配的元素,则.index()
返回 -1
简单来说:
<ul>
<a></a>
<li id="test1">1</li>
<li id="test2">2</li>
<li id="test3">3</li>
</ul>
$("li").index()
没有传递参数,反正的结果是1,它的意思是返回同辈的排列循序,第一个li之前有a元素,同辈元素是a开始为0,所以li的开始索引是1
如果要快速找到第二个li在列表中的索引,可以通过如下2种方式处理
$("li").index(document.getElementById("test2")) //结果:1
$("li").index($("#test2")) //结果:1