Animation CSS3: Anzeige + Deckkraft

99

Ich habe ein Problem mit einer CSS3-Animation.

.child {
    opacity: 0;
    display: none;

    -webkit-transition: opacity 0.5s ease-in-out;
    -moz-transition: opacity 0.5s ease-in-out;
    transition: opacity 0.5s ease-in-out;
}

.parent:hover .child {
    opacity: 0.9;
    display: block;
}

Dieser Code funktioniert nur, wenn ich die Änderung von entferne display.

Ich möchte die Anzeige direkt nach dem Hover ändern, aber die Deckkraft sollte über den Übergang geändert werden.

Alexis Delrieu
quelle
2
Wenn CSS nicht wie von den anderen vorgeschlagen funktioniert, finden Sie hier einen sehr einfachen Javascript-Code zum Ausblenden.
Abhranil Das

Antworten:

116

Basierend auf Michaels Antwort ist dies der tatsächlich zu verwendende CSS-Code

.parent:hover .child
{
    display: block;

    -webkit-animation: fadeInFromNone 0.5s ease-out;
    -moz-animation: fadeInFromNone 0.5s ease-out;
    -o-animation: fadeInFromNone 0.5s ease-out;
    animation: fadeInFromNone 0.5s ease-out;
}

@-webkit-keyframes fadeInFromNone {
    0% {
        display: none;
        opacity: 0;
    }

    1% {
        display: block;
        opacity: 0;
    }

    100% {
        display: block;
        opacity: 1;
    }
}

@-moz-keyframes fadeInFromNone {
    0% {
        display: none;
        opacity: 0;
    }

    1% {
        display: block;
        opacity: 0;
    }

    100% {
        display: block;
        opacity: 1;
    }
}

@-o-keyframes fadeInFromNone {
    0% {
        display: none;
        opacity: 0;
    }

    1% {
        display: block;
        opacity: 0;
    }

    100% {
        display: block;
        opacity: 1;
    }
}

@keyframes fadeInFromNone {
    0% {
        display: none;
        opacity: 0;
    }

    1% {
        display: block;
        opacity: 0;
    }

    100% {
        display: block;
        opacity: 1;
    }
}
Chris
quelle
1
um alle Browser zu unterstützen ..?
David_adler
CSS3 wird nicht in allen Browsern unterstützt. Wenn Sie erweitern möchten, fügen Sie einfach die richtigen Präfixe hinzu
Chris
17
Was ist mit dem Schweben, wie man fadeOutToNone implementiert?
Grün
4
Da Sie Bruchteile von einem Prozent verwenden können, ist es besser, etwa 0,001% anstelle von 1% zu verwenden, da dies die Verzögerung zum "Starten" minimiert, was bei längeren Animationsdauern offensichtlich werden kann
Zach Saucier
1
Die Anweisung -o-keyframes ist eigentlich nutzlos, da die erste Opera-Version, die Animationen unterstützt, bereits auf einem Webkit basiert.
Rico Ocepek
43

Sie können mit CSS-Animationen arbeiten:

0% display:none ; opacity: 0;
1% display: block ; opacity: 0;
100% display: block ; opacity: 1;
Michael Mullany
quelle
Gute Idee, es ist mir gelungen, mein Element während des Hover-Vorgangs im Animationsfüllmodus anzuzeigen, aber dann verschwindet das Element, wenn ich mit der Maus ausgehe.
Alexis Delrieu
2
Sie können den Füllmodus: vorwärts verwenden, um Änderungen nach Abschluss der Animation beizubehalten.
Michael Mullany
39

Wenn möglich - visibilityanstelle von verwendendisplay

Zum Beispiel:

.child {
    visibility: hidden;
    opacity: 0;
    transition: opacity 0.3s, visibility 0.3s;
}

.parent:hover .child {
    visibility: visible;
    opacity: 1;
    transition: opacity 0.3s, visibility 0.3s;
}
tomas.satinsky
quelle
23
Das Problem mit der Sichtbarkeitseigenschaft besteht darin, dass das Element dadurch nicht ausgeblendet, sondern nur unsichtbar gemacht wird. Es wird also immer noch Platz beanspruchen.
Samuel
6
Nicht nur unsichtbar, sondern auch transparent für Ereignisse (Klicks usw.). Die Anzeige nicht zu ändern bedeutet, das Dokument nicht erneut zu fließen, was eine gute Sache ist. Die meisten Elemente, die durch die Deckkraft ein- und ausgeblendet werden sollen, sollten wahrscheinlich ohnehin eine feste oder absolute Position haben.
Rasmus Kaj
12

Diese Problemumgehung funktioniert:

  1. Definieren Sie einen „Keyframe“:

    @-webkit-keyframes fadeIn { 
      0% { opacity: 0; }
      20% { opacity: 0; }
      40% { opacity: 0.3; }
      60% { opacity: 0.5; }
      80% { opacity: 0.9; }
      100% { opacity: 1; }
    }
    
    @keyframes fadeIn {
      0% { opacity: 0; }
      20% { opacity: 0; }
      40% { opacity: 0.3; }
      60% { opacity: 0.5; }
      80% { opacity: 0.9; }
      100% { opacity: 1; }
    }
  2. Verwenden Sie diesen "Keyframe" für "Hover":

    div a span { 
      display: none;
    }
    
    div a:hover span {
      display: block;
    
      -webkit-animation-name: fadeIn;
      -webkit-animation-duration: 1s;
      animation-name: fadeIn;
      animation-duration: 1s;
    }
Hermann Schwarz
quelle
9

Ich habe das benutzt, um es zu erreichen. Sie verblassen beim Schweben, nehmen aber keinen Platz ein, wenn sie versteckt sind, perfekt!

.child {
    height: 0px;
    opacity: 0;
    visibility: hidden;
    transition: all .5s ease-in-out;
}

.parent:hover child {
    height: auto;
    opacity: 1;
    visibility: visible;
}
felixhirschfeld
quelle
6

Ich habe mich ein bisschen verändert, aber das Ergebnis ist wunderschön.

.child {
    width: 0px;
    height: 0px;
    opacity: 0;
}

.parent:hover child {
    width: 150px;
    height: 300px;
    opacity: .9;
}

Dank an alle.

Alexis Delrieu
quelle
4
Dies funktioniert nicht gut mit Bildschirmleseprogrammen: Sie lesen den Inhalt weiter.
ehdv
1
Sie könnten visibility: hidden;.child / visibility:visible;zum Schwebeflug hinzufügen und dies sollte das Problem mit dem Bildschirmleser beheben
csilk
6

Es gibt eine andere gute Methode, um dies mithilfe von Zeigerereignissen zu erreichen:

.child {
    opacity: 0;
    pointer-events: none;

    -webkit-transition: opacity 0.5s ease-in-out;
    -moz-transition: opacity 0.5s ease-in-out;
    transition: opacity 0.5s ease-in-out;
}

.parent:hover .child {
    opacity: 0.9;
    pointer-events: all;
}

Leider wird dies in IE10 und darunter nicht unterstützt.

RafaelKr
quelle
4

Ich hatte das gleiche Problem. Ich habe versucht, Animationen anstelle von Übergängen zu verwenden - wie von @MichaelMullany und @Chris vorgeschlagen -, aber es funktionierte nur für Webkit-Browser, selbst wenn ich mit den Präfixen "-moz" und "-o" kopiert habe.

Ich konnte das Problem umgehen, indem ich visibilityanstelle von verwendete display. Dies funktioniert bei mir, weil mein untergeordnetes Element so ist position: absolute, dass der Dokumentenfluss nicht beeinträchtigt wird. Es könnte auch für andere funktionieren.

So würde der ursprüngliche Code mit meiner Lösung aussehen:

.child {
    position: absolute;
    opacity: 0;
    visibility: hidden;

    -webkit-transition: opacity 0.5s ease-in-out;
    -moz-transition: opacity 0.5s ease-in-out;
    transition: opacity 0.5s ease-in-out;
}

.parent:hover .child {
    position: relative;
    opacity: 0.9;
    visibility: visible;
}
Dave
quelle
Wenn Sie während der Animation aus dem Blickfeld zurück in das Kind schweben, wird es wieder einrasten, da das Element lediglich versteckt ist. Ziemlich ärgerlich, wenn Sie Ihre Maus bewegen.
Adamj
4

Wenn Sie die Änderung mit JS auslösen, sagen wir beim Klicken, gibt es eine nette Problemumgehung.

Sie sehen, dass das Problem auftritt, weil die Animation bei der Anzeige ignoriert wird: Kein Element, aber der Browser wendet alle Änderungen gleichzeitig an und das Element wird nie angezeigt: Blockieren, während es nicht gleichzeitig animiert ist.

Der Trick besteht darin, den Browser zu bitten, den Rahmen nach dem Ändern der Sichtbarkeit, aber vor dem Auslösen der Animation zu rendern.

Hier ist ein JQuery-Beispiel:

    $('.child').css({"display":"block"});
    //now ask the browser what is the value of the display property
    $('.child').css("display"); //this will trigger the browser to apply the change. this costs one frame render
    //now a change to opacity will trigger the animation
    $('.child').css("opacity":100);
daniel.sedlacek
quelle
2
Diese Frage ist weder mit JavaScript noch mit jQuery markiert
j08691
Ich weiß, ich habe es geschrieben, um den Grund dafür zu erklären. Es war sehr nützlich für mich, als ich davon erfuhr und ich hoffe, es wird auch anderen helfen.
daniel.sedlacek
1
Übrigens liegen die Opazitätswerte zwischen 0 und 1
Amr
2

Für absolute oder feste Elemente können Sie auch den Z-Index verwenden:

.item {
    position: absolute;
    z-index: -100;
}

.item:hover {
    z-index: 100;
}

Andere Elemente sollten jetzt einen Z-Index zwischen -100 und 100 haben.

Luca Steeb
quelle
Leider wird dadurch das KeePass-Kennwortanzeigesymbol in den type=passwordFeldern durcheinander gebracht . Es ist nicht sichtbar.
Philk
1
Können wir bitte aufhören, beliebige Z-Index-Nummern zu verwenden? Hier: Z-Index: 1; vs z-index: -1 reicht völlig aus. Das Auswählen großer Z-Index-Zahlen macht die Dinge unüberschaubar.
Dudewad
2

Ich weiß, das ist keine wirkliche Lösung für Ihre Frage, weil Sie danach fragen

Anzeige + Deckkraft

Mein Ansatz löst eine allgemeinere Frage, aber vielleicht war dies das Hintergrundproblem, das durch die Verwendung displayin Kombination mit gelöst werden sollte opacity.

Mein Wunsch war es, das Element aus dem Weg zu räumen, wenn es nicht sichtbar ist. Diese Lösung macht genau das: Sie bewegt das Element aus dem Weg und kann für den Übergang verwendet werden:

.child {
  left: -2000px;
  opacity: 0;
  visibility: hidden;
  transition: left 0s 0.8s, visibility 0s 0.8s, opacity 0.8s;
}

.parent:hover .child {
  left: 0;
  opacity: 1;
  visibility: visible;
  transition: left 0s, visibility 0s, opacity 0.8s;
}

Dieser Code enthält keine Browserpräfixe oder Abwärtskompatibilitäts-Hacks. Es zeigt nur das Konzept, wie das Element wegbewegt wird, da es nicht mehr benötigt wird.

Der interessante Teil sind die zwei unterschiedlichen Übergangsdefinitionen. Wenn sich der Mauszeiger über dem .parentElement befindet, muss das Element .childsofort platziert werden, und dann wird die Deckkraft geändert:

transition: left 0s, visibility 0s, opacity 0.8s;

Wenn es keinen Hover gibt oder der Mauszeiger vom Element wegbewegt wurde, muss gewartet werden, bis die Deckkraftänderung abgeschlossen ist, bevor das Element vom Bildschirm wegbewegt werden kann:

transition: left 0s 0.8s, visibility 0s 0.8s, opacity 0.8s;

Das Verschieben des Objekts ist eine praktikable Alternative in einem Fall, in dem die Einstellung display:nonedas Layout nicht beschädigen würde.

Ich hoffe, ich habe bei dieser Frage den Nagel auf den Kopf getroffen, obwohl ich sie nicht beantwortet habe.

Hannes Morgenstern
quelle
Dieser Microsoft-Filter ist seit IE9 veraltet. Gibt es einen bestimmten Grund, warum Sie es 2016 zu den Antworten hinzufügen möchten?
TylerH
@ TylerH Wie viele Benutzer man erreichen möchte, ist eine Frage des Geschmacks.
Hannes Morgenstern
In Anbetracht dessen, dass es veraltet ist und IE <11 von Microsoft nicht mehr unterstützt wird, ist die Verwendung dieser Eigenschaft bestenfalls von fragwürdigem Geschmack.
TylerH
@TylerH Es ist üblich, Clients aufzunehmen, die nicht auf einen neueren Browser aktualisieren möchten oder können. Ich habe eine bekannte Bank als Kunde, die immer noch IE6 verwendet und sich aus "Gründen" weigert, ein Upgrade durchzuführen.
Marcus Cunningham
@MarcusCunningham Die Frage ist mit css3 gekennzeichnet, was die Verwendung von IE6 (und IE7 und IE8) vollständig ausschließt. In dem frühestmöglichen Browser-OP, in dem Code geschrieben werden konnte, war der MS-Filter in dieser Antwort veraltet. Und für zukünftige Leser ist es noch nutzloser, da es nicht einmal unterstützt wird. Es gibt kein Argument dafür, es in eine Antwort auf diese Frage aufzunehmen. Es ist jedoch ein strittiger Punkt, da Hannes ihn bereits aus seiner Antwort entfernt hat.
TylerH
1

Eine Sache, die ich getan habe, war, den Rand des Anfangszustands auf "Rand-Links: -9999px" zu setzen, damit er nicht auf dem Bildschirm angezeigt wird, und dann "Rand-Links: 0" im Schwebezustand zurückzusetzen. Behalten Sie in diesem Fall "display: block" bei. Hab den Trick für mich gemacht :)

Bearbeiten: Status speichern und nicht zum vorherigen Schwebezustand zurückkehren? Ok hier brauchen wir JS:

<style>
.hovered { 
    /* hover styles here */
}
</style>

<script type="text/javascript">
$('.link').hover(function() {
   var $link = $(this);
   if (!$link.hasclass('hovered')) { // check to see if the class was already given
        $(this).addClass('hovered');
   } 
});
</script>
Joshua
quelle
Gute Idee, aber dann Mouseout, verschwindet das Element ...
Alexis Delrieu
Alexis, willst du das nicht? Schweben bedeutet NUR, wenn Sie mit der Maus schweben. Bitte klären Sie, was Sie erreichen möchten.
Joshua
Ja Entschuldigung. Ich möchte das Einblenden im Mouseout speichern.
Alexis Delrieu
Das ändert alles. Fast. Grundsätzlich möchten Sie dann eine JS-Funktion, die den Schwebezustand erkennt, wie andere Benutzer angegeben haben, und ... nun ... meine aktualisierte Antwort anzeigt.
Joshua
1

Um Animation in beide Richtungen onHoverIn / Out zu haben, habe ich diese Lösung gemacht. Hoffe es wird jemandem helfen

@keyframes fadeOutFromBlock {
  0% {
    position: relative;
    opacity: 1;
    transform: translateX(0);
  }

  90% {
    position: relative;
    opacity: 0;
    transform: translateX(0);
  }

  100% {
    position: absolute;
    opacity: 0;
    transform: translateX(-999px);
  }
}

@keyframes fadeInFromNone {
  0% {
    position: absolute;
    opacity: 0;
    transform: translateX(-999px);
  }

  1% {
    position: relative;
    opacity: 0;
    transform: translateX(0);
  }

  100% {
    position: relative;
    opacity: 1;
    transform: translateX(0);
  }
}

.drafts-content {
  position: relative;
  opacity: 1;
  transform: translateX(0);
  animation: fadeInFromNone 1s ease-in;
  will-change: opacity, transform;

  &.hide-drafts {
    position: absolute;
    opacity: 0;
    transform: translateX(-999px);
    animation: fadeOutFromBlock 0.5s ease-out;
    will-change: opacity, transform;
  }
}
Nikolaus
quelle
1

WIE MAN OPACITY MIT CSS ANIMIERT:
Dies ist mein Code:
der CSS-Code

.item {   
    height:200px;
    width:200px;
    background:red;
    opacity:0;
    transition: opacity 1s ease-in-out;
}

.item:hover {
    opacity: 1;
}
code {
    background: linear-gradient(to right,#fce4ed,#ffe8cc);
}
<div class="item">

</div>
<p><code> move mouse over top of this text</code></p>

oder überprüfen Sie diese Demo-Datei

Funktion vote () {
var vote = getElementById ("yourOpinion")
if (this.workWithYou):
vote + = 1};
lol

zakizakibzr
quelle
Beantwortet die Frage nicht, da die displayEigenschaft einfach entfernt wurde.
Toast
-4

display:ist nicht übertragbar. Sie müssen wahrscheinlich jQuery verwenden, um das zu tun, was Sie tun möchten.

Madaras Geist
quelle
3
Du musst aufhören, dich überall für jQuery einzusetzen, Alter.
Benjamin Gruenbaum
1
@BenjaminGruenbaum jQuery ist ein erstaunlicher Mann. Es ist großartig und macht alles.
Geist