Ich arbeite an der Erstellung einer browserübergreifenden Rotation (dh 9 +) und habe den folgenden Code in einer jsfiddle
$(document).ready(function () {
DoRotate(30);
AnimateRotate(30);
});
function DoRotate(d) {
$("#MyDiv1").css({
'-moz-transform':'rotate('+d+'deg)',
'-webkit-transform':'rotate('+d+'deg)',
'-o-transform':'rotate('+d+'deg)',
'-ms-transform':'rotate('+d+'deg)',
'transform': 'rotate('+d+'deg)'
});
}
function AnimateRotate(d) {
$("#MyDiv2").animate({
'-moz-transform':'rotate('+d+'deg)',
'-webkit-transform':'rotate('+d+'deg)',
'-o-transform':'rotate('+d+'deg)',
'-ms-transform':'rotate('+d+'deg)',
'transform':'rotate('+d+'deg)'
}, 1000);
}
Das CSS und HTML sind wirklich einfach und nur für die Demo:
.SomeDiv{
width:50px;
height:50px;
margin:50px 50px;
background-color: red;}
<div id="MyDiv1" class="SomeDiv">test</div>
<div id="MyDiv2" class="SomeDiv">test</div>
Die Drehung funktioniert bei Verwendung, .css()
jedoch nicht bei Verwendung .animate()
. Warum ist das so und gibt es eine Möglichkeit, es zu beheben?
Vielen Dank.
jquery
css
rotation
jquery-animate
frenchie
quelle
quelle
step
Rückruf implementieren ), aber der Teil "Warum ist das so ?" Ist ziemlich klar.Antworten:
CSS-Transformationen können mit jQuery noch nicht animiert werden. Sie können so etwas tun:
Weitere Informationen zum Step-Callback finden Sie hier: http://api.jquery.com/animate/#step
http://jsfiddle.net/UB2XR/23/
Übrigens: Sie müssen css3-Transformationen nicht mit jQuery 1.7+ voranstellen
Aktualisieren
Sie können dies in ein jQuery-Plugin einbinden, um Ihr Leben ein bisschen einfacher zu machen:
http://jsbin.com/ofagog/2/edit
Update2
Ich optimiert es ein wenig die Reihenfolge zu machen
easing
,duration
undcomplete
unbedeutend.Update 2.1
Vielen Dank an matteo, der ein Problem mit dem
this
-context in the complete- festgestellt hatcallback
. Wenn dies behoben wurde, binden Sie den Rückruf mitjQuery.proxy
auf jedem Knoten.Ich habe die Edition bereits ab Update 2 zum Code hinzugefügt .
Update 2.2
Dies ist eine mögliche Änderung, wenn Sie beispielsweise die Drehung hin und her schalten möchten. Ich habe der Funktion einfach einen Startparameter hinzugefügt und diese Zeile ersetzt:
Wenn jemand weiß, wie er dies für alle Anwendungsfälle allgemeiner gestalten kann, unabhängig davon, ob er einen Startgrad festlegen möchte oder nicht, nehmen Sie bitte die entsprechende Änderung vor.
Die Verwendung ... ist ganz einfach!
Hauptsächlich haben Sie zwei Möglichkeiten, um das gewünschte Ergebnis zu erzielen. Aber zuerst werfen wir einen Blick auf die Argumente:
jQuery.fn.animateRotate(angle, duration, easing, complete)
Mit Ausnahme von "Winkel" sind alle optional und greifen auf die Standardeigenschaften
jQuery.fn.animate
zurück:1
Dieser Weg ist kurz, sieht aber etwas unklar aus, je mehr Argumente wir übergeben.
2 ..
Ich bevorzuge die Verwendung von Objekten, wenn mehr als drei Argumente vorhanden sind. Daher ist diese Syntax mein Favorit:
quelle
this
nicht auf ein DOM-Objekt verwiesen wird, ist, dass der Kontext auf das Objekt festgelegtanimate()
wurde, auf das aufgerufen wurde, in diesem Fall{deg: 0}
auf den Kontext. Sie können dies beheben, indem Sie den Kontext jeder Rückruffunktion mitapply()
/call()
oder$.proxy()
ändern (wie @yckart gezeigt hat). Hier ist meine Lösung, um ALLE Rückrufe zu beheben und 3D-Rotation zuzulassen: jsfiddle.net/TrevinAvery/P5J4V/440
jedes Mal mit Grad nicht zum erwarteten Verhalten. Sie müssen daher mit dem aktuellen Rotationswert initialisieren. Wie das geht, wird hier erklärt: stackoverflow.com/a/11840120/61818Danke yckart! Großartiger Beitrag. Ich habe dein Plugin ein bisschen weiter ausgearbeitet. StartAngle für volle Kontrolle und browserübergreifendes CSS hinzugefügt.
quelle
jquery-1.8+
!Der jQuery-Transit wird Ihnen wahrscheinlich das Leben erleichtern, wenn Sie mit CSS3-Animationen über jQuery arbeiten.
BEARBEITEN März 2014 (weil mein Rat seit meiner Veröffentlichung ständig auf und ab gewählt wurde)
Lassen Sie mich erklären, warum ich ursprünglich auf das obige Plugin hingewiesen habe:
Das Aktualisieren
DOM
bei jedem Schritt (dh$.animate
) ist in Bezug auf die Leistung nicht ideal. Es funktioniert, ist aber höchstwahrscheinlich langsamer als reine CSS3-Übergänge oder CSS3-Animationen .Dies liegt hauptsächlich daran, dass der Browser die Möglichkeit hat, vorauszudenken, wenn Sie angeben, wie der Übergang von Anfang bis Ende aussehen wird.
Dazu können Sie beispielsweise für jeden Status des Übergangs eine CSS-Klasse erstellen und den Animationsstatus nur mit jQuery umschalten.
Dies ist im Allgemeinen recht ordentlich, da Sie Ihre Animationen neben dem Rest Ihres CSS optimieren können, anstatt sie mit Ihrer Geschäftslogik zu verwechseln:
Wenn einer der Transformationsparameter dynamisch ist, können Sie stattdessen stattdessen das style-Attribut verwenden:
Viel detailliertere Informationen zu CSS3-Übergängen in MDN .
JEDOCH Es gibt ein paar andere Dinge im Auge zu behalten und das alles ein bisschen schwierig zu bekommen , wenn Sie komplexe Animationen haben, Verkettungs usw. und jQuery Transit nur macht alle kniffligen Bits unter der Haube:
quelle
Um diesen Cross-Browser einschließlich IE7 + auszuführen, müssen Sie das Plugin mit einer Transformationsmatrix erweitern. Da das Herstellerpräfix in jQuery ab jquery-1.8 + verwendet wird, werde ich dies für die
transform
Eigenschaft weglassen .Hinweis: Die Parameter
options
undstartAngle
sind optional, wenn Sie nurstartAngle
use{}
odernull
for einstellen müssenoptions
.Anwendungsbeispiel:
Siehe auch diese jsfiddle für eine Demo.
Update : Sie können jetzt auch
extra: {}
die Optionen übergeben. Auf diese Weise können Sie andere Animationen gleichzeitig ausführen. Beispielsweise:Dadurch wird das Element um 90 Grad gedreht, mit 100 Pixel nach rechts verschoben und während der Animation gleichzeitig halbtransparent.
quelle
ms
,o
,webkit
,moz
Erkennung korrekt zu gewährleisten. Die Geige wird ebenfalls auf v12 aktualisiert.Das ist meine Lösung:
dann können Sie es in der Standardanimation fkt verwenden:
quelle
Eine andere Antwort, da jQuery.transit nicht mit jQuery.easing kompatibel ist. Diese Lösung wird als jQuery-Erweiterung geliefert. Ist allgemeiner, Rotation ist ein spezieller Fall:
Die Verwendung ist so einfach wie:
quelle
Ohne Plugin Cross Browser mit setInterval:
quelle