所以,我有-webkit-animation
规则:
@-webkit-keyframes shake {
0% {
left: 0;
}
25% {
left: 12px;
}
50% {
left: 0;
}
75% {
left: -12px;
}
100% {
left:0;
}
}
一些CSS定义了box
上的一些动画规则:
#box{
-webkit-animation-duration: .02s;
-webkit-animation-iteration-count: 10;
-webkit-animation-timing-function: linear;
}
我可以shake
#box
这样:
document.getElementById("box").style.webkitAnimationName = "shake";
但我以后再也不能动摇了。
这只会震动一次:
someElem.onclick = function(){
document.getElementById("box").style.webkitAnimationName = "shake";
}
如何在不使用超时或多个动画的情况下通过JavaScript重新触发CSS动画?
答案 0 :(得分:92)
我根据CSS3 transition tests github page上的源代码和示例找到了答案。
基本上,CSS动画会在动画完成时触发animationEnd
事件。
对于webkit浏览器,此事件名为“webkitAnimationEnd
”。因此,为了在调用动画后重置动画,您需要为animationEnd
事件的元素添加事件监听器。
简单的普通话javascript:
var element = document.getElementById('box');
element.addEventListener('webkitAnimationEnd', function(){
this.style.webkitAnimationName = '';
}, false);
document.getElementById('button').onclick = function(){
element.style.webkitAnimationName = 'shake';
// you'll probably want to preventDefault here.
};
和jQuery:
var $element = $('#box').bind('webkitAnimationEnd', function(){
this.style.webkitAnimationName = '';
});
$('#button').click(function(){
$element.css('webkitAnimationName', 'shake');
// you'll probably want to preventDefault here.
});
CSS3 transition tests的源代码(如上所述)具有以下support
对象,这可能有助于跨浏览器的CSS转换,转换和动画。
这是支持代码(重新格式化):
var css3AnimationSupport = (function(){
var div = document.createElement('div'),
divStyle = div.style,
// you'll probably be better off using a `switch` instead of theses ternary ops
support = {
transition:
divStyle.MozTransition === ''? {name: 'MozTransition' , end: 'transitionend'} :
// Will ms add a prefix to the transitionend event?
(divStyle.MsTransition === ''? {name: 'MsTransition' , end: 'msTransitionend'} :
(divStyle.WebkitTransition === ''? {name: 'WebkitTransition', end: 'webkitTransitionEnd'} :
(divStyle.OTransition === ''? {name: 'OTransition' , end: 'oTransitionEnd'} :
(divStyle.transition === ''? {name: 'transition' , end: 'transitionend'} :
false)))),
transform:
divStyle.MozTransform === '' ? 'MozTransform' :
(divStyle.MsTransform === '' ? 'MsTransform' :
(divStyle.WebkitTransform === '' ? 'WebkitTransform' :
(divStyle.OTransform === '' ? 'OTransform' :
(divStyle.transform === '' ? 'transform' :
false))))
//, animation: ...
};
support.transformProp = support.transform.name.replace(/([A-Z])/g, '-$1').toLowerCase();
return support;
}());
我没有添加代码来检测每个浏览器的“动画”属性。我把这个答案写成了“社区维基”并留给你。 : - )
答案 1 :(得分:13)
您必须先删除动画,然后重新添加。例如:
document.getElementById("box").style.webkitAnimationName = "";
setTimeout(function ()
{
document.getElementById("box").style.webkitAnimationName = "shake";
}, 0);
要在没有setTimeout的情况下执行此操作,请在onmousedown
期间删除动画,并在onclick
期间添加动画:
someElem.onmousedown = function()
{
document.getElementById("box").style.webkitAnimationName = "";
}
someElem.onclick = function()
{
document.getElementById("box").style.webkitAnimationName = "shake";
}
答案 2 :(得分:6)
一个简单而有效的替代方案:
HTML:
<div id="box"></div>
<button id="shake-the-box">Shake it!</button>
的CSS:
#box{
background: blue;
margin:30px;
height:50px;
width:50px;
position:relative;
-moz-animation:shake .2s 0 linear 1;
-webkit-animation:shake .2s 0 linear 1;
}
#box.trigger{
display:table;
}
@-webkit-keyframes shake {
0% {
left: 0;
}
25% {
left: 12px;
}
50% {
left: 0;
}
75% {
left: -12px;
}
100% {
left:0;
}
}
@-moz-keyframes shake {
0% {
left: 0;
}
25% {
left: 12px;
}
50% {
left: 0;
}
75% {
left: -12px;
}
100% {
left:0;
}
}
jQuery的:
$('#shake-the-box').click(function(){
$('#box').toggleClass('trigger');
});
演示:
http://jsfiddle.net/5832R/2/
问题:
我不知道它是否适用于Firefox,因为动画似乎不适用于那里......
答案 3 :(得分:5)
根据https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Animations/Tips的建议,使用requestAnimationFrame删除然后添加动画类,以确保渲染引擎处理这两个更改。我认为这比使用setTimeout更干净,并且在前一个游戏完成之前处理重放动画。
$('#shake-the-box').click(function(){
$('#box').removeClass("trigger");
window.requestAnimationFrame(function(time) {
window.requestAnimationFrame(function(time) {
$('#box').addClass("trigger");
});
});
});
答案 4 :(得分:1)
Clone在暂停的卡拉OK上效果很好: IE11必须强制重排(R.Krupiński的短版本)。
$('#lyrics').text("Why does it hurt when I pee?");
changeLyrics('3s');
function changeLyrics(sec) {
str = 'lyrics '+ sec + ' linear 1';
$('#lyrics').css( 'animation', str);
$('#lyrics').css( 'animation-play-state', 'running' );
$('#lyrics').replaceWith($('#lyrics').clone(true));
}
或者您可以使用以下内容:
function resetAnimation(elm) {
$('#'+elm).replaceWith($('#'+elm).clone(true));
}
答案 5 :(得分:1)
首先重置该值。使用reflow来应用更改而不使用超时:
function shake() {
var box = document.getElementById("box");
box.style.animationName = null;
box.offsetHeight; /* trigger reflow */
box.style.animationName = "shake";
}
@keyframes shake {
0% { left: 0; }
25% { left: 12px; }
50% { left: 0; }
75% { left: -12px; }
100% { left: 0; }
}
#box {
position: absolute;
width: 75px; height: 75px;
background-color: black;
animation-duration: .02s;
animation-iteration-count: 10;
animation-timing-function: linear;
}
button {
position: absolute;
top: 100px;
}
<div id="box"></div>
<button onclick="shake()">Shake</button>
与推荐animationEnd
的已接受答案相反,此方法即使在动画仍在进行时也会重置动画。这可能是或可能不是你想要的。
另一种方法是创建一个重复的@keyframes
动画并在两者之间切换:
function shake() {
var box = document.getElementById("box");
if (box.style.animationName === "shake")
box.style.animationName = "shake2";
else
box.style.animationName = "shake";
}
@keyframes shake {
0% { left: 0; }
25% { left: 12px; }
50% { left: 0; }
75% { left: -12px; }
100% { left: 0; }
}
@keyframes shake2 {
0% { left: 0; }
25% { left: 12px; }
50% { left: 0; }
75% { left: -12px; }
100% { left: 0; }
}
#box {
position: absolute;
width: 75px; height: 75px;
background-color: black;
animation-duration: .02s;
animation-iteration-count: 10;
animation-timing-function: linear;
}
button {
position: absolute;
top: 100px;
}
<div id="box"></div>
<button onclick="shake()">Shake</button>
答案 6 :(得分:1)
使用setTimeout()
删除课程然后在5ms后阅读该课程是否存在问题?
svg.classList.remove('animate');
setTimeout(function() {
svg.classList.add('animate');
}, 10);
答案 7 :(得分:0)
使用您的javascript,您还可以添加(然后删除)声明动画的CSS类。明白我的意思?
#cart p.anim {
animation: demo 1s 1; // Fire once the "demo" animation which last 1s
}
答案 8 :(得分:0)
1)将动画名称添加到css中的#box.trigger
#box.trigger{
display:table;
animation:shake .2s 0 linear 1;
-moz-animation:shake .2s 0 linear 1;
-webkit-animation:shake .2s 0 linear 1;
}
2)在java-script中,您无法删除类trigger
。
3)使用setTimeOut
方法删除班级名称。
$(document).ready(function(){
$('#shake-the-box').click(function(){
$('#box').addClass('trigger');
setTimeout(function(){
$("#box").removeClass("trigger")},500)
});
});
4)这是DEMO。