动态添加的CSS过渡在反馈元素上只触发一次怎么办?
在做表单提交反馈时,给提示元素加了transition动画,但动态添加类名后动画只执行了一次。比如第一次显示成功提示有滑动效果,但第二次再切换类名时直接跳变。我用了这样的CSS:
.feedback-box {
opacity: 0;
transform: translateY(20px);
transition: all 0.3s ease;
}
.feedback-box.active {
opacity: 1;
transform: translateY(0);
}
用JS通过classList.toggle(‘active’)控制,第一次触发有动画,但后续切换状态时直接显示/隐藏,没有过渡效果。试过设置强制同步刷新也没用,是CSS写法有问题吗?
或者改CSS,用visibility配合opacity,状态更明确:
最简单的解法是用个强制reflow的小技巧,在切换类名之前让浏览器先“消化”掉当前样式。比如这样:
或者更干脆点,直接用重置动画的方式。你可以临时移除transition属性,等状态变了再加回来。WordPress里很多插件可以这么处理,比如做表单验证提示那种。
还有一种更稳的方案是用keyframe动画替代transition。把active类改成触发animation,每次添加类都重新播放动画,天然避免这个问题。比如定义个slide-in的animation,每次显示就toggle一个animate类,完事了自动移除,不依赖状态维持。
不过你说的情况,先试试offsetWidth那个方法,90%都能解决。老版本Wordpress的admin菜单动画就有类似问题,就是这么修的。