Animation: remove 事件

Baseline 已广泛支持

此特性已经十分成熟,可在许多设备和浏览器版本上使用。自 2020 年 7 月以来,它已在各大浏览器中可用。

当动画被浏览器自动移除时,会触发 Animation 接口的 remove 事件。

语法

在诸如 addEventListener() 之类的方法中使用事件名称,或设置事件处理程序属性。

js
addEventListener("remove", (event) => { })

onremove = (event) => { }

事件类型

一个 AnimationPlaybackEvent 对象。继承自 Event

Event AnimationPlaybackEvent

事件属性

除了下面列出的属性之外,父接口 Event 的属性也可使用。

AnimationPlaybackEvent.currentTime 只读

生成事件的动画的当前时间。

AnimationPlaybackEvent.timelineTime 只读

生成事件的动画的时间线时间值。

示例

移除被替换的动画

在此示例中,我们有一个 <button id="start"> 元素,以及一个在鼠标移动时运行的事件监听器。<a href="/en-US/docs/Web/API/Element/mousemove_event" title="mousemove">mousemove 事件处理程序会设置一个动画,该动画会将 <button> 元素动画到鼠标指针的位置。这可能会导致动画列表非常庞大,从而引起内存泄漏。出于这个原因,现代浏览器会自动移除被其他动画覆盖的前向填充动画。

将显示创建的动画数量。remove 事件监听器用于计数并显示被移除的动画数量。

所有动画(除一个外)最终都应该被移除。

HTML

html
<button id="start">Click to drag</button>
<br />
<button id="reset">Reset example</button>
<p>
  Click the button to start the animation (disabled by default to protect those
  who suffer migraines when experiencing such animations).
</p>
<p>Animations created: <span id="count-created">0</span></p>
<p>Animations removed: <span id="count-removed">0</span></p>

CSS

css
:root,
body {
  margin: 0;
  padding: 0;
  height: 100%;
}

button {
  margin: 0.5rem 0;
}

JavaScript

js
const button = document.querySelector("#start");
let created = 0;
let removed = 0;

button.addEventListener(
  "click",
  () => {
    document.body.addEventListener("mousemove", (event) => {
      const animation = button.animate(
        { transform: `translate(${event.clientX}px, ${event.clientY}px)` },
        { duration: 500, fill: "forwards" },
      );
      created++;
      showCounts();

      // the remove event fires after the animation is removed
      animation.addEventListener("remove", () => {
        removed++;
        showCounts();
      });
    });
  },
  { once: true },
);

function showCounts() {
  document.getElementById("count-created").textContent = created;
  document.getElementById("count-removed").textContent = removed;
}

const reset = document.querySelector("#reset");
reset.addEventListener("click", () => {
  document.location.reload();
});

结果

规范

规范
Web 动画
# dom-animation-onremove
Web 动画
# remove-event

浏览器兼容性

另见