だから、私はこれを持っている-webkit-animation
ルール:
@-webkit-keyframes shake {
0% {
left: 0;
}
25% {
left: 12px;
}
50% {
left: 0;
}
75% {
left: -12px;
}
100% {
left:0;
}
}
そして、私のbox
のアニメーションルールのいくつかを定義するCSS:
#box{
-webkit-animation-duration: .02s;
-webkit-animation-iteration-count: 10;
-webkit-animation-timing-function: linear;
}
shake
the #box
このような:
document.getElementById("box").style.webkitAnimationName = "shake";
しかし、後でもう一度振ることはできません。
これは、ボックスを一度振るだけです:
someElem.onclick = function(){
document.getElementById("box").style.webkitAnimationName = "shake";
}
タイムアウトや複数のアニメーションを使用せずにJavaScriptを介してCSSアニメーションを再トリガーするにはどうすればよいですか?
CSS3移行テストのgithubページ でソースコードと例に基づいて答えを見つけました。
基本的に、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移行テスト (上記)のソースコードには、次の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;
}());
各ブラウザの「アニメーション」プロパティを検出するコードを追加していません。この回答は「コミュニティwiki」とし、それはあなたにお任せします。 :-)
最初にremoveアニメーションを作成してから、再度追加する必要があります。例えば:
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";
}
シンプルだが効果的な代替手段:
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で動作するかどうかわかりません。アニメーションが動作しないようです。
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");
});
});
});
クローンは一時停止したカラオケで非常に良好に動作します: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));
}
setTimeout()
を使用してクラスを削除し、5ms後にそれを読み取ることに問題はありますか?
svg.classList.remove('animate');
setTimeout(function() {
svg.classList.add('animate');
}, 10);
最初に値をリセットします。リフローを使用して、タイムアウトを使用せずに変更を適用します。
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
アニメーションと2つの切り替え:
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>
JavaScriptを使用して、アニメーションが宣言されているCSSクラスを追加(および削除)することもできます。意味がわかりますか?
#cart p.anim {
animation: demo 1s 1; // Fire once the "demo" animation which last 1s
}
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スクリプトでは、クラスtrigger
を削除できません。
3)setTimeOut
メソッドを使用して、クラス名を削除します。
$(document).ready(function(){
$('#shake-the-box').click(function(){
$('#box').addClass('trigger');
setTimeout(function(){
$("#box").removeClass("trigger")},500)
});
});
4)これは [〜#〜] demo [〜#〜] です。