Dies ist eine Art eines bekannten Verhalten mit Chrome. Firefox scheint in der Lage zu sein, die Beseitigung von Animationen reibungslos mit Übergang zu behandeln, aber Chrome tut dies nicht. Ich hatte dieses Verhalten früher auch in this thread gesehen.
Warum funktioniert das Entfernen einer Animation nicht mit dem Übergang in Chrome?
Während ich kann nicht 100% narrensichere Erklärung geben, warum dies der Fall ist, werden wir es zu einem gewissen Grad auf this HTML5Rocks article about Accelerated rendering in Chrome und this one about GPU accelerated compositing in Chrome basierend dekodieren kann.
Es scheint, dass das Element seinen eigenen Rendering-Layer erhält, weil es eine explizite position -Eigenschaft hat. Wenn eine Ebene (oder ein Teil davon) aufgrund einer Animation ungültig wird, wird in Chrome nur die Ebene neu angezeigt, die von der Änderung betroffen ist. Wenn Sie die Chrome Developer Console öffnen und die Option "Paint Rect" anzeigen, sehen Sie, dass Chrome während der Animation nur das eigentliche Element anzeigt, das animiert wird.
jedoch am Anfang und Ende der Animation eine ganze Seite neu streichen geschieht, die das Element wieder in seine ursprüngliche Lage versetzt, sofort und damit das Übergangsverhalten zu überschreiben.
$('button').click(function(){
$('div').toggleClass('clicked');
});
div{
background-color: #ccc;
height: 100px;
width: 100px;
transition-property: top, left;
transition-duration: 1s;
transition-timing-function: linear;
position: relative;
top: 0;
left: 0;
}
.clicked{
animation-name: clicked;
animation-duration: 1s;
animation-timing-function: linear;
animation-fill-mode: forwards;
}
@keyframes clicked{
0% {top: 0; left: 0;}
100% {top: 100px; left: 100px;}
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/prefixfree/1.0.7/prefixfree.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<button type="button">Click Me!</button>
<div></div>
Was ist die Lösung?
Da Ihre Bewegung tatsächlich eine lineare Bewegung von einer Position zur anderen ist, können Sie diese ohne die Notwendigkeit einer Animation erreichen. Alles, was wir tun müssen, ist eine translate
Transformation und verschiebe das Element um die erforderliche Nummer. von Pixeln, wenn die Klasse eingeschaltet ist. Da dem Element über einen anderen Selektor ein Übergang zugewiesen wird, würde das Verschieben linear erfolgen. Während die Klasse ausgeschaltet ist, bewegt sich das Element aufgrund des Übergangs auf dem Element linear wieder in seine ursprüngliche Position zurück.
$('button').click(function() {
$('div').toggleClass('clicked');
});
div {
background-color: #ccc;
height: 100px;
width: 100px;
transition-property: transform;
transition-duration: 1s;
transition-timing-function: linear;
position: relative;
top: 0;
left: 0;
}
.clicked {
transform: translate(100px, 100px);
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/prefixfree/1.0.7/prefixfree.min.js"></script>
<button type="button">Click Me!</button>
<div></div>
Ich bin mit Chrome auf Ubuntu 15.04 und es scheint, für mich zu arbeiten. Wenn ich einmal auf den Button klicke, startet die Animation. Wenn ich erneut auf die Schaltfläche klicke, wird das Div in seine ursprüngliche Position zurückgesetzt. Wenn ich dann erneut auf die Schaltfläche klicke, wird die Animation erneut gestartet und so weiter. –
Brauchen Sie wirklich die Animation? Die Bewegung könnte auch ohne eine lineare Bewegung erreicht werden. Ich habe das Umstellungsproblem mit Chrome früher gesehen. Sie können auf diesen Thread für einige verwandte Informationen verweisen - http://stackoverflow.com/questions/31806649/how-to-run-the-css3-animation-to-the-end-if-the-selector-is-not -matching-more/31833533 # 31833533 (Ich verlinke es nur, weil wir festgestellt haben, dass der Übergang in Chrome nicht gut funktioniert, wenn die Animation entfernt wird - dies wird in der Frage auch dort erwähnt). – Harry
@Muschtak: Ich benutze Windows 8.1, die Animation funktioniert für Firefox nur einmal, von der nächsten Iteration ist die Animation nicht glatt, wie ich erwähnt habe und für Chrome/Opera tritt das Problem in der ersten Iteration auf. – Rivnat