【发布时间】:2016-04-25 16:26:57
【问题描述】:
我正在制作带有动画的定向翻转。我以为我找到了使用以下绑定的解决方案,但我没有注意到以下问题...
bind( 'transitionend webkitTransitionEnd oTransitionEnd otransitionend MSTransitionEnd', function() {
问题在于,如果您将鼠标悬停在左上方,那么动画会沿对角线翻转或旋转 - 您可以快速悬停 div 的多个部分,它会做一些疯狂的事情。我想要发生的是动画完成或重置,而不是立即尝试处理下一个悬停动画。所有现代浏览器(IE Edge / 11、Chrome、Firefox。这些都是我测试过的)都会出现这个问题。
我是不是走错了路?如何让我的 javascript 等待翻转动画完成?
相关的问题是,有时无论哪个方向,动画都会卡在从左到右或从上到下的动画,因为它没有等待完成,所以它可以删除其他类。
jQuery(document).ready(function() {
$('.galleryWrapper.bot .gallery-item').hover(
function(e) {
$(this).unbind('transitionend webkitTransitionEnd oTransitionEnd otransitionend MSTransitionEnd');
$(this).removeClass('rtl');
var w = $(this).width();
var h = $(this).height();
var x = (e.pageX - this.offsetLeft - (w / 2)) * (w > h ? (h / w) : 1);
var y = (e.pageY - this.offsetTop - (h / 2)) * (h > w ? (w / h) : 1);
var direction = Math.round(Math.atan2(y, x) / 1.57079633 + 5) % 4;
switch (direction) {
case 0: // Top
$(this).addClass('utd');
break;
case 1: // Right
$(this).addClass('rtl');
break;
case 2: // Bottom
$(this).addClass('dtu');
break;
case 3: // Left
$(this).addClass('ltr');
break;
}
},
function(e) {
$(this).on('transitionend webkitTransitionEnd oTransitionEnd otransitionend MSTransitionEnd', function() {
$(this).removeClass('utd rtl dtu ltr').addClass('rtl');
});
}
);
});
.galleryWrapper {
display: -webkit-flex;
display: flex;
-webkit-flex-wrap: wrap;
flex-wrap: wrap;
}
.galleryWrapper .gallery-item {
margin: 10px;
-webkit-perspective: 1000;
-moz-perspective: 1000;
-ms-perspective: 1000;
perspective: 1000;
-ms-transform: perspective(1000px);
-moz-transform: perspective(1000px);
-moz-transform-style: preserve-3d;
-ms-transform-style: preserve-3d;
}
.galleryWrapper .gallery-item,
.galleryWrapper .gallery-item .item .side {
width: 100px;
height: 100px;
box-sizing: border-box;
}
.galleryWrapper .gallery-item .item {
position: relative;
-webkit-transition: 0.6s;
-webkit-transform-style: preserve-3d;
-ms-transition: 0.6s;
-moz-transition: 0.6s;
-moz-transform: perspective(1000px);
-moz-transform-style: preserve-3d;
-ms-transform-style: preserve-3d;
transition: 0.6s;
transform-style: preserve-3d;
}
.galleryWrapper .gallery-item .item .side {
position: absolute;
top: 0;
left: 0;
-webkit-backface-visibility: hidden;
-moz-backface-visibility: hidden;
-ms-backface-visibility: hidden;
backface-visibility: hidden;
}
.galleryWrapper .gallery-item .item-front {
z-index: 2;
background-color: red;
}
.galleryWrapper .gallery-item .item-back {
background-color: blue;
}
.galleryWrapper .gallery-item.ltr .item-front {
-webkit-transform: rotateY(0deg);
-moz-transform: rotateY(0deg);
-o-transform: rotateY(0deg);
-ms-transform: rotateY(0deg);
transform: rotateY(0deg);
}
.galleryWrapper .gallery-item.ltr .item-back {
-webkit-transform: rotateY(180deg);
-moz-transform: rotateY(180deg);
-o-transform: rotateY(180deg);
-ms-transform: rotateY(180deg);
transform: rotateY(180deg);
}
.galleryWrapper .gallery-item.ltr:hover .item {
-webkit-transform: rotateY(180deg);
-moz-transform: rotateY(180deg);
-o-transform: rotateY(180deg);
-ms-transform: rotateY(180deg);
transform: rotateY(180deg);
}
.galleryWrapper .gallery-item.rtl .item-front {
-webkit-transform: rotateY(0deg);
-moz-transform: rotateY(0deg);
-o-transform: rotateY(0deg);
-ms-transform: rotateY(0deg);
transform: rotateY(0deg);
}
.galleryWrapper .gallery-item.rtl .item-back {
-webkit-transform: rotateY(-180deg);
-moz-transform: rotateY(-180deg);
-o-transform: rotateY(-180deg);
-ms-transform: rotateY(-180deg);
transform: rotateY(-180deg);
}
.galleryWrapper .gallery-item.rtl:hover .item {
-webkit-transform: rotateY(-180deg);
-moz-transform: rotateY(-180deg);
-o-transform: rotateY(-180deg);
-ms-transform: rotateY(-180deg);
transform: rotateY(-180deg);
}
.galleryWrapper .gallery-item.utd .item,
.galleryWrapper .gallery-item.dtu .item {
transform-origin: 100% 50px;
}
.galleryWrapper .gallery-item.dtu .item-front {
-webkit-transform: rotateX(0deg);
-moz-transform: rotateX(0deg);
-o-transform: rotateX(0deg);
-ms-transform: rotateX(0deg);
transform: rotateX(0deg);
}
.galleryWrapper .gallery-item.dtu .item-back {
-webkit-transform: rotateX(180deg);
-moz-transform: rotateX(180deg);
-o-transform: rotateX(180deg);
-ms-transform: rotateX(180deg);
transform: rotateX(180deg);
}
.galleryWrapper .gallery-item.dtu:hover .item {
-webkit-transform: rotateX(180deg);
-moz-transform: rotateX(180deg);
-o-transform: rotateX(180deg);
-ms-transform: rotateX(180deg);
transform: rotateX(180deg);
}
.galleryWrapper .gallery-item.utd .item-front {
-webkit-transform: rotateX(0deg);
-moz-transform: rotateX(0deg);
-o-transform: rotateX(0deg);
-ms-transform: rotateX(0deg);
transform: rotateX(0deg);
}
.galleryWrapper .gallery-item.utd .item-back {
-webkit-transform: rotateX(-180deg);
-moz-transform: rotateX(-180deg);
-o-transform: rotateX(-180deg);
-ms-transform: rotateX(-180deg);
transform: rotateX(-180deg);
}
.galleryWrapper .gallery-item.utd:hover .item {
-webkit-transform: rotateX(-180deg);
-moz-transform: rotateX(-180deg);
-o-transform: rotateX(-180deg);
-ms-transform: rotateX(-180deg);
transform: rotateX(-180deg);
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="galleryWrapper bot">
<div class="gallery-item">
<div class="item">
<div class="side item-front"></div>
<div class="side item-back"></div>
</div>
</div>
<!-- class="gallery-item" -->
<div class="gallery-item">
<div class="item">
<div class="side item-front"></div>
<div class="side item-back"></div>
</div>
</div>
<!-- class="gallery-item" -->
<div class="gallery-item">
<div class="item">
<div class="side item-front"></div>
<div class="side item-back"></div>
</div>
</div>
<!-- class="gallery-item" -->
<div class="gallery-item">
<div class="item">
<div class="side item-front"></div>
<div class="side item-back"></div>
</div>
</div>
<!-- class="gallery-item" -->
</div>
<!-- class="galleryWrapper" -->
我的动画基于CSS Flip by David Walsh
【问题讨论】:
-
@Harry 顶部版本的翻转工作正常,底部版本在所有浏览器的最新版本中都有问题。如果我快速将鼠标悬停在左侧然后顶部或类似效果,它会尝试对角翻转它,或者有时它会卡在某个动画类上(例如
rtl或utd)。 -
是的,我确实设法解决了这个问题(并在我对上一条评论的编辑中注明)。如果您在问题本身中指定以避免像我这样的 cmets 会更好:)
-
@Harry 你是对的。我删除了第一个工作示例,并将原始想法与我的测试用例一起添加到问题的底部。谢谢!
-
你无意中做了一个非常有趣的玩具。我只花了五分钟把它们转遍整个地方!
-
为了清楚起见,您是否想说每次悬停主持悬停的过渡应该在接下来的几个小时过渡之前完成?。我删除了我的答案,因为当我在每次新悬停时检查悬停时在我的示例中,过渡不会作为一个全新的循环完成。但是如果单击过渡,一个动画的结束被成功检查,然后下一个开始