js在动画结束后调用函数

JavaScript016

js在动画结束后调用函数,第1张

调用函数为:

$().hover(function(){

startAni()

},

function(){

stopAni()

})

/*

data:2022-11-17

author:lfp

move运动函数

dom--需要运动的对象

json--{width:100,height:100,left:100,top:100}

callback--回调函数 可调用自己 实现异步动画效果

*/

//主函数

function move(dom,json,callback){

//让每一次动画都是新的开始,防止出现动画一直不停的运行

if(dom.timer)clearInterval(dom.timer)

var i=0

var start=0

//在对象中增加timer 便于控制他停止

dom.timer=setInterval(function(){

i++

//循环每一个目标属性添加动画方法

for(var attr in json){

//获取当前attr的属性值 已经去除了px 还有 如果初始值是auto 用零代替

var cur=getStyle(dom,attr)

if(i==1)start=cur

//拿到该属性的目标值

var target=json[attr]

//设置分成10次增加增量 你可以根据需要修改

var speed=(target-start)/10

console.log(speed+"====="+cur)

//如果没有达到目标值就一直加

if(Math.abs(cur-target)>1){

dom.style[attr]=cur+speed+"px"

}else{

//达到目标值了就停止或者其他情况也停止

clearInterval(dom.timer)

//等停止了动画再回调函数进行另外的操作

if(callback)callback.call(dom)

}

}

},45)

}

//配套函数

function getStyle(dom,attr){

var value=""

if(window.getComputedStyle){

value=window.getComputedStyle(dom,false)[attr]

}else{

value=dom.currentStyle[attr]

}

value=parseInt(value)

return value || 0//如果你再样式中没有设置初始的值就会出现NaN 所以要用0来补充

}

function $(id){

//return document.getElementById(id)

return document.querySelector("#"+id)

}

<div style="width:200pxheight:200pxbackground:Redposition:absoluteleft:10pxtop:10px" id="div1">div1</div>

<br><br>

<div style="width:200pxheight:200pxbackground:greenposition:absoluteleft:500pxtop:300px" id="div2">div2</div>

<br><BR><br><BR><br><BR><br><BR><br><BR><br><BR><br><BR><br><BR><br><BR><br><BR><br><BR>

<input name="tt" type="button" id="tt" value="交换位置" onclick="jiao()">

<script>

function getPos(obj){

var top=0,left=0

if(obj){

while(obj.offsetParent){

top += obj.offsetTop

left += obj.offsetLeft

obj = obj.offsetParent

}

}

return[top,left]

}

var flag

function jiao(){

clearTimeout(flag)

var obj1=document.getElementById("div1")

var obj2=document.getElementById("div2")

var a=getPos(obj1)

var b=getPos(obj2)

var t=5

var l=9

var Tflag=false

var Lflag=false

function move(){

if(a[0]<=b[0]){

var c=getPos(obj1)[0]-b[0]<t?t:getPos(obj1)[0]-b[0]

var d=getPos(obj2)[0]-a[0]>t?t:getPos(obj2)[0]-a[0]

if(getPos(obj1)[0]<b[0]){obj1.style.top=getPos(obj1)[0]+c}

if(getPos(obj2)[0]>a[0]){obj2.style.top=getPos(obj2)[0]-d}

}else{

var c=getPos(obj1)[0]-b[0]>t?t:getPos(obj1)[0]-b[0]

var d=getPos(obj2)[0]-a[0]<t?t:getPos(obj2)[0]-a[0]

if(getPos(obj1)[0]>b[0]){obj1.style.top=getPos(obj1)[0]-c}

if(getPos(obj2)[0]<a[0]){obj2.style.top=getPos(obj2)[0]+d}

}

if(getPos(obj1)[0]==b[0]&&getPos(obj2)[0]==a[0]){

Tflag=true

}

if(a[1]<=b[1]){

var c=getPos(obj1)[1]-b[1]<l?l:getPos(obj1)[1]-b[1]

var d=getPos(obj2)[1]-a[1]>l?l:getPos(obj2)[1]-a[1]

if(getPos(obj1)[1]<b[1]){obj1.style.left=getPos(obj1)[1]+c}

if(getPos(obj2)[1]>a[1]){obj2.style.left=getPos(obj2)[1]-d}

}else{

var c=getPos(obj1)[1]-b[1]>l?l:getPos(obj1)[1]-b[1]

var d=getPos(obj2)[1]-a[1]<l?l:getPos(obj2)[1]-a[1]

if(getPos(obj1)[1]>b[1]){obj1.style.left=getPos(obj1)[1]-c}

if(getPos(obj2)[1]<a[1]){obj2.style.left=getPos(obj2)[1]+d}

}

if(getPos(obj1)[1]==b[1]&&getPos(obj2)[1]==a[1]){

Lflag=true

}

if(!(Tflag&&Lflag)){

flag=setTimeout(move,30)

}

}

move()

}

</script>

花了一两个小时给你编写了一个,自己可以调整里面的参数,由于时间问题,没有仔细的测试!