Mouseleave 以及 Rotate
Posted: 09.18.2019
环境
当我创建这个网站时,我碰见了一个很古怪的问题。代码如下:
img {
transition: transform 2s cubic-bezier(0.075, 0.82, 0.165, 1);
}
.do-flip {
transform: rotateY(360deg);
}
<img
v-bind:class="{ 'do-flip': doFlip }"
:src="$withBase(heroImage)"
@mouseenter="flip"
@mouseleave="flipBack"
/>
...
// 环境为 vue
methods: {
flip: function() {
this.doFlip = true;
},
// 想要重新触发动画,需要设置回 false,删除对应的 class
flipBack: function() {
this.doFlip = false;
}
}
问题
但问题是,当鼠标进入图片,并且停留在图片上时,mouseleave依旧被触发了!!
但在这个时候,鼠标根本就没有离开图片!!

从上图可以看出,鼠标的确没有离开图片...
等等,真的是这样吗?
真正的问题在于... 动画!
我使用的动画是 rotateY(360deg),这就意味着,在动画执行的过程中,图片会沿着Y轴旋转,并且在转到 90度 以及 270度 的时候,
这张图片会和X轴垂直……
明白问题了吧!在这个时候,图片本质上就只是一条线而已,因此鼠标的确离开了图片!
解决方案
解决方案非常简单。
在鼠标离开图片时,什么都不要做。
只在鼠标进入图片时,开启/取消动画。对于transition来说,取消时它会反向执行动画,可以达到和开启动画时一样的效果!
<img
v-bind:class="{ 'do-flip': doFlip }"
:src="$withBase(heroImage)"
@mouseenter="flip"
/>
...
methods: {
flip: function() {
this.doFlip = !this.doFlip;
}
}