jQuery动画效果
jQuery提供了较为丰富和简单的动画效果,但是效果是为了可用性服务的,如果简单的堆砌效果,往往适得其反。
jQuery的动画效果:
- 隐藏/显示
- 淡入/淡出
- 滑动
- 自定义动画
显示和隐藏
相关命令
show()用于显示包装集里的元素
hide()用于隐藏包装集里的元素
原理是修改style属性的display值,none表示隐藏。
实际使用中,在初始化的时候,不要利用元素的style属性使元素隐藏,而应该在页面的就绪处理程序里将hide()命令应用到想要使其隐藏的元素上,这样既能使元素隐藏,又可以确保每一个元素的初始状态可知,确保随后的操作可以如预期进行。
实际案例
可折叠的列表
<body>
<fieldset>
<legend>可折叠列表</legend>
<ul>
<li>1</li>
<li>2</li>
<li>3
<ul>
<li>3.1</li>
<li>3.2
<ul>
<li>3.2.1</li>
<li>3.2.2</li>
</ul>
</li>
<li>3.3</li>
</ul>
</li>
<li>4
<ul>
<li>4.1</li>
<li>4.2
<ul>
<li>4.2.1</li>
<li>4.2.2</li>
</ul>
</li>
<li>4.3</li>
</ul>
</li>
<li>5</li>
</ul>
</fieldset>
</body>
这样的效果显然不是友好的,当层次变深,条目变多,完全展开的列表会让用户找不到有用信息。所以用jQuery让子列表隐藏,当点击展开的时候再显示出来。
可以用如下方法实现:
$(function(){
$('li:has(ul)').click(function(event){
if(this == event.target){
if($(this).children().is(':hidden')){
$(this).css('list-style-image','url(minus.gif)').children().show();
}else{
$(this).css('list-style-image','url(plus.gif)').children().hide();
}
}
return false;
}).css('cursor','pointer').click();
$('li:not(:has(ul))'),css({
cursor:'default','list-style-image':'none'
});
});
切换元素的显示状态
toggle()命令可以在显示、隐藏两个状态中切换。
还是之前的例子,这次用toggle()来实现:
$(function(){
$('li:has(ul)').click(function(event){
if(this == event.target){
$(this).children().toggle();
$(this).css('list-style-image',($(this).children().is(':hidden'))?'url(plus.gif)':'url(minus.gif)');
}
return false;
}).css('cursor','pointer').click();
$('li:not(:has(ul))'),css({
cursor:'default','list-style-image':'none'
});
});
动画方式显示和隐藏
show()和hide()其实是有参数的。
hide(speed,callback)
使包装集里的元素变为隐藏状态。不带参数时,隐藏效果为突然发生。
如果提供speed参数,就可以调整元素的大小和不透明度,使得元素在短时内逐渐隐藏,完全隐藏之后再把元素的display样式属性值设置为none。speed可以是毫秒数、slow、normal、fast。
callback是可选的回调函数,用来完成动画结束之后的事情。这个函数的上下文被设置为以动画方式隐藏的元素。
show(speed,callback)
和hide()类似,只不过是把display的值改为inline或block。
toggle(speed,callback)
同上
加入动画之后,原解决方法需要调整,因为在页面加载好之后,该隐藏的部分不应该再展现出来,如果只单纯的在toggle()中加入参数,那么用户会在加载完成之后,看见该隐藏的部分渐渐的消失。所以需要显式的调用hide()将子列表隐藏起来。
$(function(){
$('li').css('pointer','default').css('list-style-image','none');
$('li:has(ul)').click(function(event){
if(this == event.target){
$(this).children().toggle('slow');
$(this).css('list-style-image',($(this).children().is(':hidden'))?'url(plus.gif)':'url(minus.gif)');
}
return false;
}).css({cursor:'pointer','list-style-image':'url(plus.gif)'}).children().hide();
$('li:not(:has(ul))'),css({
cursor:'default','list-style-image':'none'
});
});
淡入和淡出
相关命令
fadeIn()淡入效果
fadeOut()淡出效果
修改元素的透明度,除了不改变元素大小以外,与show()和hide()很相似。
fadeOut(speed,callback)
将非隐藏的任何已匹配元素的不透明度逐渐降低至0%,然后从显示器上删除
speed可以是毫秒数、slow、normal、fast,用来设定效果的持续时间
callback是可选的回调函数,用来完成动画结束之后的事情。这个函数的上下文被设置为以动画方式淡出的元素。
fadeIn(speed,callback)
与fadeOut()类似
fadeTo(speed,opacity,callback)
从当前的设置到opacity所指定的新设置,调整已包装的元素的不透明度。
opacity为目标不透明度,从0.0到1.0
滑动
相关命令
slideDown()向下滑动
slideUp()向上滑动
工作方式与show()、hide()类似,也有slideToggle()做二者的切换。
sildeDown(speed,callback)
通过从上往下逐渐扩大元素的垂直面积,使隐藏的任何已匹配的元素显示出来,非隐藏的元素不受影响。
参数意义和其他的命令几乎没有区别。
slideUp(speed,callback)
通过从下往上逐渐减小元素的垂直面积,最终使非隐藏的任何已匹配元素从显示器上删除。
参数意义和其他的命令几乎没有区别。
slideToggle(speed,callback)
在隐藏的元素上执行slideDown(),在非隐藏的元素上执行slideUp()。
停止动画
有时候需要停止一段已经开始的动画。
stop(),停止当前正在运行的、包装集里的元素的所有动画,这个命令没有参数。
自定义动画
相关命令
animate(),允许应用自定义的动画效果到包装集元素上
animate(properties,duration,easing,callback)
animate(properties,options)
将properties和easing参数所指定的动画应用到包装集的所有元素上,可以指定回调函数,在动画完成后调用,第二种方式除properties以外,还指定一组options。
properties,一个散列对象,指定在动画结束时所支持的CSS样式应该达到的终值。通过把元素的样式属性值,从当前值逐渐调整到这个散列对象所指定的终值从而产生动画。
duration,持续时间,不可缺省,取值和speed一样
easing,一个函数名称,用于实现缓和效果,核心jQuery提供了两个缓和函数,linear和swing。
callback,回调函数
options,指定动画参数值的对象,duration,easing,complete(完成时调用的函数),queue(如果为false,则动画会直接运行而不加入队列)
通常来说,能“动”的是数值型的属性(left,top,width,height,opacity,字体大小,边框尺寸)。
实际案例
坠落动画
$('.myAnimate').each(function(){
$(this)
.css('position','relative')
.animate(
{
opacity:0,
top:$(windows).height() - $(this).height() - $(this).position().top
},
'slow',
function(){$(this).hide();});
});
top的计算是利用了Dimensions插件的position()命令以便确定相对于页面的元素的初始位置。
消散动画
$('.myAnimate').each(function(){
var position = $(this).position();
$(this)
.css({
position:'absolute',
top:position.top,
left:position.left
})
.animate(
{
opacity:'hide',
width:$(this).width()*5,
height:$(this).height()*5,
top:position.top - ($(this).height()*5/2),
left:position.left - ($(this).width()*5/2)
},
'normal');
});