css3 实现动画主要有 2 种方式
transition
过渡动画animation
自定义动画
问题
动画不生效
问题:
一个元素自身有 transtion 属性,在一个函数里面连续设置了 2 次这个元素的变化,为什么没有触发动画?
原因:
浏览器会将同一执行上下文中的样式修改批量合并处理,只渲染了最终状态,跳过了中间状态。
而 transtion 需要检测状态变化才能触发动画,如果起始状态和结束状态在同一渲染帧中,浏览器会直接显示最终状态
解决方法:
1.用 requestAnimationFrame
把第二次修改放到下一帧
const element = document.getElementById("animated-element");
// 第一次修改
element.style.transform = "translateX(100px)";
requestAnimationFrame(() => {
// 在下一帧执行第二次修改
element.style.transform = "translateX(200px)";
});
2.手动强制触发回流
const element = document.getElementById("animated-element");
// 第一次修改
element.style.transform = "translateX(100px)";
// 强制布局计算(触发回流)
element.offsetWidth; // 读取布局属性
// 第二次修改
element.style.transform = "translateX(200px)";
3.使用宏任务把第二次修改放到下一轮事件循环
const element = document.getElementById("animated-element");
// 第一次修改
element.style.transform = "translateX(100px)";
setTimeout(() => {
// 在宏任务队列中执行第二次修改
element.style.transform = "translateX(200px)";
});