Heim  >  Artikel  >  Web-Frontend  >  Warum wird mein CSS-Übergang übersprungen und der Rückruf wird nicht ausgelöst?

Warum wird mein CSS-Übergang übersprungen und der Rückruf wird nicht ausgelöst?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-10-31 08:48:29779Durchsuche

Why Does My CSS Transition Skip and the Callback Fail to Fire?

CSS-Übergang startet nicht oder Rückruf wird nicht aufgerufen: Analyse

Ihr Problem ist auf eine Eigenart bei CSS-Übergängen und den Browsern zurückzuführen Rendering-Prozess. Zunächst integrieren Sie HTML mit CSS-Positionswerten und legen einen Übergang für die linken und oberen Eigenschaften fest. Beim Hinzufügen neuer Standortwerte haben Sie einen Übergang erwartet, der jedoch übersprungen wurde, ohne einen Rückruf auszulösen.

Interessanterweise löste das Hinzufügen eines setTimeout von 1 ms zum Umschließen der Stiländerung den Übergang aus. Manchmal blieb der Rückruf jedoch unbeantwortet. Dieses Verhalten kann auf das Timing des Browsers zurückgeführt werden.

Erklärung:

Wenn der neue Stil festgelegt ist, muss der Browser den Inline-Stil noch auf den berechneten Stil anwenden . Der berechnete Stil des Elements bleibt für die Eigenschaften links und oben nicht festgelegt und ist standardmäßig auf 0 Pixel eingestellt. Jeder später angewendete Übergang stimmt einfach mit den eingestellten Werten überein, sodass kein Übergang erfolgt.

Um dieses Problem zu beheben, muss ein Reflow erzwungen werden, um die Stile zu aktualisieren. Dies kann mit dem OffsetHeight-Getter oder anderen ähnlichen Methoden erfolgen, die Reflows auslösen.

Beispiel für die Verwendung von offsetHeight:

<code class="javascript">let tablehtml = `
<div id="spanky" 
  style="position: absolute; 
    left: 10px; 
    top: 10px; 
    background-color:blue; 
    width:20px; 
    height:20px;
    transition: left 1000ms linear 0s, top 1000ms linear 0s;">
</div>`;

document.body.innerHTML += tablehtml;

let animdiv = document.getElementById('spanky');
animdiv.addEventListener("transitionend", function(event) { 
  animdiv.style.backgroundColor='red';
}, false);
// force a reflow
animdiv.offsetTop;
// now animdiv will have all the inline styles set
// it will even have a proper display

animdiv.style.backgroundColor='green';
Object.assign(animdiv.style, {
  left: "100px", 
  top: "100px" 
});</code>

Das obige ist der detaillierte Inhalt vonWarum wird mein CSS-Übergang übersprungen und der Rückruf wird nicht ausgelöst?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn