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.


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

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;

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

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

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

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.


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.


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

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);

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.


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.


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>

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

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


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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.