Heim  >  Artikel  >  Web-Frontend  >  Warum schlagen Elementübergänge fehl, wenn sie zunächst ausgeblendet werden?

Warum schlagen Elementübergänge fehl, wenn sie zunächst ausgeblendet werden?

Susan Sarandon
Susan SarandonOriginal
2024-11-14 18:59:02449Durchsuche

Why Do Element Transitions Fail When Initially Hidden?

Elementübergänge schlagen fehl, wenn sie anfänglich ausgeblendet werden

Szenarioübersicht

Betrachten Sie zwei Elemente mit der Bezeichnung „ A‘ und ‚B‘, wobei ‚B‘ zunächst mit display: none ausgeblendet wird. Wenn Sie Übergänge verwenden, um „B“ zu animieren, nachdem Sie es mit Methoden wie $.show() oder $.toggle() angezeigt haben, erscheint das Element sofort an seiner endgültigen Position ohne Animation.

Erklärung

Die Ursache liegt in der Beziehung zwischen dem Document Object Model (DOM) und dem CSS Object Model (CSSOM). CSS-Übergänge basieren auf dem zuletzt berechneten Wert eines Elements. Für ursprünglich ausgeblendete Elemente ist der berechnete Wert display: none, wodurch das Element im Wesentlichen aus dem CSSOM entfernt wird.

DOM-Manipulation und Reflow

Die DOM-Manipulationsphase umfasst die Aktualisierung ein JavaScript-Objekt, bei dem es sich um einen asynchronen Prozess handelt. Im Gegensatz dazu findet die Reflow-Phase, in der CSS-Regeln aktualisiert und berechnete Stile neu berechnet werden, nur bei Bedarf statt. Da anfänglich ausgeblendete Elemente keine berechneten Stile haben, lösen sie während der DOM-Manipulation keinen Reflow aus.

Anfangszustand des Übergangs

Wenn der Übergang für „ B' startet, der Anfangszustand ist nicht definiert, da der Reflow noch nicht stattgefunden hat. Dies kann zu falschen Übergängen führen.

Reflow erzwingen

Um dieses Problem zu beheben, können Sie einen Reflow erzwingen, bevor Sie den Übergang auslösen. Sie können dies mit Element.getBoundingClientRect() oder element.offsetHeight erreichen, die aktuelle berechnete Werte erfordern und daher einen Reflow erzwingen.

Verbessertes Beispiel mit Force Reflow

Hier ist ein überarbeiteter Codeausschnitt, der einen Reflow erzwingt, bevor er animiert wird Übergang:

$('button').on('click', function() {
  $('.b').show(); // apply display:block synchronously

  requestAnimationFrame(() => { // wait just before the next paint
    document.body.offsetHeight; // force a reflow
    $('.b').css('right', '80%');
    $('.a').css('right', '80%');
  });
});

Indem Sie einen Reflow erzwingen, bevor der Übergang ausgelöst wird, stellen Sie sicher, dass die berechneten Werte aktuell sind, sodass der Übergang ordnungsgemäß funktioniert.

Das obige ist der detaillierte Inhalt vonWarum schlagen Elementübergänge fehl, wenn sie zunächst ausgeblendet werden?. 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