javascript - CSS动画向前然后向后闪烁

标签 javascript html css

我正在尝试创建一个 CSS 动画,当用户单击一个元素时,它会向右移动,然后当他们再次单击它时,它会向左移动。我遇到的问题是它引入了闪烁。我知道原因,但我不确定修复它的最佳方法。我想要这个问题的最优雅的解决方案。

我在这里设置了一个 jsFiddle(仅限 WebKit):http://jsfiddle.net/4Ad5c/2/

CSS:

.animateRight{
    -webkit-animation: goRightLeft 1s;
    -webkit-animation-fill-mode: forwards;
}
.animateLeft{
    -webkit-animation: goRightLeft 1s;
    -webkit-animation-fill-mode: backwards;
    -webkit-animation-direction: reverse;    
}
@-webkit-keyframes goRightLeft {
    0%{margin-left: 0px;}
    100%{margin-left: 100px;}
}

JavaScript:

this.animateBox = function(className){
    var box = document.getElementsByClassName('box')[0];
    box.className = "box";
    setTimeout(function(){
        box.className = "box " + className;
    },1);
};

当您单击“向右动画”时,它会按预期工作,但是当您单击“向左动画”时,它会向左闪烁,然后按预期进行动画。原因是你必须删除类并添加另一个类才能让动画再次运行,但我不知道让这个工作的最佳方法。我想我可以在删除处于当前状态的先前动画时添加一个类,但这对我来说似乎是错误的。

感谢您的帮助!

最佳答案

闪烁的原因:

在设置下一个使框突然向左移动的 animationClass 之前,您正在单击应用类 box。然后你正在应用动画去倒退。因此,当它突然向左移动(删除类)时会导致闪烁,并且在超时中添加类会导致根据 animateLeft 类中的填充模式和方向反转动画,并使其变得更糟,因为 goRightLeft 再次添加边距,由于规则中的边距而将其拉到右侧,webkit-animation-fill-mode: backwards; 将其推到左侧。所以我在这里提到的一种方法是反向(增加/减少)边距。

这是一个解决方案:

对于真正的反向动画,您需要应用从 100 像素递减到 0 的边距,就像您在正向动画中所做的那样。因此,只需为 LeftToRight 添加 keyframes 并将其应用于动画。

CSS

.animateRight{
    -webkit-animation: goRightLeft 1s;
    -webkit-animation-fill-mode: forwards;
}
.animateLeft{
    -webkit-animation: goLeftRight 1s; /* Note the goLeftRight animation */
      -webkit-animation-fill-mode: backwards;


}
@-webkit-keyframes goRightLeft {
    0%{margin-left: 0px;}
    100%{margin-left: 100px;}
}

@-webkit-keyframes goLeftRight { /* Note the new keyframes rule for reverse animation*/
    0%{margin-left: 100px;}
    100%{margin-left: 0px;}
}

脚本

this.animateBox = function(className){
    var box = document.getElementsByClassName('box')[0];
    box.className = "box " + className;

};

Demo

关于javascript - CSS动画向前然后向后闪烁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16949984/

相关文章:

javascript - HTML5 视频 - 当当前时间等于某个值时检测到

html - 如何将一个 div 放在另一个 div 的正下方?

javascript - 如何在页面底部添加页脚

css - Wordpress 子主题 CSS 规则显示 :none gets overriden

javascript - jQuery 可排序启用

javascript - Jquery/Handlebars 错误消息 - Uncaught TypeError : Object [object Object] has no method 'match'

javascript - 您将如何在函数中创建一个非本地化变量,以便它可以被 javascript 中的其他函数访问?

html - Bootstrap 3 Column Site {高度 : 100%;} not working

PHP - 搜索数据库并在同一页面上返回结果

html - 子菜单在悬停时消失?粘滞/固定导航