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.