Animacja CSS3: wyświetlanie + krycie

102

Mam problem z animacją CSS3.

.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;
}

Ten kod działa tylko wtedy, gdy usunę zmianę display.

Chcę zmienić sposób wyświetlania tuż po najechaniu kursorem, ale krycie należy zmienić za pomocą przejścia.

Alexis Delrieu
źródło
2
Jeśli CSS nie działa tak, jak sugerowali inni, oto bardzo prosty kod JavaScript do zanikania.
Abhranil Das

Odpowiedzi:

119

Na podstawie odpowiedzi Michaelsa jest to rzeczywisty kod CSS, którego należy użyć

.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
źródło
1
do obsługi wszystkich przeglądarek ..?
david_adler
CSS3 nie jest obsługiwany we wszystkich przeglądarkach. Jeśli chcesz przedłużyć, po prostu dodaj poprawne przedrostki
Chris
17
A co z zawisem, jak zaimplementować fadeOutToNone?
Green
4
Ponieważ możesz używać ułamków procentu, lepiej jest użyć czegoś takiego jak 0,001% zamiast 1%, ponieważ minimalizuje to opóźnienie „startu”, co może stać się widoczne przy dłuższym czasie trwania animacji
Zach Saucier,
1
Dyrektywa -o-keyframes jest właściwie bezużyteczna, ponieważ pierwsza wersja Opery obsługująca animacje była już oparta na webkicie.
Rico Ocepek
43

Możesz zrobić z animacjami CSS:

0% display:none ; opacity: 0;
1% display: block ; opacity: 0;
100% display: block ; opacity: 1;
Michael Mullany
źródło
Dobry pomysł, udało mi się zachować wyświetlanie mojego elementu podczas najechania kursorem w trybie wypełnienia animacji, ale po wyjechaniu myszą element znika.
Alexis Delrieu,
2
możesz użyć trybu wypełnienia: do przodu, aby zachować zmiany po zakończeniu animacji.
Michael Mullany
42

Jeśli to możliwe - użyj visibilityzamiastdisplay

Na przykład:

.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
źródło
24
Problem z właściwością visibility polega na tym, że nie ukrywa ona elementu, a jedynie czyni go niewidocznym. Więc nadal będzie zajmować miejsce.
Samuel
6
Nie tylko niewidoczne, ale także przezroczyste dla zdarzeń (kliknięcia itp.). Brak zmiany wyświetlania oznacza brak ponownego przepływu dokumentu, co jest dobrą rzeczą. Większość elementów, które powinny pojawiać się / znikać z powodu krycia, prawdopodobnie i tak powinna mieć ustaloną lub bezwzględną pozycję.
Rasmus Kaj
13

To obejście działa:

  1. zdefiniuj „klatkę kluczową”:

    @-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. Użyj tej „klatki kluczowej” po „najechaniu”:

    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
źródło
9

Wykorzystałem to, aby to osiągnąć. Blakną po zawisie, ale nie zajmują miejsca, gdy są ukryte, idealne!

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

.parent:hover .child {
    height: auto;
    opacity: 1;
    visibility: visible;
}
felixhirschfeld
źródło
6

Trochę się zmieniłem, ale efekt jest piękny.

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

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

Dziękuję wszystkim.

Alexis Delrieu
źródło
4
To nie pasuje do czytników ekranu: będą kontynuować czytanie treści.
ehdv
1
Możesz dodać visibility: hidden;do .child / do dymka, visibility:visible;co powinno rozwiązać problem z czytnikiem ekranu
csilk
6

Jest jeszcze jedna dobra metoda, aby to zrobić, używając zdarzeń pointer:

.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;
}

Niestety nie jest to obsługiwane w IE10 i starszych.

RafaelKr
źródło
4

Miałem ten sam problem. Próbowałem używać animacji zamiast przejść - jak sugerują @MichaelMullany i @Chris - ale działało to tylko w przeglądarkach webkit, nawet jeśli kopiowałem i wklejałem z prefiksami „-moz” i „-o”.

Udało mi się obejść problem, używając visibilityzamiast display. To działa dla mnie, ponieważ mój element podrzędny jest position: absolutetaki, więc nie ma to wpływu na przepływ dokumentów. Może zadziałać również dla innych.

Tak wyglądałby oryginalny kod przy użyciu mojego rozwiązania:

.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
źródło
Gdybyś z powrotem najechał na dziecko, gdy jest ono animowane poza zasięgiem wzroku, wskoczyłoby z powrotem, ponieważ element jest po prostu ukryty. Dość irytujące, jeśli poruszasz myszą po tym miejscu.
adamj
4

Jeśli wyzwalasz zmianę za pomocą JS, powiedzmy po kliknięciu, istnieje fajne obejście.

Widzisz, że problem występuje, ponieważ animacja jest ignorowana podczas wyświetlania: żaden element, ale przeglądarka nie stosuje wszystkich zmian naraz, a element nigdy nie jest wyświetlany: blok, gdy nie jest animowany w tym samym czasie.

Sztuczka polega na poproszeniu przeglądarki o wyrenderowanie ramki po zmianie widoczności, ale przed uruchomieniem animacji.

Oto przykład JQuery:

    $('.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
źródło
2
To pytanie nie jest oznaczone tagiem JavaScript ani jQuery
j08691
Wiem, napisałem to, aby wyjaśnić, dlaczego tak się dzieje. Było to dla mnie bardzo przydatne, kiedy się o tym dowiedziałem i mam nadzieję, że pomoże to również innym.
daniel.sedlacek
1
Przy okazji, wartości krycia mieszczą się w zakresie od 0 do 1
Amr
2

W przypadku elementów bezwzględnych lub stałych możesz również użyć indeksu z:

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

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

Inne elementy powinny teraz mieć indeks z między -100 a 100.

Luca Steeb
źródło
Niestety to psuje symbol wskaźnika hasła KeePass na type=passwordpolach. To nie jest widoczne.
philk
1
Czy możemy przestać używać dowolnych numerów indeksu Z? Tutaj: z-index: 1; vs z-index: -1 wystarczy. Zbieranie ogromnych liczb z-index sprawia, że ​​nie da się nimi zarządzać.
dudewad
2

Wiem, że to naprawdę nie jest rozwiązanie na twoje pytanie, ponieważ o to prosisz

wyświetlanie + krycie

Moje podejście rozwiązuje bardziej ogólne pytanie, ale być może był to problem tła, który należy rozwiązać, używając displayw połączeniu zopacity .

Moim pragnieniem było usunięcie elementu z drogi, gdy nie jest widoczny. To rozwiązanie robi dokładnie to: przenosi element z daleka i można go użyć do przejścia:

.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;
}

Ten kod nie zawiera żadnych przedrostków przeglądarek ani hacków dotyczących wstecznej zgodności. Po prostu ilustruje koncepcję, w jaki sposób element jest odsunięty, ponieważ nie jest już potrzebny.

Ciekawą częścią są dwie różne definicje przejść. Gdy wskaźnik myszy najedzie na .parentelement, .childelement należy natychmiast umieścić na miejscu, a wtedy krycie zostanie zmienione:

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

Gdy nie ma najechania kursorem lub wskaźnik myszy został odsunięty od elementu, należy poczekać, aż zakończy się zmiana krycia, zanim element będzie można przenieść poza ekran:

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

Przeniesienie obiektu będzie realną alternatywą w przypadku, gdy ustawienie display:nonenie zakłóci układu.

Mam nadzieję, że trafiłem w sedno za to pytanie, chociaż nie odpowiedziałem.

Hannes Morgenstern
źródło
Ten filtr firmy Microsoft jest przestarzały od czasu przeglądarki IE9. Czy jest jakiś szczególny powód, dla którego chcesz dodać go do odpowiedzi w 2016 roku?
TylerH,
@TylerH Do ilu użytkowników chcesz dotrzeć, to kwestia gustu.
Hannes Morgenstern
Biorąc pod uwagę, że jest przestarzały , a IE <11 nie jest już obsługiwany przez Microsoft, używanie tej właściwości jest w najlepszym przypadku wątpliwe.
TylerH
@TylerH Powszechne jest przyjmowanie klientów, którzy nie chcą lub nie mogą dokonać aktualizacji do nowszej przeglądarki. Jako klient mam dobrze znany bank, który nadal używa IE6 i odmawia aktualizacji z „powodów”.
Marcus Cunningham
@MarcusCunningham Pytanie jest oznaczone tagiem css3, co całkowicie wyklucza użycie IE6 (oraz IE7 i IE8). W najwcześniejszym możliwym momencie OP przeglądarki mógł pisać kod dla, filtr MS w tej odpowiedzi był przestarzały. A dla przyszłych czytelników jest to jeszcze bardziej bezużyteczne, ponieważ nie jest nawet obsługiwane. Nie ma argumentów za umieszczeniem tego w odpowiedzi na to pytanie. Jest to jednak kwestia dyskusyjna, ponieważ Hannes już ją usunął ze swojej odpowiedzi.
TylerH,
1

Jedną z rzeczy, które zrobiłem, było ustawienie marginesu stanu początkowego na coś w rodzaju „margin-left: -9999px”, aby nie pojawiał się na ekranie, a następnie zresetowanie „margin-left: 0” w stanie najechania. W takim przypadku zachowaj „display: block”. Zrobił mi sztuczkę :)

Edycja: zapisać stan i nie wracać do poprzedniego stanu najechania? OK, potrzebujemy 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
źródło
Dobry pomysł, ale potem wyskakuję, element znika…
Alexis Delrieu,
Alexis, czy to nie jest to, co chcesz zrobić? Hover oznacza TYLKO po najechaniu myszą. Wyjaśnij, co próbujesz osiągnąć.
Joshua,
Tak, przepraszam. Chcę zachować zanikanie podczas wyprowadzania myszy.
Alexis Delrieu,
To wszystko zmienia. Prawie. Zasadniczo to, czego potrzebujesz, to funkcja JS, która wykryje stan najechania, jak wskazali inni użytkownicy, i doda ... cóż ... zobacz moją zaktualizowaną odpowiedź.
Joshua
1

Aby mieć animację w obie strony w trybie HoverIn / Out, zrobiłem to rozwiązanie. Mam nadzieję, że komuś to pomoże

@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;
  }
}
Mikołaja
źródło
0

JAK ANIMOWAĆ NIEPRZEZROCZYSTOŚĆ ZA POMOCĄ CSS:
to jest mój kod:
kod CSS

.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>

lub sprawdź ten plik demonstracyjny

function głos () {
var głosowanie = getElementById ("yourOpinion")
if (this.workWithYou):
vote + = 1};
lol

zakizakibzr
źródło
1
Nie odpowiada na pytanie, ponieważ displaywłaściwość została po prostu usunięta.
Toast
-4

display:nie podlega zmianie. Prawdopodobnie będziesz musiał użyć jQuery, aby zrobić to, co chcesz.

Duch Madary
źródło
3
Musisz przestać popierać jQuery wszędzie, stary.
Benjamin Gruenbaum
1
@BenjaminGruenbaum jQuery jest niesamowitym człowiekiem. Jest świetny i robi wszystko.
Madara's Ghost