jquery的hide()方法的动画效果问题?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了jquery的hide()方法的动画效果问题?相关的知识,希望对你有一定的参考价值。
<script type="text/javascript">
(document).ready(function()
$("button").click(function()
$("div").hide(2000,function()
alert("Hello JavaScript");
);
);
);
</script>
上面代码的效果是以两秒的效果隐藏div后,再执行回调函数,弹出”Hello JavaScript“,那下面这段代码为什么不行?
<script type="text/javascript">
(document).ready(function()
$("button").click(function()
$("div").hide(2000);
alert("Hello JavaScript");
);
);
</script>
JS不是单线程吗? $("div").hide(2000);和 alert("Hello JavaScript");不应是前者执行完了,后者再执行吗?为什么前者的动画效果还没执行完,就执行后面的代码,难道是JS碰到动画之类效果的时候是抛给别的线程执行的,它自身不执行渲染之类的效果,所以它就立即执行后面的代码。
jquery的hide()方法的定义和用法:
如果被选的元素已被显示,则隐藏该元素。
实例:
隐藏可见的 <p> 元素:
$(".btn1").click(function()$("p").hide();
);
语法:
$(selector).hide(speed,callback) 参考技术A 不是$("div").hide(2000); 先执行完再执行下面的。如果效果都连在同一个jquery语句中,是可先执行完一动作,再另一动作。
如$("div").hide(2000).show(2000).(其它的事件等操作);
这样,后面的动作会依次执行。前面执行完后再后面的。追问
是不是jquery的动画实际上是用setTimeout()实现的。
而setTimeout()就相当于抛出个新的线程。
alert("Hello JavaScript");
JS引擎确实是单线程,settimeout也只是模拟出一个假象。就上两行代码是不同步的这和单线程没关系。追问
是不是jquery的动画实际上是用setTimeout()实现的。
而setTimeout()就相当于抛出个新的线程。
但方法的执行和效果的显示是可能出现不同步的。
出现你这个问题,是因为方法执行了,但效果还没有完成,就执行了alert方法。
这也是为什么hide,要定义callback方法的意义。
参见W3CSchool对这一问题的介绍:
http://www.w3school.com.cn/jquery/jquery_callback.asp追问
是不是jquery的动画实际上是用setTimeout()实现的。
而setTimeout()就相当于抛出个新的线程。
js是没有多线程的。 setTimeout只是模拟。 你可以测试一下:
setTimeout(function()alert(1);,1);
alert(2);
显示时2,1,说明setTimeout是不用等执行完,就可以执行下一句的。
jQuery动画+实例
1.动画基础隐藏和显示
jQuery中隐藏元素的hide方法
让页面上的元素不可见,一般可以通过设置css的display为none属性。但是通过css直接修改是静态的布局,如果在代码执行的时候,一般是通过js控制元素的style属性,这里jQuery提供了一个快捷的方法.hide()来达到这个效果
提供参数:
当提供hide方法一个参数时,.hide()就会成为一个动画方法。.hide()方法将会匹配元素的宽度,高度,以及不透明度,同时进行动画操作
快捷参数:
这是一个动画设置的快捷方式,’fast’ 和 ‘slow’ 分别代表200和600毫秒的延时,就是元素会执行200/600毫秒的动画后再隐藏
注意:
jQuery在做hide操作的时候,是会保存本身的元素的原始属性值,再之后通过对应的方法还原的时候还是初始值。比如一个元素的display属性值为inline,那么隐藏再显示时,这个元素将再次显示inline。一旦透明度 达到0,display样式属性将被设置为none,这个元素将不再在页面中影响布局
- jQuery中显示元素的show方法
css中有display:none属性,同时也有display:block,所以jQuery同样提供了与hide相反的show方法
方法的使用几乎与hide是一致的,hide是让元素显示到隐藏,show则是相反,让元素从隐藏到显示
看一段代码:使用上一致,结果相反
让元素执行3秒的隐藏动画,然后执行3秒的显示动画。
show与hide方法是非常常用的,但是一般很少会基于这2个属性执行动画,大多情况下还是直接操作元素的显示与隐藏为主
注意事项:
jQuery中显示与隐藏切换toggle方法
show与hide是一对互斥的方法。需要对元素进行显示隐藏的互斥切换,通常情况是需要先判断元素的display状态,然后调用其对应的处理方法。比如显示的元素,那么就要调用hide,反之亦然。 对于这样的操作行为,jQuery提供了一个便捷方法toggle用于切换显示或隐藏匹配元素
基本的操作:toggle();
这是最基本的操作,处理元素显示或者隐藏,因为不带参数,所以没有动画。通过改变CSS的display属性,匹配的元素将被立即显示或隐藏,没有动画。
display属性将被储存并且需要的时候可以恢复。如果一个元素的display值为inline,然后是隐藏和显示,这个元素将再次显示inline
提供参数:.toggle( [duration ] [, complete ] )
同样的提供了时间、还有动画结束的回调。在参数对应的时间内,元素会发生显示/隐藏的改变,在改变的过程中会把元素的高、宽、不透明度进行一系列动画效果。这个元素其实就是show与hide的方法
直接定位:.toggle(display)
直接提供一个参数,指定要改变的元素的最终效果
其实就是确定是使用show还是hide方法
2.上卷下拉效果
jQuery中下拉动画slideDown
对于隐藏的元素,在将其显示出来的过程中,可以对其进行一些变化的动画效果。之前学过了show方法,show方法在显示的过程中也可以有动画,但是.show()方法将会匹配元素的宽度,高度,以及不透明度,同时进行动画操作。这里将要学习一个新的显示方法slideDown方法
.slideDown()方法将给匹配元素的高度的动画,这会导致页面的下面部分滑下去,弥补了显示的方式
常见的操作,提供一个动画是时间,然后传递一个回调,用于知道动画是什么时候结束
持续时间(duration)是以毫秒为单位的,数值越大,动画越慢,不是越快。字符串 ‘fast’ 和 ‘slow’ 分别代表200和600毫秒的延时。如果提供任何其他字符串,或者这个duration参数被省略,那么默认使用400 毫秒的延时。
具体使用:
注意事项:
jQuery中上卷动画slideUp
对于显示的元素,在将其隐藏的过程中,可以对其进行一些变化的动画效果。之前学过了hide方法,hide方法在显示的过程中也可以有动画,但 是.hide()方法将为匹配元素的宽度,高度,以及不透明度,同时进行动画操作。这里将要学习一个新的显示方法slideUp方法
最简单的使用:不带参数
这个使用的含义就是:找到元素的高度,然后采用一个下滑动画让元素一直滑到隐藏,当高度为0的时候,也就是不可见的时,修改元素display 样式属性被设置为none。这样就能确保这个元素不会影响页面布局了
带参数:
同样可以提供一个时间,然后可以使用一种过渡使用哪种缓动函数,jQuery默认就2种,可以通过下载插件支持。最后一个动画结束的回调方法。
因为动画是异步的,所以要在动画之后执行某些操作就必须要写到回调函数里面,这里要特别注意
jQuery中上卷下拉切换slideToggle
slideDown与slideUp是一对相反的方法。需要对元素进行上下拉卷效果的切换,jQuery提供了一个便捷方法slideToggle用滑动动画显示或隐藏一个匹配元素
基本的操作:slideToggle();
这是最基本的操作,获取元素的高度,使这个元素的高度发生改变,从而让元素里的内容往下或往上滑。
提供参数:.slideToggle( [duration ] ,[ complete ] )
同样的提供了时间、还有动画结束的回调。在参数对应的时间内,元素会完成动画,然后出发回调函数
同时也提供了时间的快速定义,字符串 ‘fast’ 和 ‘slow’ 分别代表200和600毫秒的延时
注意:
3.淡入淡出效果
jQuery中淡出动画fadeOut
让元素在页面不可见,常用的办法就是通过设置样式的display:none。除此之外还可以一些类似的办法可以达到这个目的。这里要提一个透明度的方法,设置元素透明度为0,可以让元素不可见,透明度的参数是0~1之间的值,通过改变这个值可以让元素有一个透明度的效果。常见的淡入淡出动画正是这样的原理。
fadeOut()函数用于隐藏所有匹配的元素,并带有淡出的过渡动画效果
所谓”淡出”隐藏的,元素是隐藏状态不对作任何改变,元素是可见的,则将其隐藏。
通过不透明度的变化来实现所有匹配元素的淡出效果,并在动画完成后可选地触发一个回调函数。这个动画只调整元素的不透明度,也就是说所有匹配的元素的高度和宽度不会发生变化。
字符串 ‘fast’ 和 ‘slow’ 分别代表200和600毫秒的延时。如果提供任何其他字符串,或者这个duration参数被省略,那么默认使用400毫秒的延时
jQuery中淡入动画fadeIn
fadeOut是淡出效果,相反的还有淡入效果fadeIn,方法使用上两者都是一致的,只是结果相反
duration:指定过渡动画运行多长时间(毫秒数),默认值为400。该参数也可以为字符串”fast”(=200)或”slow”(=600)。
元素显示完毕后需要执行的函数。函数内的this指向当前DOM元素。
fadeIn()函数用于显示所有匹配的元素,并带有淡入的过渡动画效果。
注意:
jQuery中淡入淡出切换fadeToggle
fadeToggle()函数用于切换所有匹配的元素,并带有淡入/淡出的过渡动画效果。之前也学过toggle、slideToggle 也是类似的处理方式
fadeToggle切换fadeOut与fadeIn效果,所谓”切换”,即如果元素当前是可见的,则将其隐藏(淡出);如果元素当前是隐藏的,则使其显示(淡入)。
常用语法:.fadeToggle( [duration ] ,[ complete ] )
可选的 duration 参数规定效果的时长。它可以取以下值:”slow”、”fast” 或毫秒。 可选的 callback 参数是 fadeToggle完成后所执行的函数名称。
fadeToggle() 方法可以在 fadeIn() 与 fadeOut() 方法之间进行切换。如果元素已淡出,则 fadeToggle() 会向元素添加淡入效果。如果元素已淡入,则 fadeToggle() 会向元素添加淡出效果。
jQuery中淡入效果fadeTo
淡入淡出fadeIn与fadeOut都是修改元素样式的opacity属性,但是他们都有个共同的特点,变化的区间要么是0,要么是1
fadeIn:淡入效果,内容显示,opacity是0到1
fadeOut:淡出效果,内容隐藏,opacity是1到0
如果要让元素保持动画效果,执行opacity = 0.5的效果时,要如何处理?
如果不考虑CSS3,我们用JS实现的话,基本就是通过定时器,在设定的时间内一点点的修改opacity的值,最终为0.5,原理虽说简单,但是总不如一键设置这么舒服,jQuery提供了fadeTo方法,可以让改变透明度一步到位
语法
必需的 duration参数规定效果的时长。它可以取以下值:”slow”、”fast” 或毫秒。fadeTo() 方法中必需的 opacity 参数将淡入淡出效果设置为给定的不透明度(值介于 0 与 1 之间)。可选的 callback 参数是该函数完成后所执行的函数名称。
4.动画切换的比较
jQuery中toggle与slideToggle以及fadeToggle的比较
操作元素的显示和隐藏可以有几种方法。
例如:
都能达到这个目的,并且针对这样的处理jQuery都提供了各自的方法。show/hide、sildeDown/sildeUp、fadeIn/fadeOut。除此之外,还引入了toggle、sildeToggle以及fadeToggle切换方法
toggle、sildeToggle以及fadeToggle的区别:
当然细节上还是有更多的不同点:
toggle与slideToggle细节区别:
fadeToggle方法
5.自定义动画
jQuery中动画animate(上)
有些复杂的动画通过之前学到的几个动画函数是不能够实现,这时候就需要强大的animate方法了
操作一个元素执行3秒的淡入动画,对比一下2组动画设置的区别
显而易见,animate方法更加灵活了,可以精确的控制样式属性从而执行动画
语法:
.animate()方法允许我们在任意的数值的CSS属性上创建动画。2种语法使用,几乎差不多了,唯一必要的属性就是一组CSS属性键值对。这组属性和用于设置.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 和 %需要指定使用
除了定义数值,每个属性能使用’show’, ‘hide’, 和 ‘toggle’。这些快捷方式允许定制隐藏和显示动画用来控制元素的显示或隐藏
如果提供一个以+=
或 -=
开始的值,那么目标值就是以这个属性的当前值加上或者减去给定的数字来计算的
duration时间
动画执行的时间,持续时间是以毫秒为单位的;值越大表示动画执行的越慢,不是越快。还可以提供’fast’ 和 ‘slow’字符串,分别表示持续时间为200 和 600毫秒。
easing动画运动的算法
jQuery库中默认调用 swing。如果需要其他的动画算法,请查找相关的插件
complete回调
动画完成时执行的函数,这个可以保证当前动画确定完成后发会触发
jQuery中动画animate(下)
animate在执行动画中,如果需要观察动画的一些执行情况,或者在动画进行中的某一时刻进行一些其他处理,我们可以通过animate提供的第二种设置语法,传递一个对象参数,可以拿到动画执行状态一些通知
.animate( properties, options )
options参数
其中最关键的一点就是:
如果多个元素执行动画,回调将在每个匹配的元素上执行一次,不是作为整个动画执行一次
列出常用的方式:
- jQuery中停止动画stop
动画在执行过程中是允许被暂停的,当一个元素调用.stop()方法,当前正在运行的动画(如果有的话)立即停止
语法:
stop还有几个可选的参数,简单来说可以这3种情况
简单的说:参考下面代码、
jQuery中each方法的应用
jQuery中有个很重要的核心方法each,大部分jQuery方法在内部都会调用each,其主要的原因的就是jQuery的实例是一个元素合集
如下:找到所有的div,并且都设置样式,css只是一个方法,所以内部会调用each处理这个div的合集,给每个div都设置style属性
- jQuery的大部分方法都是针元素合集的操作,所以jQuery会提供
$(selector).each()
来遍历jQuery对象
.each只是处理jQuery对象的方法,jQuery还提供了一个通用的jQuery.each方法,用来处理对象和数组的遍历
语法
- 第一个参数传递的就是一个对象或者数组,第二个是回调函数
each就是for循环方法的一个包装,内部就是通过for遍历数组与对象,通过回调函数返回内部迭代的一些参数,第一个参数是当前迭代成员在对象或数组中的索引值(从0开始计数),第二个参数是当前迭代成员(与this的引用相同)
jQuery.each()函数还会根据每次调用函数callback的返回值来决定后续动作。如果返回值为false,则停止循环(相当于普通循环中的break);如果返回其他任何值,均表示继续执行下一个循环。
jQuery方法可以很方便的遍历一个数据,不需要考虑这个数据是对象还是数组
- jQuery中查找数组中的索引inArray
在PHP有in_array()判断某个元素是否存在数组中,JavaScript却没有,但是jQuery封装了inArray()函数判断元素是否存在数组中。注意了:在ECMAScript5已经有数据的indexOf方法支持了,但是jQuery保持了版本向下兼容,所以封装了一个inArray方法
jQuery.inArray()函数用于在数组中搜索指定的值,并返回其索引值。如果数组中不存在该值,则返回 -1。
语法:
用法非常简单,传递一个检测的目标值,然后传递原始的数组,可以通过fromIndex规定查找的起始值,默认数组是0开始
例如:在数组中查找值是5的索引
注意:
如果要判断数组中是否存在指定值,你需要通过该函数的返回值不等于(或大于)-1来进行判断
jQuery中去空格神器trim方法
页面中,通过input可以获取用户的输入值,例如常见的登录信息的提交处理。用户的输入不一定是标准的,输入一段密码:’ 1123456 “,注意了: 密码的前后会留空,这可能是用户的无心的行为,但是密码确实又没错,针对这样的行为,开发者应该要判断输入值的前后是否有空白符、换行符、制表符这样明显的无意义的输入值。
jQuery.trim()函数用于去除字符串两端的空白字符
这个函数很简单,没有多余的参数用法
需要注意:
jQuery中DOM元素的获取get方法
jQuery是一个合集对象,如果需要单独操作合集中的的某一个元素,可以通过.get()方法获取到
以下有3个a元素结构:
通过jQuery获取所有的a元素合集$("a")
,如果想进一步在合集中找到第二2个dom元素单独处理,可以通过get方法
语法:
注意2点
所以第二个a元素的查找: $(a).get(1)
负索引值参数
get方法还可以从后往前索引,传递一个负索引值,注意的负值的索引起始值是-1
同样是找到第二元素,可以传递 $(a).get(-2)
jQuery中DOM元素的获取index方法
get方法是通过已知的索引在合集中找到对应的元素。如果反过来,已知元素如何在合集中找到对应的索引呢?
.index()
方法,从匹配的元素中搜索给定元素的索引值,从0开始计数。
语法:参数接受一个jQuery或者dom对象作为查找的条件
简单来说:
$("li").index()
没有传递参数,反正的结果是1,它的意思是返回同辈的排列循序,第一个li之前有a元素,同辈元素是a开始为0,所以li的开始索引是1
如果要快速找到第二个li在列表中的索引,可以通过如下2种方式处理
以上是关于jquery的hide()方法的动画效果问题?的主要内容,如果未能解决你的问题,请参考以下文章