2012-10-25 11 views
22

Mam następujące HTML:Zatrzymanie animacji CSS, ale pozwalając jej aktualna iteracja zakończyć

<div class="rotate"></div>​ 

i następujący CSS:

@-webkit-keyframes rotate { 
    to { 
    -webkit-transform: rotate(360deg); 
    } 
} 
.rotate { 
    width: 100px; 
    height: 100px; 
    background: red; 
    -webkit-animation-name:    rotate; 
    -webkit-animation-duration:   5s; 
    -webkit-animation-iteration-count: infinite; 
    -webkit-animation-timing-function: linear; 
}​ 

Chcę wiedzieć, czy istnieje sposób (przy użyciu JavaScript), aby zatrzymać animację, ale pozwól jej zakończyć aktualną iterację (najlepiej zmieniając jedną lub kilka właściwości CSS). Próbowałem ustawić -webkit-animation-name, aby mieć pustą wartość, ale to powoduje, że element przeskakuje z powrotem do pierwotnej pozycji w sposób wstrząsający. Próbowałem również ustawić -webkit-animation-iteration-count na 1, ale to samo.

+0

Jako alternatywę proponuję javascript animacji. –

+1

obliczanie bieżącej iteracji i ustawianie liczby iteracji na tę wartość, czy to możliwe/możliwe do śledzenia? –

+0

Spróbuj utworzyć kolejną klasę dla elementu div, który będzie ją określał w położeniu, w którym ma się zakończyć, a następnie za pomocą javascript, zastosuj tę klasę do div div, gdy animacja osiągnie punkt, w którym ma się zatrzymać. – Ryan

Odpowiedz

29

Zatrzymaj animację po otrzymaniu zdarzenia animationiteration. Coś jak to (przy użyciu jQuery):

CSS

@-webkit-keyframes rotate { 
    to { 
    -webkit-transform: rotate(360deg); 
    } 
} 
.rotate { 
    width: 100px; 
    height: 100px; 
    background: red; 
} 
.rotate.anim { 
    -webkit-animation-name:    rotate; 
    -webkit-animation-duration:   5s; 
    -webkit-animation-iteration-count: infinite; 
    -webkit-animation-timing-function: linear; 
} 

HTML

<div class="rotate anim">TEST</div> 
<input id="stop" type="submit" value="stop it" /> 

JS (jQuery)

$("#stop").click(function() { 
    $(".rotate").one('animationiteration webkitAnimationIteration', function() { 
     $(this).removeClass("anim"); 
    }); 
}); 

Skrzypce: http://jsfiddle.net/sSYYE/1/

Proszę zauważyć, że używam tutaj .one (a nie .on), aby przewodnik obsługiwał tylko jeden raz. W ten sposób animacja może zostać ponownie uruchomiona.

+0

Zrobiłem wersję, która może również ponownie uruchomić animację na żądanie. Obsługa zdarzeń dla zdarzeń 'animationiteration webkitAnimationIteration' musi zostać wyłączona po jej uruchomieniu. http://jsfiddle.net/MNQcN/1/ – KPthunder

+1

Właściwie dlatego użyłem '.one()' w moim oryginalnym kodzie (który został zmieniony). '.one()' łączy jednorazową procedurę obsługi zdarzeń. Używając 'one': http://jsfiddle.net/MNQcN/3/ – nneonneo

+0

Och, z jakiegoś powodu myślałem, że to był błąd. Przepraszam za to. – KPthunder

Powiązane problemy