Ich versuche, eine Aktion zu erstellen, wo ein Div erstellt wird und sofort "schwebt" nach oben, bis es aus dem Bildschirm ist.Sofort Übergang nach Element ausgelöst
Um dies zu erreichen, versuche ich eine CSS transition zu verwenden, die vollständig von JavaScript (aufgrund von Einschränkungen in meinem Anwendungsfall) angetrieben wird.
Ein Problem tritt auf, wenn ich ein Element erstelle, ihm seine Übergangsstileigenschaften zuweise, und dann sofort versuche, den Übergang durch eine Stiländerung (top
) zu starten.
Es sieht aus wie ein Timing-Problem passiert, wo die top
Stiländerung vor dem Übergang feuern wird und damit einfach meine div Off-Screen sofort verschieben, anstatt tatsächlich den Übergang durchzuführen.
Hier ist ein vereinfachtes Beispiel:
var
defaultHeight = 50,
iCount = 0,
aColors = ['red', 'orange', 'yellow', 'green', 'blue', 'purple'];
function createBlock() {
var testdiv = document.createElement('div');
testdiv.className = 'testdiv';
document.body.appendChild(testdiv);
testdiv.style.left = '50%';
testdiv.style.backgroundColor = aColors[iCount % aColors.length];
testdiv.style.width = defaultHeight + 'px';
testdiv.style.height = defaultHeight + 'px';
testdiv.style.fontSize = '30px';
testdiv.style.textAlign = 'center';
testdiv.innerHTML = iCount;
testdiv.style.top = '500px';
testdiv.style.position = 'absolute';
iCount++;
return testdiv;
}
document.getElementById('go').onclick = function() {
var testdiv = createBlock();
testdiv.style.transition = "top 2.0s linear 0s";
setTimeout(function() {
testdiv.style.top = (defaultHeight*-2) + 'px';
}, 0); // <- change this to a higher value to see the transition always occur
};
Wenn die Schaltfläche „Go“ (see JSBin) nur schnell der div (vermutlich aufgrund des oben beschriebenen Zeitproblem) sporadisch angeklickt wird angezeigt.
Wenn Sie den Verzögerungswert von setTimeout
erhöhen, können Sie sehen, dass der Übergang fast immer funktioniert.
Gibt es eine Möglichkeit, einen Übergang direkt nach dem Erstellen eines Elements deterministisch zu starten (ohne auf eine Verzögerung zurückgreifen zu müssen)?
Sie müssen die animierte (neu) Top-Wert in einer Klasse hinzuzufügen und diese Klasse zuweisen stattdessen oder auch der Übergang nicht weiß, zwischen denen oben, da diese zu animieren Wert überschreibt den ersten. – LGSon
@LGSon Das neu erstellte div erhält einen anfänglichen 'top'-Wert von' 500px '... warum müsste das in einer CSS-Klasse definiert werden (außer als Best-Practice)? –
Misread Ihre Frage ein wenig ... wird eine Antwort in einer Sekunde posten. – LGSon