jQuery:动画 & 节点
- 定位
- 获取位置
- 滚动距离
- 动画
- 显示隐藏
- 淡入淡出
- 展开收起
- 动画队列
- 自定义动画
- 动画回调函数
- 动画延迟
- 节点
- 插入节点
- 删除节点
定位
获取位置
jquery
提供了两个方法,来获取元素所处的位置:
// 取值
jQuery对象.offset()
// 取值
jQuery对象.position()
其提供了两种方法来获取元素的位置,这两种方法的行为略有不同:
- 参照物:
offset
:以<html>
标签为参照物position
:以最近一级的带有定位的祖先元素为参照物
- 外边距:
offset
:计算外边距position
:不计算外边距
示例:
<div class="outer">
<div class="box"></div>
</div>
<script>
console.log('offset:', $('.box').offset())
console.log('position:', $('.box').position())
$('.outer').css('position', 'relative') // 添加定位
console.log('offset:', $('.box').offset())
console.log('position:', $('.box').position())
$('.box').css('margin-left', '50px')
console.log('offset:', $('.box').offset())
console.log('position:', $('.box').position())
</script>
输出结果:
offset: {top: 15, left: 28}
position: {top: 15, left: 28}
offset: {top: 15, left: 28}
position: {top: 0, left: 0}
offset: {top: 15, left: 78}
position: {top: 0, left: 0}
在outer
盒子内部,嵌套了一个box
盒子。第一次输出box
的位置,top: 15, left: 28
是outer
外层盒子到<html>
,这些在CSS
修饰中,没有展示。
随后给outer
添加了一个定位,再次输出,offset
不变依然以<html>
为参照物。而posotion
的值改变了,因为此时outer
带有定位属性,于是box
的position
改变参照物为outer
。
最后给box
添加了一个左边距,offset
的left
增加了,而position
没有。因为position
不计算外边距,而offset
计算外边距。
滚动距离
对于页面的滚动距离,jQuery
也提供了两种方法:
// 取值
jQuery对象.scrollLeft()
jQuery对象.scrollTop()
// 赋值
jQuery对象.scrollLeft('值')
jQuery对象.scrollTop('值')
如果不传参,方法就返回当前的值,如果传参,则设置指定值。
一般来说,常用$(windows).scroll()
注册浏览器的滚动事件,而$('html').scrollTop()
来控制页面的滚动距离。
动画
显示隐藏
// 显示
jQuery对象.show()
jQuery对象.show(持续时间)
// 隐藏
jQuery对象.hide()
jQuery对象.show(持续时间)
// 切换
jQuery对象.toggle()
jQuery对象.toggle(持续时间)
对于显示和隐藏,如果不传入参数,那么就是直接切换状态。如果传入一个数值,此时就会变成一个动画,逐渐出现或消失,持续时间以毫秒为单位。
示例:
<button class="show">show</button>
<button class="hide">hide</button>
<button class="toggle">toggle</button>
<div class="box"></div>
<script>
$('.show').click(function () {
$('.box').show(1000)
})
$('.hide').click(function () {
$('.box').hide(1000)
})
$('.toggle').click(function () {
$('.box').toggle(1000)
})
</script>
以上代码,创建了三个按钮和一个盒子,给按钮绑定事件,修改盒子的显示状态。
输出结果:
淡入淡出
jQuery
不只有简单的出现与消失来控制显示状态,还有一些其它的方法提供更加多样的效果。
// 淡入
jQuery对象.fadeIn()
jQuery对象.fadeIn(持续时间)
// 淡出
jQuery对象.fadeIn()
jQuery对象.fadeIn(持续时间)
// 切换
jQuery对象.fadeToggle()
jQuery对象.fadeToggle(持续时间)
接口用法与之前一致。
示例:
<button class="show">fadeIn</button>
<button class="hide">fadeOut</button>
<button class="toggle">fadeToggle</button>
<div class="box"></div>
<script>
$('.show').click(function () {
$('.box').fadeIn(1000)
})
$('.hide').click(function () {
$('.box').fadeOut(1000)
})
$('.toggle').click(function () {
$('.box').fadeToggle(1000)
})
</script>
这和之前是相似的代码,只是改变了三个方法。
输出结果:
展开收起
jQuery
的最后一个基本动画就是展开与收起。
// 展开
jQuery对象.slideDown()
jQuery对象.slideDown(持续时间)
// 收起
jQuery对象.slideUp()
jQuery对象.slideUp(持续时间)
// 切换
jQuery对象.slideToggle()
jQuery对象.slideToggle(持续时间)
使用方法和前两者一样。
示例:
<button class="show">slideDown</button>
<button class="hide">slideUp</button>
<button class="toggle">slideToggle</button>
<div class="box"></div>
<script>
$('.show').click(function () {
$('.box').slideDown(1000)
})
$('.hide').click(function () {
$('.box').slideUp(1000)
})
$('.toggle').click(function () {
$('.box').slideToggle(1000)
})
</script>
输出结果:
动画队列
如果频繁地触发动画效果,就会触发一个延迟效果:
此处频繁点击了按钮触发动画,当点击结束后很长一段时间,动画依然在持续,这是因为动画队列的存在。
每当触发一个动画,这个动画就会进入动画队列,浏览器依次执行队列中的动画。当多次点击按钮,其实就是加入了很多个动画到队列内部,此时当鼠标不再点击,队列内部还有动画,所以它还会执行。
这种动画队列,会显得浏览器响应有延迟性,所以实际上常常需要在执行动画前,把动画队列清空,让用户的点击触发的动画,可以立马执行。
语法:
// 停止动画
jQuery对象.stop()
jQuery对象.stop(true)
jQuery对象.stop(true, true)
这个stop
方法有三种传参形式,分别传入0 1 2
个true
:
无参
:立刻终止当前动画,进入下一个动画true
:立刻终止当前动画,清空队列,并定格在当前状态true true
:立刻终止当前动画,清空队列,并且跳转到当前动画结束的状态
想要处理反应不灵敏的问题,只需要每次执行动画前,stop
终止之前的动画:
<button class="show">slideDown</button>
<button class="hide">slideUp</button>
<button class="toggle">slideToggle</button>
<div class="box"></div>
<script>
$('.show').click(function () {
$('.box').stop().slideDown(1000)
})
$('.hide').click(function () {
$('.box').stop().slideUp(1000)
})
$('.toggle').click(function () {
$('.box').stop().slideToggle(1000)
})
</script>
此处的stop
是无参数的,因为确保每次新的动画产生,都会立刻终止前一个动画,所以可以确保动画队列从始至终只有一个动画。
输出结果:
这一次,点击按钮后反应就非常的迅速,因为会立刻终止上一次的动画,保证这次的动画立刻执行。
自定义动画
为了支持更加复杂的动画效果,jQuery
提供了animate
方法:
jQuery对象.animate({属性}, 时间)
其第一个参数为一个对象,对象内部是要变化的属性值,以键值对的形式。第二个参数是时间,即整个动画持续的时间,以毫秒为单位。
在第一个参数内部,只有支持数值类的属性,比如%
、px
或者纯数字。如果说color
这样的属性,就不能通过动画改变。
示例:
<button class="animate">animate</button>
<div class="box"></div>
<script>
$('.animate').click(function () {
$('.box').animate({
height: 50,
width: 150,
marginLeft: 100,
marginTop: 150
}, 1000)
})
</script>
以上案例中,给box
创建了一个动画,该动画会改变box
的宽高,以及左边距和上边距,共持续一秒。
输出结果:
这样就完成了一个多个属性都在改变的复杂动画。
动画回调函数
在动画结束后,jQuery
允许立刻执行一个回调函数,来处理一些动画的后续动作。
语法:
jQuery对象.基础动画方法(回调函数)
jQuery对象.基础动画方法(时间, 回调函数)
jQuery对象.animate({属性}, 回调函数)
jQuery对象.animate({属性}, 时间 , 回调函数)
动画分为三种基础动画和animate
实现的复杂动画,想要执行回调函数,在原先的传参情况下,最后一个参数额外填入一个回调函数即可。
在回调函数内部,this
是触发动画的DOM
元素,这可以很方便的进行一些收尾的样式调整。
示例:
<button class="animate">animate</button>
<div class="box"></div>
<script>
$('.animate').click(function () {
$('.box').animate(
{ width: 400 },
2000,
function () {
$(this).css('backgroundColor', 'pink')
})
})
</script>
之前提到过,animate
只能处理数值类的属性,背景色backgroundcolor
就不允许在动画中调整。此时就可以在动画结束时,通过回调函数内的$(this)
修改背景色。
输出结果:
动画延迟
如果希望在用户操作后,延迟一段时间再播放动画,此时可以时使用延迟方法。
语法:
jQuery对象.delay(延迟时间).动画方法()
此处的delay
就用于延迟,延迟后返回的还是原先的对象,可以继续执行动画方法,比如animate
,延迟时间以毫秒为单位。
这个延迟可以穿插在多个动画中:
$('.test')
.delay(1000).animate({...})
.delay(1000).animate({...})
.delay(1000).animate({...})
以上代码就是三个动画连续播放的样例,在每两个动画方法之间,插入一个delay
,也就是一个动画结束后一秒播放另一个动画。
节点
插入节点
jQuery
封装了在指定位置动态插入元素节点的方法,可以灵活的增加节点以及改变节点的位置。
语法:
父节点.append(参数) // 插入到父节点的尾部
父节点.prepend(参数) // 插入到父节点开头
兄弟节点.before(参数) // 插入到兄弟节点前面
兄弟节点.after(参数) // 插入到兄弟节点后面
在参数中填入要插入的元素,这个参数可以是文本形式的HTML
标签,也可以是通过原生DOM
创建的对象。
示例:
<button class="append">append</button>
<button class="before">before</button>
<div class="container">
<div class="child">A</div>
<div class="child">B</div>
<div class="child">C</div>
</div>
<script>
$('.append').click(function(){
$('.container').append('<div class="child new">D</div>')
})
$('.before').click(function(){
$('.new').before('<div class="child">E</div>')
})
</script>
以上代码,测试append
和cefore
方法。首先在父亲容器container
的末尾,插入一个子元素D
,随后在D
的前面又插入一个兄弟节点E
。
输出结果:
这四个方法不仅可以插入新元素,也可以移动现有元素的位置:
<button class="append">append</button>
<div class="container">
<div class="child A">A</div>
<div class="child B">B</div>
<div class="child C">C</div>
</div>
<script>
$('.append').click(function(){
$('.container').append($('.A'))
})
</script>
以上代码,把元素A
插入到container
的末尾,由于A
是本身就存在的元素,所以会产生一个移动的效果。
输出结果:
删除节点
在原生DOM
中,删除节点是比较麻烦的行为,要找到节点的父亲,然后从父亲把节点删掉。jQuery
简化了该过程,谁调用方法,就删掉谁。
语法:
jQuery对象.remove()