2017-05-03 1 views
1

Ich habe ein eigenartiges Problem, das ich nicht erwarten sah. Here is a codepen für die Situation. Das ist der Fall:CSS-Animation-Pop-in nach Pop-Out wieder miteinander in Konflikt

Ich habe eine versteckte div, die bei einem Klick auf die Schaltfläche erscheint, und erscheint nach dem Schließen. Dies wird mit jQuery show/hide behandelt. Für die UX wollte ich eine subtile Pop-in-Animation via CSS hinzufügen. Ich fügte hinzu, die folgenden:

.popout { animation: popout .2s ease;} 
.popin { animation: popin .2s ease;} 

@keyframes popout { 
    from {transform:scale(0)} 
    90% {transform:scale(1.1)} 
    to {transform:scale(1)} 
} 
@keyframes popin { 
    from {transform:scale(1)} 
    10% {transform:scale(1.1)} 
    to {transform:scale(0)} 
} 

Jetzt ist die Animationen funktionieren, aber nach dem Pop-up schließen (Hinzufügen der popin Klasse) es kehrt in den Standard-CSS-Zustand, der sichtbar ist. Das Ergebnis ist, dass das Popup-Fenster schrumpft und dann wieder erscheint, um zu bleiben. Ich kann das beheben, indem ich den CSS-Animationsaufruf forwards hinzufüge, aber das zwingt die Animation, unabhängig vom anderen Klick weiterzumachen. Mit anderen Worten; Wenn ich der CSS-Animation forwards hinzufüge, bleibt sie verborgen, wird aber nicht angezeigt, wenn Sie sie erneut öffnen (weil die forwards noch aktiv ist).

Ich wieder verweisen auf the Codepen, wo Sie es sehen und selbst ausprobieren können. Wenn Sie forwards der Klasse .popin hinzufügen, bleibt sie nach dem Schließen verborgen, kann aber nicht wieder geöffnet werden.

Also ich frage mich, wo mein Denkprozess falsch gelaufen ist; Können wir eine forwards Einstellung überschreiben oder stoppen? Fehle ich etwas Offensichtliches? Oder ist das nicht der richtige Weg und sollte ich stattdessen in die jQuery-Animation schauen?

+0

versuchen Sie dies https://codepen.io/anon/pen/bWrNPM – Amal

+0

Oh wow, das ist einfach huh. Alles was du getan hast, war diese Zeitüberschreitung hinzuzufügen? Ich dachte schon früher darüber nach, aber ich dachte, es könnte Probleme mit einem festen Timeout geben, um es zu verstecken, wenn die Animation nachläuft oder sich in der Länge ändert. –

+0

Sie vergessen, das Popup zu verstecken, wenn Sie auf Schließen klicken, müssen Sie '$ ('popup') hinzufügen. Hide();' –

Antwort

2

Vor allem, wie Sie popin/popout Klassen hinzufügen, entfernen Sie nicht die alte, so endet mit beiden auf dem Element, so dass es viel schwieriger (wenn nicht unmöglich) zu kontrollieren.

$('.open').click(function() { 
    //... 
    $('popup').removeClass('popin').addClass('popout'); 
}); 

$('.close').click(function() { 
    //... 
    $('popup').removeClass('popout').addClass('popin'); 
}) 

Außerdem müssen Sie berücksichtigen, dass, sobald Animation endet, wird das Element CSS Regeln gelten auf sie zu, was auch immer zurückkehrt. So müssen Sie die scale() Transformationen auf die Klassendefinitionen hinzuzufügen, wenn Sie wollen, bestehen bleiben:

.popout { 
    /* ... */ 
    transform: scale(1); 
} 
.popin { 
    /* ... */ 
    transform: scale(0); 
} 

Arbeitsbeispiel: https://codepen.io/anon/pen/Emvjaj


Randbemerkung: Statt zwei Knöpfe, die sie ersetzen basierend auf dem Status wird empfohlen, dass Sie nur eine Schaltfläche haben und den Status innerhalb der Funktion, die Sie aufrufen, ändern. Einige Browser/Geräte können beim Umschalten auf beide Schaltflächen klicken. Es ist sicherer mit einem Knopf.

+0

Nur um zu klären; Ich habe tatsächlich vergessen, die Klasse onclick zu entfernen, aber ich habe das in der tatsächlichen Produktionsumgebung. Das allein behebt das Problem nicht. Das Hinzufügen der Skala zu den Klassen tut jedoch :) Es scheint, das ist der eine Strohhalm, den ich vermisst habe. Allerdings funktioniert es immer noch nicht in meiner Produktionsumgebung, ich wette, dass dies die Lösung sein wird. –

+0

@AlexTimmer Gibt es eine Chance, dass ich einen Blick darauf werfen könnte? Ich könnte etwas entdecken, das du verpasst hast. Stellen Sie außerdem sicher, dass Sie * keinen * Cache * aktiviert haben. Wenn man in Eile ist, um einen Fix anzuwenden, kann man vergessen, * Cache * zu deaktivieren/zu löschen. Das passiert uns allen. :) –

+0

yeah, ich weiß, ich arbeite seit ein paar Monaten an diesem Projekt - ich weiß, wie es gehen kann;) und danke für das Angebot, aber es wird nicht notwendig sein; Ich bin mir ziemlich sicher, dass es mit der aktuellen Kriegszone zu tun hat, dass mein jQuery-Code über das ganze System verteilt ist (Magento). Ich werde es herausfinden :) Und weiter zu klären; dieser Codepen ist nur eine "Demo" der Situation; Die Produktionsstätte hat völlig andere Auslöser und dergleichen. –

2

Ich habe Ihr Beispiel in Codepen, getestet, indem Sie einfach die alternativen Klassen entfernen und die forward-fill-Eigenschaft an Ort und Stelle zu lassen, scheint Ihr Code gut zu funktionieren.

+0

Wie oben in den anderen Kommentaren erwähnt, entferne ich die alternativen Klassen in meiner tatsächlichen Produktionsumgebung, und in diesem Fall einfach hinzufügen Vorwärts zu beiden funktioniert nicht so gut. Aber gut zu hören, dass dies im einfachen Anwendungsfall funktionieren würde. –

Verwandte Themen