CSS-Übergang mit nicht funktionierender Sichtbarkeit


102

In der folgenden Geige habe ich einen Übergang zu Sichtbarkeit und Deckkraft separat. Letzteres funktioniert, Ersteres jedoch nicht. Darüber hinaus wird im Falle der Sichtbarkeit die Übergangszeit als Verzögerung beim Schweben interpretiert. Passiert sowohl in Chrome als auch in Firefox. Ist das ein Fehler?

http://jsfiddle.net/0r218mdo/3/

Fall 1:

#inner{
    visibility:hidden;
    transition:visibility 1000ms;
}
#outer:hover #inner{
    visibility:visible;
}

Fall 2:

#inner1{
    opacity:0;
    transition:opacity 1000ms;
}
#outer1:hover #inner1{
    opacity:1;
}

4
Letzteres funktioniert, weil das opacitymehrere Werte zwischen 0und annehmen kann 1, während visibilitynur visibleoder hidden(keine Zwischenwerte) sein können
Fabrizio Calderan

Antworten:


147

Dies ist kein Fehler - Sie können nur über ordinale / berechenbare Eigenschaften wechseln (eine einfache Möglichkeit, dies zu betrachten, ist jede Eigenschaft mit einem numerischen Start- und Endnummernwert, obwohl es einige Ausnahmen gibt).

Dies liegt daran, dass Übergänge funktionieren, indem Keyframes zwischen zwei Werten berechnet und eine Animation durch Extrapolation von Zwischenbeträgen erstellt werden.

visibility In diesem Fall handelt es sich um eine binäre Einstellung (sichtbar / ausgeblendet). Sobald die Übergangsdauer abgelaufen ist, wechselt die Eigenschaft einfach den Status. Sie sehen dies als Verzögerung. Sie kann jedoch tatsächlich als endgültiger Keyframe der Übergangsanimation mit dem angesehen werden Zwischen-Keyframes wurden nicht berechnet (was sind die Werte zwischen ausgeblendet / sichtbar? Deckkraft? Dimension? Da dies nicht explizit ist, werden sie nicht berechnet).

opacity ist eine Werteinstellung (0-1), sodass Keyframes über die angegebene Dauer berechnet werden können.

Eine Liste der übertragbaren (animierbaren) Eigenschaften finden Sie hier


7
dev.w3.org/csswg/css-transitions/#animtype-visibility gibt an, dass Zwischenwerte "sichtbar" zugeordnet werden.
Beni Cherniavsky-Paskin

@ BeniCherniavsky-Paskin - dies hängt von der Timing-Funktion ab:other values of the timing function (which occur only at the start/end of the transition or as a result of cubic-bezier() functions with Y values outside of [0, 1]) map to the closer endpoint
SW4

1
Die Antwort von SW4 ist irreführend und erklärt nicht das Missverständnis hinsichtlich des Zwecks der Sichtbarkeit.
JesseMonroy650

@ JesseMonroy650 - obwohl ich zögern würde, dies zu widerlegen, ist es einfacher, dies zu tun, ohne dass zusätzliche Beweise für diese Behauptung vorgelegt werden. Es wäre faszinierend, wenn Sie näher darauf eingehen könnten. Das OP fragte nicht nach dem Zweck der Sichtbarkeit (die sich von Anzeige und Deckkraft unterscheidet), sondern warum es nicht als Eigenschaft animiert werden kann, und zwar aus dem angegebenen Grund - es ist effektiv eine Ein / Aus-Einstellung. Die Antwort versucht nicht, "was Sichtbarkeit ist" anzugehen, sondern "warum sie nicht animiert werden kann"
SW4

Wir könnten über die Bedeutung des OP streiten, aber ich werde dem entgegenwirken. Verärgert über das konstante (unvollständige) Thema und die Unfähigkeit, diese Arbeit zu machen, entscheide ich mich, sie zu untersuchen. Zunächst ist anzumerken, dass die Dokumentation schlecht ist . Die Erklärungen sind schlecht, die Spezifikation ist schlecht geschrieben (der Herausgeber hat auch einen Hinweis). Während dokumentiert als animatable, hat es in der Tat nur wenige der Eigenschaften; Eine dieser Eigenschaften ist das Timing . Ich werde bald bloggen.
JesseMonroy650

66

Die Sichtbarkeit ist animierbar. Überprüfen Sie diesen Blog-Beitrag darüber: http://www.greywyvern.com/?post=337

Sie können es auch hier sehen: https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_animated_properties

Angenommen, Sie haben ein Menü, das Sie mit dem Mauszeiger ein- und ausblenden möchten. Wenn Sie opacity:0nur verwenden, ist Ihr transparentes Menü weiterhin vorhanden und wird animiert, wenn Sie den Mauszeiger über den unsichtbaren Bereich bewegen. Wenn Sie jedoch hinzufügen visibility:hidden, können Sie dieses Problem beheben:

div {
    width:100px;
    height:20px;
}
.menu {
    visibility:hidden;
    opacity:0;
    transition:visibility 0.3s linear,opacity 0.3s linear;
    
    background:#eee;
    width:100px;
    margin:0;
    padding:5px;
    list-style:none;
}
div:hover > .menu {
    visibility:visible;
    opacity:1;
}
<div>
  <a href="#">Open Menu</a>
  <ul class="menu">
    <li><a href="#">Item</a></li>
    <li><a href="#">Item</a></li>
    <li><a href="#">Item</a></li>
  </ul>
</div>


2
Das ist nicht wahr. Der Artikel zeigt deutlich: 1: Benutzermäuse über dem Element 2: Sichtbarkeit wird auf sichtbar umgeschaltet 3: Opazitätsübergangsanimation beginnt
Ben Racicot

4
Und doch erreicht der Artikel das funktionale Äquivalent der animierten Sichtbarkeit, indem er geschickt zur Deckkraft übergeht. Es erklärt gut, warum Sie immer noch mit der Sichtbarkeit herumspielen müssen, um auf Dinge "unter" einem versteckten Objekt klicken zu können, z. B. mit einem Dropdown-Menü. Diese Antwort wäre jedoch besser, wenn sie lokal ein Beispiel und eine Zusammenfassung geben würde . (Links brechen; ich habe gerade einen repariert.)
Bob Stein

Diese Antwort ist etwas irreführend, aber trotzdem hat es funktioniert, danke!
JaTo

2
@ BobStein-VisiBone Ich habe meine Antwort bearbeitet und ein Beispiel gegeben. Vielen Dank für Ihre Hilfe :)
Sevban Öztürk

20

Die Sichtbarkeit ist eine animierbare Eigenschaft gemäß der Spezifikation, aber Übergänge bei der Sichtbarkeit funktionieren nicht wie erwartet allmählich. Stattdessen verzögern Übergänge bei der Sichtbarkeit das Ausblenden eines Elements. Andererseits funktioniert es sofort, ein Element sichtbar zu machen. Dies ist so, wie es durch die Spezifikation definiert ist (im Fall der Standard-Timing-Funktion) und wie es in den Browsern implementiert ist.

Dies ist auch ein nützliches Verhalten, da man sich tatsächlich verschiedene visuelle Effekte vorstellen kann, um ein Element zu verbergen. Das Ausblenden eines Elements ist nur eine Art von visuellem Effekt, der mithilfe der Deckkraft festgelegt wird. Andere visuelle Effekte können das Element mithilfe der Transformationseigenschaft entfernen. Siehe auch http://taccgl.org/blog/css-transition-visibility.html

Es ist oft nützlich, den Opazitätsübergang mit einem Sichtbarkeitsübergang zu kombinieren! Obwohl die Deckkraft das Richtige zu tun scheint, erhalten vollständig transparente Elemente (mit der Deckkraft: 0) weiterhin Mausereignisse. So reagieren beispielsweise Links auf ein Element, das nur mit einem Deckkraftübergang ausgeblendet wurde, immer noch auf Klicks (obwohl nicht sichtbar), und Links hinter dem ausgeblendeten Element funktionieren nicht (obwohl sie durch das ausgeblendete Element sichtbar sind). Siehe http://taccgl.org/blog/css-transition-opacity-for-fade-effects.html .

Dieses seltsame Verhalten kann vermieden werden, indem nur beide Übergänge verwendet werden, der Übergang zur Sichtbarkeit und der Übergang zur Deckkraft. Dabei wird die Sichtbarkeitseigenschaft verwendet, um Mausereignisse für das Element zu deaktivieren, während die Deckkraft für den visuellen Effekt verwendet wird. Es muss jedoch darauf geachtet werden, das Element nicht zu verbergen, während der visuelle Effekt abgespielt wird, der sonst nicht sichtbar wäre. Hier wird die spezielle Semantik des Sichtbarkeitsübergangs nützlich. Beim Ausblenden eines Elements bleibt das Element während der Wiedergabe des visuellen Effekts sichtbar und wird anschließend ausgeblendet. Wenn Sie dagegen ein Element anzeigen, macht der Sichtbarkeitsübergang das Element sofort sichtbar, dh bevor der visuelle Effekt abgespielt wird.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.