css - 在动画之后转换属性

标签 css animation

我有一个元素在添加到页面时从左侧进入(来自 XHR 调用):

.flyin:not(.animation_done) {
    -webkit-animation: flyin .5s ease forwards;

    margin-left: -210px;
    opacity: 0;
}

@-webkit-keyframes flyin {
    to { 
        margin-left: 0;
        opacity: 1;
    }
}

但我想在鼠标悬停时为 margin-left 属性设置动画:

.element_im_animating.animation_done {
    margin-left: 0;
    transition: margin-left .4s ease;
}

.element_im_animating.mod.animation_done:hover {
    margin-left: 10px;
}

为了实现这一点,我在动画结束时添加了一个类:

$(document).on("animationend webkitAnimationEnd", function(e) {
    $(e.target).addClass("animation_done");
});

奇怪的是,添加 animation_done 会在完成后立即触发 flyin 动画第二次。我能阻止这一切发生吗?有没有更简单的非 JavaScript 方法来完成我需要做的事情?谢谢!

最佳答案

动画第二次没有运行。

实际情况如下:

您的元素的边距设置如下:

.flyin:not(.animation_done) {
    margin-left: -210px;
}

因此动画的结尾有一个 0px 的 margin-left

.flyin:not(.animation_done) {
    -webkit-animation: flyin 5s ease forwards;
}

@-webkit-keyframes flyin {
    to { 
        margin-left: 0px;
    }
}

当您移除动画时,不再应用上面的 forwards 规则,边距现在是默认值 (-210px)。由于此属性是transitioned(不是动画!),它将移动到新值:

.animation_done {
    margin-left: 0px;
}

以类似于动画的方式。解决这个问题,将 base margin 设置为最后一个,而不是使用 forwards

.flyin:not(.animation_done) {
    -webkit-animation: flyin 5s ease;

    margin-left: 0px;
    opacity: 0;
}

@-webkit-keyframes flyin {
    from { 
        margin-left: -210px;
        opacity: 1;
    }
    to { 
        margin-left: 0px;
        opacity: 1;
    }
}

.animation_done {
    margin-left: 0px;
    transition: margin-left 4s ease;
}

.animation_done:hover {
    margin-left: 10px;
}

fiddle

关于css - 在动画之后转换属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21424070/

相关文章:

javascript - 获取html标签的大小

html - 仅在 IE9 上出现下拉菜单问题

iphone - 自动旋转和 UIImageView 动画的问题

html - LI 元素中 A 链接后的括号内内容的样式

html - 在 CSS 中设计一个复杂的按钮

html - 设备分辨率和固定宽度(以像素为单位)

html - 为什么过渡不适用于绝对定位的图像?

javascript - 如何使一个元素从不是 $this 的另一个元素移动

javascript - 许多按钮的按钮单击动画

jquery - 为什么我的 CSS3/jQuery 动画的性能这么慢?