此页面由社区从英文翻译而来。了解更多并加入 MDN Web Docs 社区。

View in English Always switch to English

Element:transitionrun 事件

基线 广泛可用

自 2020年3月 起,此特性已在主流浏览器中得到支持,可在大多数设备和浏览器版本中正常使用。

transitionrun 事件会在 CSS 过渡首次创建时触发,也即在任何 transition-delay 开始之前。

此事件不可取消。

语法

在诸如 addEventListener() 等方法中使用事件名称,或设置事件处理器属性。

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

ontransitionrun = (event) => { }

事件类型

TransitionEvent。继承自 Event

Event TransitionEvent

示例

以下代码为 transitionrun 事件添加监听器:

js
el.addEventListener("transitionrun", () => {
  console.log("过渡正在运行,但不一定已经开始实际过渡");
});

同样的效果,但使用 ontransitionrun 属性而非 addEventListener()

js
el.ontransitionrun = () => {
  console.log("过渡已开始运行,并将在过渡延迟结束后开始实际过渡");
};

运行实例

在下面的示例中,我们有一个简单的 <div> 元素,并为其设置了包含延迟的过渡样式:

html
<div class="transition">将鼠标悬停在我上方</div>
<div class="message"></div>
css
.transition {
  width: 100px;
  height: 100px;
  background: red;
  transition-property: transform, background;
  transition-duration: 2s;
  transition-delay: 1s;
}

.transition:hover {
  transform: rotate(90deg);
  background: transparent;
}

对此,我们再添加一些 JavaScript,以标明 transitionstarttransitionrun 事件在何处触发。

js
const el = document.querySelector(".transition");
const message = document.querySelector(".message");

el.addEventListener("transitionrun", () => {
  message.textContent = "transitionrun 已触发";
});

el.addEventListener("transitionstart", () => {
  message.textContent = "transitionstart 已触发";
});

el.addEventListener("transitionend", () => {
  message.textContent = "transitionend 已触发";
});

二者的区别在于:

  • transitionrun 在过渡创建时触发(即在任意延迟开始时)。
  • transitionstart 在实际动画开始时触发(即在任意延迟结束时)。

即使过渡在延迟到期前被取消,仍会触发 transitionrun。若没有过渡延迟,或 transition-delay 为负值,则会同时触发 transitionruntransitionstart

规范

规范
CSS Transitions Module Level 1
# transitionrun

浏览器兼容性

参见