博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JS如何监听动画结束
阅读量:5344 次
发布时间:2019-06-15

本文共 2055 字,大约阅读时间需要 6 分钟。

场景描述

在使用JS控制动画时一般需要在动画结束后执行回调去进行DOM的相关操作,所以需要监听动画结束进行回调。JS提供了以下事件用于监听动画的结束,简单总结学习下。

CSS3动画监听事件

transitionEnd事件

transitionEnd事件会在CSS transition动画结束后触发。

动画结束后触发监听事件

    transtionend demo        
鼠标移入

事件多次触发问题

当存在多个属性过渡变化时,结束时会多次触发transitionend事件。看个例子:

当过渡结束时,width和background-color都发生变化,会触发两次transionend事件

    transtionend demo        

事件失效问题及解决方案

1、在transiton动画完成前设置display:none,事件不会触发。

    transtionend demo        

2、当transition完成前移除transition一些属性时,事件也不会触发,例如:

    transtionend demo        

3、元素从display:none到block,不会有过渡,导致无法触发transitionend事件

例如:元素从display:none 到block opacity从0到1,无法触发过渡效果。

    transtionend demo        

无法触发过渡效果原因:

元素从none到block,刚生成未能即时渲染,导致过渡失效。所以需要主动触发页面重绘,刷新DOM。页面重绘可以通过改变一些CSS属性来触发,例如:offsetTop、offsetLeft、offsetWidth、scrollTop等。
触发过渡效果解决方案:
1、通过定时器延迟渲染

    transtionend demo        

2、强制获取当前内联样式

通过window.getComputedStyle()方法返回应用样式后的元的所有CSS属性的值,并解析这些值可能包含的任何基本计算。也就是说返回的属性值是已计算后的值,即DOM元素的样式已经更新了。然后再改变对应属性值触发过渡效果。例如:

    transtionend demo        

3、触发重绘刷新DOM

通过clientWidth触发重绘,例如:

    transtionend demo        

浏览器兼容性

移动端基本支持 android2.1+、webkit3.2+

详见

animationEnd事件

与transitonend事件类似,

Zepto中animate结束回调实现

查看了下zepto动画模块的源代码,animate()方法在动画结束后触发回调也是通过transitionend、animationend事件来触发。

另外在一些低版本的Android手机可能无法触发transitionend事件,需要手动触发。

$.fx = {    off: (eventPrefix === undefined && testEl.style.transitionProperty === undefined),    speeds: { _default: 400, fast: 200, slow: 600 },    cssPrefix: prefix,    transitionEnd: normalizeEvent('TransitionEnd'),    animationEnd: normalizeEvent('AnimationEnd')  }// 手动触发事件if (duration > 0){      this.bind(endEvent, wrappedCallback)      // transitionEnd is not always firing on older Android phones      // so make sure it gets fired      setTimeout(function(){        if (fired) return        wrappedCallback.call(that)      }, ((duration + delay) * 1000) + 25)    }

参考链接

转载于:https://www.cnblogs.com/GeniusLyzh/p/8324811.html

你可能感兴趣的文章
我并不是不闻不问![C#]
查看>>
LeetCode 9. Palindrome Number
查看>>
web前端经典小题
查看>>
AutoCAD如何倒角 倒圆角 倒直角
查看>>
Office PPT中如何插入flash
查看>>
C# Fade Form Effect With the AnimateWindow API Function
查看>>
golang多维数组的切片
查看>>
IP 网际协议
查看>>
C语言_第五章__实践(密码转换)
查看>>
docker 容器后台运行命令
查看>>
jquery 获取css position的值
查看>>
面向对象的程序设计
查看>>
a标签添加点击事件
查看>>
Context.startActivity出现AndroidRuntimeException
查看>>
Intellij idea创建javaWeb以及Servlet简单实现
查看>>
代理网站
查看>>
Open multiple excel files in WebBrowser, only the last one gets activated
查看>>
FFmpeg进行视频帧提取&音频重采样-Process.waitFor()引发的阻塞超时
查看>>
最近邻与K近邻算法思想
查看>>
【VS开发】ATL辅助COM组件开发
查看>>