2017-01-22 2 views
0

Ich habe ein einfaches, reines CSS, Dropdown-Menü erstellt. Ich stehe vor einem seltsamen Lag-Problem. Wenn das Menü heruntergerollt wird, ist der Übergang glatt, aber in der entgegengesetzten Richtung gibt es eine Verzögerung von etwa 1 Sekunde, bevor die Animation beginnt.Laggy Übergang in nur einer Richtung

HTML:

<input type="checkbox" id="switch" name="switch"> 
<label for="switch" id="switch-button">Click me!</label> 

<div id="txt"> 
<p>Menu element 1</p> 
<p>Menu element 2</p> 
<p>Menu element 3</p> 
<p>Menu element 4</p> 
</div> 

CSS:

#switch  { display: none; } 
#switch-button { display: block; } 
#txt   { max-height: 400px; } 

#switch ~ #txt { 
    transition: 1s max-height 0s; 
} 
#switch:not(:checked) ~ #txt { 
    max-height: 0px; 
    overflow: hidden; 
} 
#switch:checked ~ #txt { 
    max-height: 400px; 
} 

https://jsfiddle.net/s1237n9h/8/

Problem tritt auf in: Chrome, Firefox, Android-Browser, Rand.

+0

Weder der Code, den Sie gepostet haben, noch der angegebene Link [https://jsfiddle.net/s1237n9h/3/](https://jsfiddle.net/s1237n9h/3/) erzeugen den beschriebenen Effekt in einem der aufgeführten Browser, außer AB (was ich momentan nicht testen kann). Bitte geben Sie ein [mcve] des beschriebenen Problems an. In seiner jetzigen Form ist es nicht *** nachweisbar ***. –

+0

Bitte überprüfen Sie die neueste Version: https://jsfiddle.net/s1237n9h/8/ – SirPL

Antwort

2

Die Verzögerung ist auf die Tatsache zurückzuführen sind Sie von max-height: 400px zu max-height: 0 Übergang aber Ihr Behälter hat nur 72px in der Höhe.

Daher sind Sie nicht in der Lage die Animation 400px-72px, zu beobachten, aber erst nach max-height unter den tatsächlichen height Ihres Elemente animieren. Wenn Sie die height des Elements und die max-height übereinstimmen, werden Sie den Übergang vollständig beobachten, ohne visuelle Verzögerung.

+0

Wie kann ich diese Verzögerung loswerden, ohne 'max-height: 72px' zu setzen? Dieser Wert kann aufgrund verfügbarer Schriftarten im Browser variieren ... – SirPL

+1

Derzeit gibt es keine reine CSS-Lösung, um 'max-height' dynamisch von' 100% 'auf' 0' zu animieren. Oder, wenn es existiert, ich bin mir dessen nicht bewusst. Es gibt jedoch Problemumgehungen. Eine Option besteht darin, einen relativ positionierten Wrapper mit 'overflow: hidden' zu verwenden und die oberste Eigenschaft des einzigen untergeordneten Objekts von '0' bis '-100%' zu animieren. Sie könnten auch 'transform: scale()' von '1' nach' 0' animieren. Aber als praktische Lösung stehe ich auf "velocity.js" (was auch eine Rate von 60 fps für alle Animationen garantiert), weil es schlau genug ist, 100% in px für "max-height" zu berechnen und "smooth" zu aktivieren Übergänge zu "0". –

1

transition-delay: -.5s; zu

#switch:not(:checked) ~ #txt { 

Ergebnis hinzufügen:

#switch:not(:checked) ~ #txt { 
     max-height: 0px; 
     overflow: hidden; 
     width: 100%; 
     -webkit-transition: 1s max-height 0s; 
     -moz-transition: 1s max-height 0s; 
     transition: 1s max-height 0s; 
    transition-delay: -.5s; 
    } 
+0

Es funktioniert tatsächlich. Könnten Sie bitte aus theoretischer Sicht erklären, warum dies notwendig ist, weil ich keine logische Erklärung sehen kann? Vielen Dank! – SirPL

+0

Um ganz ehrlich zu sein Ich habe keine Ahnung, warum es so ist, es scheint, dass es aus irgendeinem Grund .5 Verzögerung der Übergang, aber wie gesagt, ich kann nicht sehen warum, wie ich selbst ein Anfänger bin. Ich hoffe, dass jemand mit mehr Erfahrung in der Lage sein wird, es zu erklären :) – Omnitored

0

Das Problem hier ist, dass Sie max-height verwenden, um zu versuchen, die Höhe des Dropdown zu steuern, so dass es nur groß ist, wie es sein muss, um die Menüelemente anzuzeigen. In diesem Fall wird als 72px gerendert. Der Browser versucht jedoch immer noch, den Übergang über die max-height von 400px durchzuführen.

Wenn das Menü geöffnet wird, sieht der Übergang nicht stockend aus, da er sofort gestartet wird. Die Zeit, die der Browser zum Abschluss des Übergangs berechnet, basiert jedoch auf max-height von 400px. Deshalb sieht der Übergang so aus, als ob er "schneller" als 1 Sekunde passiert - weil er das hohe Menü in etwa einer Viertelstunde anzeigt und dann die Höhe des Elements kappt, aber danach geht der Übergang weiter 400px. Das Umgekehrte erscheint verzögert, da der Browser tatsächlich versucht, die Pixel 400 bis 72 zu "verstecken", bevor das tatsächlich gerenderte Element verborgen wird.

Vergleichen Sie Ihre Version mit dieser unten, wo der Übergang 5 Sekunden dauert. Klicken Sie auf, um das Menü zu öffnen, und warten Sie 5 Sekunden. Dann klicken Sie, um es zu schließen. Sie werden sehen, dass der Übergang erst nach etwa 4 Sekunden beginnt. Während dieser Zeit tritt der Übergang von den Pixeln 400 bis 72 auf, und dann wird das gerenderte Element in ungefähr 1 Sekunde verborgen.

JS Fiddle with 5s transition

Wenn Sie dies tun mit reiner Höhe (nicht, was Sie wollen, da es nicht die Höhe der <div> steuern) Sie sehen alles normal zu arbeiten.

JS Fiddle with height transition

So Ihre Frage zu beantworten, ist der Übergang nicht laggy, aber nur mit max-height auf diese Weise den Übergang versucht, macht es auf diese Weise erscheinen.

+0

Sie gehen fälschlicherweise davon aus, dass der Browser *** versucht, 'max-height' zu animieren (aber fehlschlägt). Es gelingt tatsächlich ***. Der Wert der Eigenschaft 'max-height' auf dem Element wird tatsächlich glatt bis hin zu '400px' und zurück übertragen. Sie können es überprüfen, indem Sie "height: 400px" für das Element festlegen. –

+0

@AndreiGheorghiu Ich habe es nicht versucht und versagt. Ich sagte genau das, was du gerade gesagt hast. Um mich selbst zu zitieren: "Der Übergang geht tatsächlich weiter bis zum 400px" und auch später "der Übergang von den Pixeln 400 bis 72 erfolgt." Wo habe ich gesagt, es versucht und versagt? – skyline3000

+0

Die Eröffnung * Allerdings ist der Browser ** immer noch versucht, den Übergang über die 'max-Höhe' von '400px' * und Endung * der Übergang ist nicht Laggy, aber ** versucht, ** Übergang nur mit ... * sind ein wenig irreführend und man könnte die Schlussfolgerung ziehen, die Sie implizieren, dass die Animation *** "probiert" *** und nicht gelungen ist. Zumindest lese ich es so. Deshalb habe ich den Kommentar abgegeben. Ich wollte nur klarstellen, dass es nicht versucht, aber gelungen ist. Hoffe, ich werde nicht missverstanden. Prost! –

Verwandte Themen