【发布时间】:2021-11-03 01:47:07
【问题描述】:
解释我的问题的最好方法是以下两个演示:
他们就是这样:
演示 1(在 chrome 中按预期工作,在 Firefox 中不起作用)
let handler = function () {
block.classList.add("visible");
requestAnimationFrame(() => block.classList.add("move"));
block.addEventListener(
"transitionend",
() => {
console.log("style is removed");
this.addEventListener("click", handler, { once: true });
block.classList.remove("move");
},
{ once: true }
);
};
btn.addEventListener("click", handler, { once: true });
.main {
display: none;
width: 100px;
height: 100px;
background: red;
transition: all 5.5s ease;
}
.visible {
display: block;
}
.move {
transform: translateX(100px);
background: blue;
}
<div id="block" class="main"></div>
<button id="btn">Animate</button>
演示 2(工作不正确)
let handler = function () {
block.classList.add("visible");
block.classList.add("move");
block.addEventListener(
"transitionend",
() => {
console.log("style is removed");
this.addEventListener("click", handler, { once: true });
block.classList.remove("move");
},
{ once: true }
);
};
btn.addEventListener("click", handler, { once: true });
.main {
display: none;
width: 100px;
height: 100px;
background: red;
transition: all 5.5s ease;
}
.visible {
display: block;
}
.move {
transform: translateX(100px);
background: blue;
}
<div id="block" class="main"></div>
<button id="btn">Animate</button>
我将快速强调两个演示之间的区别:
- 第一个演示有 requestAnimationFrame
<div>块在第一个演示中启动点击处理程序之前具有“可见”类在点击处理程序中,它有在第二个演示中添加“可见”类的代码
所以主要问题是:为什么第二个演示没有触发 transitionend 事件以及为什么我看不到转换?
额外演示
let handler = function () {
alert(1);
block.classList.add("visible");
alert(2);
setTimeout(() => {
alert(4);
block.classList.add("move");
alert(5);
});
block.addEventListener(
"transitionend",
() => {
console.log("style is removed");
this.addEventListener("click", handler, { once: true });
block.classList.remove("move");
},
{ once: true }
);
alert(3);
};
btn.addEventListener("click", handler, { once: true });
.main {
display: none;
width: 100px;
height: 100px;
background: red;
transition: all 5.5s ease;
}
.visible {
display: block;
}
.move {
transform: translateX(100px);
background: blue;
}
<div id="block" class="main"></div>
<button id="btn">Animate</button>
在 chrome 和 firefox 中检查它,似乎代码的某些部分调用了重新绘制,如果不是,请纠正我并解释原因。
【问题讨论】:
标签: javascript dom-events event-loop