我有以下代码,我的问题是该transitionend
事件被触发两次.我不知道是什么造成了这种情况.我怀疑供应商前缀导致它,但他们没有.即使我只有离开transitionend
,并transition
仍然会闪光两次.
CSS
transition: 1s ease-out;
Run Code Online (Sandbox Code Playgroud)
JS
document.addEventListener('click', function (e) {
var submarine = document.querySelector('.submarine');
var submarineX = e.clientX - submarine.offsetWidth / 2;
var submarineY = e.clientY - submarine.offsetHeight / 2;
submarine.style.left = submarineX + "px";
submarine.style.top = submarineY + "px";
});
document.addEventListener('transitionend', function (event) {
console.log(event.type + " " + new Date().getTime());
});
Run Code Online (Sandbox Code Playgroud)
document.addEventListener('transitionend', function (event) {
console.log(event.type + " " + new Date().getTime());
});
document.addEventListener('click', function (e) {
var submarine = document.querySelector('.submarine');
var submarineX = e.clientX - submarine.offsetWidth / 2;
var submarineY = e.clientY - submarine.offsetHeight / 2;
submarine.style.left = submarineX + "px";
submarine.style.top = submarineY + "px";
});
Run Code Online (Sandbox Code Playgroud)
.submarine {
position: absolute;
top: 0;
left: 0;
width: 20px;
height: 20px;
background-color: red;
border-radius: 50%;
transition: 1s ease-out;
}
Run Code Online (Sandbox Code Playgroud)
<div class="submarine"></div>
Run Code Online (Sandbox Code Playgroud)
Fab*_*tté 75
transitionend
在你的情况下top
,每个财产都会被转移left
.
您可以访问与该事件相关联的媒体资源event.propertyName
.
有没有"过渡小号结束"事件,所以你可能会需要一些hackiness如过滤transitionend
回调处理,只为转移的特性之一.例如:
function (event) {
if (event.propertyName == 'top') {
//put your code here
}
});
Run Code Online (Sandbox Code Playgroud)
PS.没有浏览器触发MSTransitionEnd
事件.它在MS文档中的某个时刻,但在IE10测试版发布之前的某个时候,它被标准transitionend
事件所取代.
事件将针对已转换的每个属性触发.
propertyName
Fabricio建议的方式是正确的方法,但是根据情况你也可以使用one();
,就像这样.
$(document).one('transitionend webkitTransitionEnd MSTransitionEnd', function() {
...
});
Run Code Online (Sandbox Code Playgroud)
对于任何寻求简单,一次性复制和粘贴解决方案的人(我只提供了必要的CSS)。这不能回答问题,并且可以回答我登陆这里时的需求。
CSS:
.my-elem {
transition: height 0.5s ease-out, opacity 0.5s ease-out;
}
Run Code Online (Sandbox Code Playgroud)
JavaScript:
var elem = document.querySelector(".my-elem");
var transitionCounter = 0;
var transitionProp = window.getComputedStyle(elem , null)["transition-property"] || "";
// We just need to know how many transitions there are
var numTransitionProps = transitionProp.split(",").length;
elem.addEventListener("transitionend", (event) => {
// You could read event.propertyName to find out which transition was ended,
// but it's not necessary if you just want to know when they are all done.
if (transitionCounter < (numTransitionProps - 1)) {
transitionCounter++;
} else {
transitionCounter = 0; // reset
alert("I'm done!!!"); // do what you need to
}
}, false);
Run Code Online (Sandbox Code Playgroud)
经过IE11,Chrome 48和Firefox 37的测试。