在前端开发中,我们经常使用CSS来实现过渡和动画效果。而在使用CSS过渡时,我们通常需要监听transitionend
事件来处理过渡结束后的行为,比如移除类名或者执行其他JavaScript代码。但是,在某些情况下,你会发现transitionend
事件会触发两次,这可能会导致你的代码出错或者产生不必要的行为。
问题原因
transitionend
事件会在CSS过渡完成时触发一次。然而,在某些情况下,例如在使用transform
属性时,浏览器会将transform
属性分解为多个子属性进行处理,从而导致transitionend
事件触发多次。具体来说,当transform
属性包含多个变换函数时,每个函数都会被视为一个独立的子属性,从而导致transitionend
事件被触发多次。
以下是一个示例代码,它将在元素上应用一个旋转和平移变换,并在过渡结束时显示一个警告框。在该示例中,transitionend
事件会触发两次:
--------- ----- ------ ------ ------- ---- - ------ ------ ------- ------ ----------------- ---- ----------- --------- --- - -------- ------- ------ ---- ------------------ -------- ----- --- - ------------------------------- ------------------------------------- -- -- - ----------------- --------- --- ------------------- - --------------- ------------------- --------- ------- -------
解决方案
要解决transitionend
事件多次触发的问题,我们可以使用以下两种方法:
方法一:移除过渡属性
在完成过渡后,我们可以将元素的过渡属性设置为none
,从而避免transitionend
事件再次触发。以下是修改后的示例代码:
--------- ----- ------ ------ ------- ---- - ------ ------ ------- ------ ----------------- ---- ----------- --------- --- - -------- ------- ------ ---- ------------------ -------- ----- --- - ------------------------------- ------------------------------------- -- -- - ----------------- --------- -------------------- - ------- --- ------------------- - --------------- ------------------- --------- ------- -------
方法二:监听所有子属性的事件
另一种解决方案是监听所有子属性的transitionend
事件,然后在所有事件完成后再执行所需的行为。以下是修改后的示例代码:
--------- ----- ------ ------ ------- ---- - ------ ------ ------- ------ ----------------- ---- ----------- --------- --- - -------- ------- ------ ---- ------------------ -------- ----- --- - ------------------------------- --- ------- - -- ------------------------------------- -- -- - ---------- -- -------- --- -- - ----------------- --------- - --- ------------------- - --------------- ------------------- --------- ------- -------
在这个示例中,我们使用了一个计数器来跟踪transitionend
事件的触发次数。当计数器达到2时,我们才执行所需的行为。
指导意义
遇到transitionend
事件多次触发的问题时,我们可以使用上述两种方法来解决。此外,还有一些其他的调试技巧可以帮助我们找出问题所在,比如打印事件对象或使用浏览器
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/30985