Transizioni sulla proprietà di visualizzazione CSS


1449

Attualmente sto progettando un menu 'mega menu a discesa' CSS - fondamentalmente un normale menu a discesa solo CSS, ma uno che contiene diversi tipi di contenuto.

Al momento, sembra che le transizioni CSS 3 non si applichino alla proprietà 'display' , cioè non è possibile effettuare alcun tipo di transizione da display: noneadisplay: block (o qualsiasi combinazione).

C'è un modo per il menu di secondo livello dell'esempio precedente di 'dissolvenza' quando qualcuno passa sopra una delle voci di menu di livello superiore?

Sono consapevole che puoi utilizzare le transizioni sul visibility: proprietà, ma non riesco a pensare a un modo per utilizzarlo in modo efficace.

Ho anche provato ad usare l'altezza, ma questo è fallito miseramente.

Sono anche consapevole che è banale raggiungere questo obiettivo utilizzando JavaScript, ma volevo sfidare me stesso a usare solo CSS, e penso che sto arrivando un po 'corto.


La transizione CSS funziona se la applichi alla proprietà di opacità, anziché alla visualizzazione?
Paul D. Waite,

13
posizione: assoluta; visibilità: nascosta; è uguale a display: none;
Jawad,

8
@Jawad: solo se aggiungi anche qualcosa di simile z-index:0.
DanMan,

7
@Jawad: si consiglia di non usarlo mai visibility: hiddense non si desidera che i lettori di schermo lo leggano (mentre i browser tipici non lo faranno). Definisce solo la visibilità dell'elemento (come dire opacity: 0), ed è ancora selezionabile, cliccabile e qualunque cosa fosse; non è appena visibile.
Forest Katsch,

1
nessun supporto per pointer-eventsIE 8,9,10, quindi non è sempre ok
Steven Pribilinskiy,

Risposte:


1351

Puoi concatenare due o più transizioni ed visibilityè ciò che ti torna utile questa volta.

div {
  border: 1px solid #eee;
}
div > ul {
  visibility: hidden;
  opacity: 0;
  transition: visibility 0s, opacity 0.5s linear;
}
div:hover > ul {
  visibility: visible;
  opacity: 1;
}
<div>
  <ul>
    <li>Item 1</li>
    <li>Item 2</li>
    <li>Item 3</li>
  </ul>
</div>

(Non dimenticare i prefissi del fornitore per la transitionproprietà.)

Maggiori dettagli sono in questo articolo .


10
Questa risposta sembra meno lavoro delle altre e raggiunge ciò che ci aspetteremmo dal display: nessuna / blocco; Grazie. Mi ha salvato un sacco di tempo.
Brendan,

21
Sì, il problema con questo è che qualcosa dietro si sovrapporrà anche se non è visibile. Ho trovato usando height: 0 una soluzione molto migliore
Josh Bedo,

742
Questo è carino ma il problema è che gli elementi "visibilità nascosta" occupano ancora spazio mentre "display none" no.
Rui Marques,

41
Probabilmente mi manca qualcosa, ma perché modifichi sia la visibilità che l'opacità? L'impostazione dell'opacità su 0 non nasconde l'elemento: perché è necessario impostare anche la visibilità su nascosto?
GMA,

21
@GeorgeMillo se si imposta solo l'opacità, l'elemento è effettivamente ancora nel rendering della pagina (non è possibile fare clic su pensato ad esempio).
adriendenat,

801

Devi nascondere l'elemento con altri mezzi per farlo funzionare.

Ho ottenuto l'effetto posizionando entrambi in modo <div>assoluto e impostando quello nascosto su opacity: 0.

Se si attiva o disattiva la displayproprietà da noneablock , la transizione su altri elementi non avverrà.

Per ovviare a questo, consenti sempre che l'elemento sia display: block, ma nascondi l'elemento regolando uno di questi mezzi:

  1. Impostare heightsu 0.
  2. Impostare opacitysu 0.
  3. Posiziona l'elemento al di fuori della cornice di un altro elemento che ha overflow: hidden.

Probabilmente ci sono più soluzioni, ma non è possibile eseguire una transizione se si attiva o disattiva l'elemento display: none. Ad esempio, puoi provare a provare qualcosa del genere:

div {
    display: none;
    transition: opacity 1s ease-out;
    opacity: 0;
}
div.active {
    opacity: 1;
    display: block;
}

Ma non lo farà funzionerà. Dalla mia esperienza, ho scoperto che questo non fa nulla.

Per questo motivo, dovrai sempre mantenere l'elemento display: block, ma potresti aggirarlo facendo qualcosa del genere:

div {
    transition: opacity 1s ease-out;
    opacity: 0;
    height: 0;
    overflow: hidden;
}
div.active {
    opacity: 1;
    height: auto;
}

29
Grazie Jim per una risposta esauriente. Hai assolutamente ragione sul fatto che se il display: la proprietà cambia affatto, TUTTE le transizioni non funzioneranno. È un peccato - mi chiedo quale sia il ragionamento che sta dietro. In una nota a margine, sullo stesso link che ho pubblicato nella domanda originale, puoi vedere dove sono con esso. L'unico (piccolo) problema che ho è in Chrome [5.0.375.125] quando la pagina si carica, puoi vedere il menu svanire rapidamente mentre gli elementi vengono caricati sulla pagina. Firefox 4.0b2 e Safari 5.0 sono assolutamente a posto ... bug o qualcosa che mi sono perso?
RichardTape,

7
Sono d'accordo che questo è giusto e lo contribuirò; un avvertimento per i futuri viaggiatori. Ho trovato una soluzione funzionante in Chrome, ma ho riscontrato che non riesce su iPhone 4: visibility:hidden; opacity:0; -webkit-transition: all .2s ease-in-out;non solo la transizione non è corretta, ma l'elemento target non verrà mai visualizzato. Il controllo qualità fallirà tu, io e tua madre.
Semplicemente il

1
In realtà puoi anche trasferire la proprietà di visibilità .. solo dicendo
Cu7l4ss

2
Se imposti lo stato nascosto su height: 0;e non lo trasferisci, la transizione non funzionerà. Ho provato questo solo cercando di passare all'opacità. Ho dovuto rimuovere ilheight: 0;
chovy

10
hai appena vinto un voto a causa del overflow: hiddengrazie mille!
thiagoh,

279

Al momento di questo post tutti i principali browser disabilitano le transizioni CSS se provi a cambiare la displayproprietà, ma le animazioni CSS funzionano ancora bene, quindi possiamo usarle come soluzione alternativa.

Codice di esempio (puoi applicarlo di conseguenza al tuo menu) Demo :

Aggiungi il seguente CSS al tuo foglio di stile:

@-webkit-keyframes fadeIn {
    from { opacity: 0; }
      to { opacity: 1; }
}
@keyframes fadeIn {
    from { opacity: 0; }
      to { opacity: 1; }
}

Quindi applica l' fadeInanimazione al bambino al passaggio del mouse del genitore (e ovviamente impostato display: block):

.parent:hover .child {
    display: block;
    -webkit-animation: fadeIn 1s;
    animation: fadeIn 1s;
}

Aggiornamento 2019 - Metodo che supporta anche lo sbiadimento:

(È richiesto un codice JavaScript)

// We need to keep track of faded in elements so we can apply fade out later in CSS
document.addEventListener('animationstart', function (e) {
  if (e.animationName === 'fade-in') {
      e.target.classList.add('did-fade-in');
  }
});

document.addEventListener('animationend', function (e) {
  if (e.animationName === 'fade-out') {
      e.target.classList.remove('did-fade-in');
   }
});
div {
    border: 5px solid;
    padding: 10px;
}

div:hover {
    border-color: red;
}

.parent .child {
  display: none;
}

.parent:hover .child {
  display: block;
  animation: fade-in 1s;
}

.parent:not(:hover) .child.did-fade-in {
  display: block;
  animation: fade-out 1s;
}

@keyframes fade-in {
  from {
    opacity: 0;
  }
  to {
    opacity: 1;
  }
}

@keyframes fade-out {
  from {
    opacity: 1;
  }
  to {
    opacity: 0;
  }
}
<div class="parent">
    Parent
    <div class="child">
        Child
    </div>
</div>


3
Grazie per questo. Il height: 0trucco (per le transizioni) di cui sopra non sembra funzionare perché l'altezza viene impostata su 0 sulla transizione di dissolvenza, ma questo trucco sembra funzionare bene.
Elliot Winkler

41
Grazie molto utile Ma come svanire?
Illiou,

1
Il primo paragrafo di questa risposta non ha molto senso. I browser non disabilitano completamente tutte le transizioni nel momento in cui usi la displayproprietà - non c'è davvero motivo di farlo. E anche se lo facessero , perché allora le animazioni dovrebbero funzionare? Non puoi nemmeno usare la displayproprietà nelle animazioni CSS.
BoltClock

7
Migliore risposta, non possibile con le transizioni ma sì con le animazioni.
Mikel,

6
Che ne dici dell'animazione al contrario, ovvero quando l'elemento dovrebbe scomparire lentamente?
Green,

77

Ho il sospetto che la ragione per cui le transizioni sono disabilitate se displayviene modificata è a causa di ciò che effettivamente fa il display. Essa non cambia nulla, che, concettualmente, potrebbe essere senza intoppi animato.

display: none;e visibility: hidden;sono due cose completamente diverse.
Entrambi hanno l'effetto di rendere invisibile l'elemento, ma con il visibility: hidden;suo rendering nel layout, ma non così visibilmente .
L'elemento nascosto occupa ancora spazio ed è ancora reso in linea o come blocco o blocco in linea o tabella o qualunque displayelemento gli dica di renderlo e occupa spazio di conseguenza.
Altri elementi non si spostano automaticamente per occupare quello spazio. L'elemento nascosto non esegue il rendering dei pixel effettivi sull'output.

display: noned'altro canto, in realtà impedisce all'elemento di essere visualizzato interamente .
Esso non occupa alcun spazio di layout.
Altri elementi che avrebbero occupato parte o tutto lo spazio occupato da questo elemento ora si adattano per occupare quello spazio, come se l'elemento semplicemente non esistesse affatto .

displaynon è solo un altro attributo visivo.
Essa stabilisce l'intera modalità di rendering degli elementi, ad esempio se si tratta di un block, inline, inline-block, table, table-row, table-cell, list-item, o qualsiasi altra cosa!
Ognuno di questi hanno molto diverse ramificazioni di layout, e non ci sarebbe modo ragionevole animato o uniformemente loro transizione (provate a immaginare una transizione graduale dal blockal inlineo viceversa, per esempio!).

Questo è il motivo per cui le transizioni sono disabilitate se la visualizzazione cambia (anche se la modifica è da o verso none- nonenon è semplicemente invisibilità, è la sua modalità di rendering dell'elemento che non significa affatto rendering!).


8
Per quanto buone possano essere le soluzioni di cui sopra, è stato molto soddisfacente ottenere una spiegazione ragionevole sul perché le transizioni non si applicano agli attributi di visualizzazione.
kqr,

8
Non sono d'accordo. Potrebbe avere perfettamente senso. Se display: nessuno da visualizzare: il blocco si è verificato istantaneamente all'inizio della transizione, sarebbe fantastico. E per tornare indietro, se passasse da display: block a display: nessuno proprio alla fine della transizione, sarebbe perfetto.
Curtis Yallop,

2
Se non riesci a immaginare come sia un'animazione da un punto a un rettangolo, hai dei problemi. Una transizione dall'occupazione di nessuno spazio all'occupazione di uno spazio rettangolare è MOLTO ovvia, come, lo fai ogni volta che trascini un rettangolo con il mouse come in ogni applicazione di sempre. Come risultato di questo fallimento, ci sono così tanti hack che coinvolgono l'altezza massima e i margini negativi che è ridicolo. L'unica cosa che funziona è la memorizzazione nella cache dell'altezza "reale" e quindi l'animazione da zero al valore memorizzato nella cache con JavaScript. Triste.
Triynko,

2
Tryniko: display: none non modifica la dimensione dell'elemento in un rettangolo di 0 x 0 - lo rimuove dal DOM. È possibile animare da un rettangolo a un punto animando le proprietà di larghezza e altezza a zero e quindi gli altri elementi fluirebbero attorno ad esso come se avesse "display: none" ma l'attributo "display" rimarrebbe "block"; l'elemento è ancora nel DOM. Il concetto di animazione tra display: block e display: none è ridicolo: non ci sono stati intermedi. Un elemento esiste nel DOM oppure non esiste, non importa quanto sia piccolo o invisibile.
Steve Thorpe,

1
Non è ridicolo animare proprietà discrete. Proprietà discrete come displaynon possono essere trasferite uniformemente come altre proprietà, ma ciò non significa che i tempi non siano importanti. Essere in grado di controllare quando avviene il passaggio da disply:blocka display:noneè molto importante. Proprio come descritto da @CurtisYallop. Se voglio transizione da opacity:1a opacity:0e poi cambiare display:blockper display:nonedovrei essere in grado di farlo.
Jens,

57

Invece dei callback, che non esistono nei CSS, possiamo usare la transition-delayproprietà.

#selector {
    overflow: hidden; // Hide the element content, while height = 0
    height: 0; opacity: 0;
    transition: height 0ms 400ms, opacity 400ms 0ms;
}
#selector.visible {
    height: auto; opacity: 1;
    transition: height 0ms 0ms, opacity 600ms 0ms;
}

Allora, cosa sta succedendo qui?

  1. Quando visibleviene aggiunta la classe, entrambi heighte opacityavviano l'animazione senza indugio (0 ms), anche se heightimpiega 0 ms per completare l'animazione (equivalente di display: block) e opacityimpiega 600 ms.

  2. Quando la visibleclasse viene rimossa, opacityavvia l'animazione (ritardo 0 ms, durata 400 ms) e l'altezza attende 400 ms e solo allora immediatamente (0 ms) ripristina il valore iniziale (equivalente display: nonenel callback di animazione).

Nota, questo approccio è migliore di quelli che usano visibility. In tali casi, l'elemento occupa ancora lo spazio sulla pagina e non è sempre adatto.

Per ulteriori esempi, consultare questo articolo .


8
sorpreso che questo non abbia più voti - questa soluzione intelligente in qualche modo funziona perfettamente.
fanfara

3
Funziona solo con il height:100%quale può distruggere il layout in alcuni casi. Ottima soluzione, se questo non è un problema. Uno dei pochi a lavorare bidirezionale.
Fabian von Ellerts,

Questo è fantastico! Sono stato in grado di semplificarlo ulteriormente nel mio caso perché volevo che il tempo di animazione in dissolvenza fosse uguale al tempo di dissolvenza in apertura. Invece di usare transition: height 0ms 0ms, opacity 600ms 0ms, ho appena usato transition-delay: 0s.
Jacob Lockard,

52

display non è una delle proprietà su cui funziona la transizione.

Consulta Proprietà CSS animabili per l'elenco delle proprietà CSS a cui possono essere applicate transizioni. Vedi Modulo e valori CSS Modulo 4, Combinazione di valori: interpolazione, aggiunta e accumulazione per come sono interpolati.

Fino a CSS 3 è stato elencato in 9.1. Proprietà dal CSS (basta chiudere il popup di avviso)

Ho anche provato ad usare l'altezza, ma questo è fallito miseramente.

L'ultima volta che ho dovuto farlo, ho usato max-heightinvece, che è una proprietà animabile (anche se era un po 'un hack, ha funzionato), ma attenzione che potrebbe essere molto janky per pagine complesse o utenti con dispositivi mobili di fascia bassa dispositivi.


Il collegamento non punta più direttamente alla sezione delle proprietà animabili.
Andrew Lam,

1
@AndrewLam Risolto. Grazie.
robocat,

34

Ora puoi aggiungere un'animazione personalizzata alla proprietà del blocco.

@keyframes showNav {
  from {opacity: 0;}
  to {opacity: 1;}
}
.subnav-is-opened .main-nav__secondary-nav {
  display: block;
  animation: showNav 250ms ease-in-out both;
}

dimostrazione

In questa demo i cambiamenti del menu secondario da display:nonea display:blocke riesce ancora a svanire.


Dovrebbe myfirstessere showNavqui? E che dire di Firefox? Purtroppo non riesco a trovare qualcosa di correlato sulla pagina demo che stai citando.
Sebastian vom Meer,

Grazie @SebastianG. Ho apportato la correzione e aggiunto alcune informazioni aggiuntive sopra.
Manish Pradhan,

@Sebastian vom Meer: le versioni precedenti di Firefox necessitano del prefisso "-moz-", vedere il codice modificato
Herr_Schwabullek,

23
A meno che non mi manchi qualcosa, il link "demo" non mostra più una transizione al sottomenu.
Realistico

1
La transizione corretta per qualcosa che non occupa spazio (come nel caso di display: none) a qualcosa che occupa spazio (display: block), è un'espansione delle dimensioni, non una dissolvenza. Se fosse una questione di visibilità nascosta (che occupa spazio ma non è visibile) a visibile, la dimensione rimane invariata e una dissolvenza in entrata è appropriata. Nessuna di queste risposte risolve il problema.
Triynko,

21

Secondo il Working Working Draft del W3C, il 19 novembre 2013 display non è una proprietà animabile . Fortunatamente, visibilityè animabile. Puoi concatenare la sua transizione con una transizione di opacità ( JSFiddle ):

  • HTML:

    <a href="http://example.com" id="foo">Foo</a>
    <button id="hide-button">Hide</button>
    <button id="show-button">Show</button>
  • CSS:

    #foo {
        transition-property: visibility, opacity;
        transition-duration: 0s, 1s;
    }
    
    #foo.hidden {
        opacity: 0;
        visibility: hidden;
        transition-property: opacity, visibility;
        transition-duration: 1s, 0s;
        transition-delay: 0s, 1s;
    }
  • JavaScript per il test:

    var foo = document.getElementById('foo');
    
    document.getElementById('hide-button').onclick = function () {
        foo.className = 'hidden';
    };
    
    document.getElementById('show-button').onclick = function () {
        foo.className = '';
    };

Nota che se rendi il collegamento trasparente, senza impostazione visibility: hidden, rimarrebbe selezionabile.


1
non vedo alcuna transizione nell'esempio jsfiddle
Gino,

@Gino l'ho risolto cambiando 0in 0s. Apparentemente, in passato il browser che ho usato per il test ha supportato zero unità senza unità. Tuttavia, i tempi senza unità non fanno parte della raccomandazione del candidato W3C del 29 settembre 2016 .
febbraio

Questo dovrebbe essere votato di più. Ho trovato che fosse una delle migliori soluzioni.
Arthur Tarasov,

L'uso del ritardo è la migliore logica per capire come funziona. Animare e nascondere. Scopri e anima. Soluzione perfetta per me
Bruno Pitteli Gonçalves,

15

Modifica: display none non viene applicato in questo esempio.

@keyframes hide {
  0% {
    display: block;
    opacity: 1;
  }
  99% {
    display: block;
  }
  100% {
    display: none;
    opacity: 0;
  }
}

Ciò che sta accadendo sopra è che attraverso il 99% della visualizzazione dell'animazione è impostato per bloccare mentre l'opacità si attenua. Nell'ultimo momento la proprietà display è impostata su none.

E il bit più importante è mantenere l'ultimo fotogramma dopo che l'animazione termina usando la modalità di riempimento animazione: avanti

.hide {
   animation: hide 1s linear;
   animation-fill-mode: forwards;
}

Ecco due esempi: https://jsfiddle.net/qwnz9tqg/3/


con questa soluzione display: nonenon funziona allora?
Bart Calixto,

Dovrebbe essere "animazione-modalità-riempimento: avanti" non "avanti"
Alex

Le modifiche devono essere di sei caratteri e posso solo suggerire di modificare quindi il commento
Alex

1
@Alex Ok. Errore di battitura. La cosa interessante è che la mia risposta non funziona nemmeno come previsto, ma è logico pensare che lo farebbe, quindi lo terrò finché i browser non lo supporteranno.
Pawel,

3
Come puoi vedere in questo violino con i cursori impostati, display: nonenon viene mai effettivamente implementato. jsfiddle.net/3e6sduqh
robstarbuck,

14

Il mio trucco JavaScript pulito è quello di separare l'intero scenario in due diverse funzioni !

Per preparare le cose, viene dichiarata una variabile globale e viene definito un gestore eventi:

  var tTimeout;
  element.addEventListener("transitionend", afterTransition, true);//firefox
  element.addEventListener("webkitTransitionEnd", afterTransition, true);//chrome

Quindi, quando nascondo l'elemento, uso qualcosa del genere:

function hide(){
  element.style.opacity = 0;
}

function afterTransition(){
  element.style.display = 'none';
}

Per riapparire l'elemento, sto facendo qualcosa del genere:

function show(){
  element.style.display = 'block';
  tTimeout = setTimeout(timeoutShow, 100);
}

function timeoutShow(){
  element.style.opacity = 1;
}

Funziona, finora!


Questo funziona a causa del ritardo e non perché i comandi javascript sono in funzioni separate. I ritardi sembrano essere una buona soluzione in molti casi :)

10

Mi sono imbattuto in questo oggi, con un position: fixedmodale che stavo riutilizzando. Non riuscivo a mantenerlo display: nonee poi ad animarlo, dato che era appena apparso, ed ez-index (valori negativi, ecc.) Ha fatto anche cose strane.

Stavo anche usando un height: 0to height: 100%, ma ha funzionato solo quando è apparso il modale. È lo stesso che se avessi usatoleft: -100% o qualcosa del genere.

Poi mi è sembrato che ci fosse una risposta semplice. Et voilà:

Innanzitutto, il tuo modale nascosto. Si noti che heightè 0, e controlla la heightdichiarazione nelle transizioni ... ha una 500ms, che è più lunga della mia opacitytransizione . Ricorda, questo influisce sulla transizione in dissolvenza in uscita: riportare il modale al suo stato predefinito.

#modal-overlay {
    background: #999;
    background: rgba(33,33,33,.2);
    display: block;
    overflow: hidden;
    height: 0;
    width: 100%;
    position: fixed;
    top: 0;
    left: 0;
    opacity: 0;
    z-index: 1;
    -webkit-transition: height 0s 500ms, opacity 300ms ease-in-out;
       -moz-transition: height 0s 500ms, opacity 300ms ease-in-out;
            -ms-transition: height 0s 500ms, opacity 300ms ease-in-out;
         -o-transition: height 0s 500ms, opacity 300ms ease-in-out;
        transition: height 0s 500ms, opacity 300ms ease-in-out;
}

Secondo, il tuo modale visibile. Di 'che stai impostando un .modal-activea body. Ora lo heightè 100%e anche la mia transizione è cambiata. Voglio heightche sia immediatamente cambiato e che lo opacityprenda 300ms.

.modal-active #modal-overlay {
    height: 100%;
    opacity: 1;
    z-index: 90000;
    -webkit-transition: height 0s, opacity 300ms ease-in-out;
       -moz-transition: height 0s, opacity 300ms ease-in-out;
        -ms-transition: height 0s, opacity 300ms ease-in-out;
         -o-transition: height 0s, opacity 300ms ease-in-out;
            transition: height 0s, opacity 300ms ease-in-out;
}

Ecco fatto, funziona come un fascino.


Upgrade per il tuo stile di allineamento delle proprietà con prefisso del fornitore 👍
George Green,

9

Prendendo da alcune di queste risposte e alcuni suggerimenti altrove, il seguente funziona alla grande per i menu al passaggio del mouse (sto usando questo con Bootstrap  3, in particolare):

nav .dropdown-menu {
    display: block;
    overflow: hidden;
    max-height: 0;
    opacity: 0;
    transition: max-height 500ms, opacity 300ms;
    -webkit-transition: max-height 500ms, opacity 300ms;
}
nav .dropdown:hover .dropdown-menu {
    max-height: 500px;
    opacity: 1;
    transition: max-height 0, opacity 300ms;
    -webkit-transition: max-height 0, opacity 300ms;
}

È inoltre possibile utilizzare heightal posto di max-heightse si specificano entrambi i valori poiché height:autonon è consentito con transitions. Il valore al passaggio del mouse max-heightdeve essere maggiore di quello heightdel menu.


3
È un bel trucco ma c'è un difetto. Il tempo di transizione dipende dall'altezza. Se ci sono più menu con altezza variabile, quegli elementi con altezza più vicina all'altezza massima si animerebbero bene. Tuttavia, quelli più corti si animerebbero troppo velocemente, offrendo un'esperienza incoerente.
utente

8

Ho trovato il modo migliore per questo problema, puoi usare l'animazione CSS e creare il tuo fantastico effetto per mostrare gli oggetti.

    .item {
     display: none;
}

.item:hover {
     display: block;
     animation: fade_in_show 0.5s
}

@keyframes fade_in_show {
     0% {
          opacity: 0;
          transform: scale(0)
     }
     100% {
          opacity: 1;
          transform: scale(1)
     }
}

Grazie per questo utile suggerimento. Funziona perfettamente.
Sedat Kumcu,

6

Ho riscontrato questo problema più volte e ora sono andato semplicemente con:

.block {
  opacity: 1;
  transition: opacity 250ms ease;
}

.block--invisible {
  pointer-events: none;
  opacity: 0;
}

Aggiungendo la classe, block--invisiblegli elementi interi non saranno cliccabili, ma tutti gli elementi dietro saranno a causa del fatto pointer-events:noneche è supportato da tutti i principali browser (no IE <11).


Puoi metterlo in un esempio, per favore?
GarethAS,

1
Funziona bene, ma va notato che gli eventi puntatore non funzionano con IE inferiore a 11
user1702965

aggiunta nota per IE sotto 11
DominikAngerer

Se hai bisogno di avere detto l'elemento in cima a tutto (ad esempio un menu) questo è onestamente il modo più pulito per farlo ora che nel 2019 il supporto è solido perpointer-events
Josh Davenport

5

Cambia overflow:hiddenin overflow:visible. Funziona meglio Io uso così:

#menu ul li ul {
    background-color:#fe1c1c;
    width:85px;
    height:0px;
    opacity:0;
    box-shadow:1px 3px 10px #000000;
    border-radius:3px;
    z-index:1;
    -webkit-transition:all 0.5s ease;
    -moz-transition:all 0.6s ease;
}

#menu ul li:hover ul  {
    overflow:visible;
    opacity:1;
    height:140px;
}

visibleè meglio perché overflow:hiddenagire esattamente come un display:none.


Questo era il biglietto per me. Grazie!
Dan Loewenherz,

5

JavaScript non è richiesto e non è necessaria alcuna altezza massima esageratamente enorme. Invece, imposta il tuo max-heightsui tuoi elementi di testo e usa un'unità relativa al font come remoem . In questo modo, puoi impostare un'altezza massima maggiore del contenitore, evitando ritardi o "scoppiettii" alla chiusura del menu:

HTML

<nav>
  <input type="checkbox" />
  <ul>
    <li>Link 1</li>
    <li>Link 1</li>
    <li>Link 1</li>
    <li>Link 1</li>
  </ul>
</nav>

CSS

nav input + ul li { // Notice I set max-height on li, not ul
   max-height: 0;
}

nav input:checked + ul li {
   max-height: 3rem; // A little bigger to allow for text-wrapping - but not outrageous
}

Vedi un esempio qui: http://codepen.io/mindfullsilence/pen/DtzjE


Simile a questo è possibile impostare l'altezza della linea sul testo e trasformarlo in zero. Se all'interno contiene solo testo, questo nasconderà il contenitore.
vicmortelmans,

Perché così pochi voti? Questa è davvero una buona risposta e potrebbe essere quella che uso.
mwilcox,

@mwilcox Perché utilizza un'altezza fissa, il che è negativo quando si lavora con contenuto dinamico (anche un'altezza stimata). Ed è utile solo sul contenuto del testo.
Fabian von Ellerts,

5

Dopo che è stata scritta la risposta accettata da Guillermo, le specifiche di transizione CSS del 03-04-2012 hanno cambiato il comportamento della transizione di visibilità e ora è possibile risolvere questo problema in modo più breve , senza l'uso del ritardo di transizione:

.myclass > div {
                   transition:visibility 1s, opacity 1s;
                   visibility:hidden;  opacity:0
               }
.myclass:hover > div
               {   visibility:visible; opacity:1 }

Il tempo di esecuzione specificato per entrambe le transizioni dovrebbe essere generalmente identico (sebbene un tempo leggermente più lungo per la visibilità non sia un problema).

Per una versione in esecuzione, vedere il mio post sul blog Visibilità di transizione CSS .

Scritto il titolo della domanda "Transizioni sul display: proprietà" e in risposta ai commenti di Rui Marques e josh alla risposta accettata:

Questa soluzione funziona nei casi in cui è irrilevante se viene utilizzata la proprietà display o di visibilità (come probabilmente è stato il caso in questa domanda).

Non rimuoverà completamente l'elemento come display:none, lo renderà semplicemente invisibile, ma rimarrà comunque nel flusso del documento e influenzerà la posizione dei seguenti elementi.

Le transizioni che rimuovono completamente l'elemento simile a display:nonepossono essere eseguite usando height (come indicato da altre risposte e commenti), max-height o margin-top / bottom, ma vedi anche Come posso spostare l'altezza: 0; all'altezza: auto; usando CSS? e il mio post sul blog Soluzioni alternative per le transizioni CSS nelle proprietà di visualizzazione e altezza .

In risposta al commento di GeorgeMillo: Sono necessarie entrambe le proprietà e entrambe le transizioni: la proprietà di opacità viene utilizzata per creare un'animazione di dissolvenza in entrata e in uscita e la proprietà di visibilità per evitare che l'elemento continui a reagire sugli eventi del mouse. Sono necessarie transizioni sull'opacità dell'effetto visivo e sulla visibilità per ritardare il nascondimento fino al termine della dissolvenza.


4

Alla fine ho trovato una soluzione per me, combinando opacitycon position absolute(non occupare spazio quando nascosto).

.toggle {
  opacity: 0;
  position: absolute;
  transition: opacity 0.8s;
}

.parent:hover .toggle {
  opacity: 1;
  position: static;
}

4

Sospetto che chiunque abbia appena iniziato le transizioni CSS scopre rapidamente che non funzionano se si modifica la proprietà di visualizzazione (blocco / nessuna) allo stesso tempo. Una soluzione alternativa che non è stata ancora menzionata è che puoi continuare a utilizzare display:block/noneper nascondere / mostrare l'elemento, ma impostane l'opacità su 0 in modo che anche quando èdisplay:block , è ancora invisibile.

Quindi per sfumarlo, aggiungi un'altra classe CSS come "on" che imposta l'opacità su 1 e definisce la transizione per l'opacità. Come avrai immaginato, dovrai usare JavaScript per aggiungere quella classe "on" all'elemento, ma almeno stai ancora usando CSS per la transizione effettiva.

PS Se ti trovi in ​​una situazione in cui devi fare entrambe le cose display:blocke aggiungi la classe "on", allo stesso tempo, differisci quest'ultima usando setTimeout. Altrimenti, il browser vede semplicemente entrambe le cose accadere contemporaneamente e disabilita la transizione.


Eccellente grazie! Ho scritto un'altra risposta con un esempio che funziona davvero display:none.
Mojuba,

4

È semplice come il seguente :)

@keyframes fadeout {
    0% { opacity: 1; height: auto; }
    90% { opacity: 0; height: auto; }
    100% { opacity: 0; height: 0;
}
animation: fadeout linear 0.5s 1 normal forwards !important;

Fallo sparire e poi fallo height 0;. Assicurati anche di usare i forward in modo che rimanga nello stato finale.


Ciò si ripristinerebbe all'istante quando si rimuove la classe, quindi non è una buona idea
Sean T

2

Questa soluzione ha un'eccellente compatibilità e non l'ho ancora vista:

.hidden-element {
  position: absolute;
  z-index: -1;
  pointer-events: none;
  visibility: hidden;
  opacity: 0;
  transition: visibility 0s, opacity .5s ease-out;
}

.hidden-element.visible {
  position: static;
  z-index: auto;
  pointer-events: auto;
  visibility: visible;
  opacity: 1;
}

Spiegazione : utilizza il visibility: hiddentrucco (che è compatibile con "mostra e anima" in un solo passaggio), ma utilizza la combinazione position: absolute; z-index: -1; pointer-events: none;per assicurarsi che il contenitore nascosto non occupi spazio e non risponda alle interazioni dell'utente .


1
Ma il cambio di positionstill farà sussultare l'elemento, no?
Arsylum,

Bene, certo: position: absolutesignifica che l'elemento non occupa spazio, come descritto nella spiegazione. Quando passa a position: statice appare, occuperà spazio come un elemento normale, che è il punto di questa domanda. Ti consiglio di provarlo!
Christophe Marois,

2
L'ho fatto. Ma se ho capito bene la domanda riguardava le transizioni . Come in "animazioni fluide".
Arsylum,

2

Puoi farlo funzionare nel modo naturale che ti aspettavi - usando display - ma devi limitare il browser per farlo funzionare, usando Javascript o come altri hanno suggerito un trucco di fantasia con un tag all'interno di un altro. Non mi interessa il tag interno in quanto complica ulteriormente CSS e dimensioni, quindi ecco la soluzione Javascript:

https://jsfiddle.net/b9chris/hweyecu4/17/

A partire da una scatola come:

<div id="box" class="hidden">Lorem</div>

Una scatola nascosta

div.hidden {
    display: none;
}
#box {
    transition: opacity 1s;
}

Utilizzeremo un trucco trovato in una q / a correlata, controllando offsetHeight per limitare istantaneamente il browser:

https://stackoverflow.com/a/16575811/176877

Innanzitutto, una libreria che formalizza il trucco di cui sopra:

$.fn.noTrnsn = function () {
    return this.each(function (i, tag) {
        tag.style.transition = 'none';
    });
};
$.fn.resumeTrnsn = function () {
    return this.each(function (i, tag) {
        tag.offsetHeight;    
        tag.style.transition = null;
    });
};

Successivamente, lo useremo per rivelare una scatola e per sbiadirla in:

$('#button').on('click', function() {
    var tag = $('#box');
    if (tag.hasClass('hidden'))
        tag.noTrnsn().removeClass('hidden')
        .css({ opacity: 0 })
        .resumeTrnsn().css({ opacity: 1 });
    else
        tag.css({ opacity: 0 });
});

Questo sfuma la scatola dentro e fuori. Quindi, .noTrnsn()si spegne transizioni, quindi togliamo il hiddenclasse, che gira displayda nonealla sua impostazione predefinita, block. Quindi impostiamo l'opacità su 0 per prepararci a sfumare. Ora che abbiamo impostato il palcoscenico, riaccendiamo le transizioni, con.resumeTrnsn() . E infine, avvia la transizione impostando l'opacità su 1.

Senza la libreria, sia la modifica da visualizzare sia la modifica all'opacità avrebbero ottenuto risultati indesiderati. Se avessimo semplicemente rimosso le chiamate in libreria, non avremmo alcuna transizione.

Si noti che quanto sopra non imposta nuovamente la visualizzazione su nessuno al termine dell'animazione di dissolvenza. Possiamo diventare più fantasiosi però. Facciamolo con uno che sfuma e cresce in altezza da 0.

Fantasia!

https://jsfiddle.net/b9chris/hweyecu4/22/

#box {
    transition: height 1s, opacity 1s;
}

Ora stiamo passando sia all'altezza che all'opacità. Si noti che non stiamo regolazione dell'altezza, il che significa che è il default, auto. Convenzionalmente questo non può essere trasferito: passare da auto a un valore di pixel (come 0) non ti porterà a nessuna transizione. Lavoreremo su questo con la libreria e un altro metodo di libreria:

$.fn.wait = function (time, fn) {
    if (time)
        this.delay(time);
    if (!fn)
        return this;

    var _this = this;
    return this.queue(function (n) {
        fn.call(_this);
        n();
    });
};

Questo è un metodo pratico che ci consente di partecipare alla coda fx / animazione esistente di jQuery, senza richiedere alcun framework di animazione che ora è escluso in jQuery 3.x. Non ho intenzione di spiegare come funziona jQuery, ma basti dire, l' .queue()e .stop()idraulico che jQuery fornisce aiutarci a prevenire le nostre animazioni da salire sulla vicenda.

Animiamo l'effetto slide down.

$('#button').on('click', function() {
    var tag = $('#box');
    if (tag.hasClass('hidden')) {
        // Open it
        // Measure it
        tag.stop().noTrnsn().removeClass('hidden').css({
            opacity: 0, height: 'auto'
        });
        var h = tag.height();
        tag.css({ height: 0 }).resumeTrnsn()
        // Animate it
        .css({ opacity: 1, height: h })
        .wait(1000, function() {
            tag.css({ height: 'auto' });
        });
    } else {
        // Close it
        // Measure it
        var h = tag.noTrnsn().height();
        tag.stop().css({ height: h })
        .resumeTrnsn()
        // Animate it
        .css({ opacity: 0, height: 0 })
        .wait(1000, function() {
            tag.addClass('hidden');
        });
    }
});

Questo codice inizia controllando #boxe se è attualmente nascosto, controllando la sua classe. Ma realizza di più usando la wait()chiamata in libreria, aggiungendo ilhidden classe alla fine dell'animazione di slideout / fade, che ti aspetteresti di trovare se fosse effettivamente nascosta - qualcosa che l'esempio più semplice sopra non potrebbe fare. Ciò accade anche per consentire di visualizzare / nascondere l'elemento più e più volte, che era un bug nell'esempio precedente, perché la classe nascosta non è mai stata ripristinata.

Puoi anche vedere i CSS e i cambi di classe che vengono chiamati dopo .noTrnsn()per impostare generalmente il palcoscenico per le animazioni, incluso prendere misurazioni, come misurare quale sarà l'altezza finale #boxsenza mostrarla all'utente, prima di chiamare.resumeTrnsn() e animarlo da quel set completo tappa al suo obiettivo valori CSS.

Vecchia risposta

https://jsfiddle.net/b9chris/hweyecu4/1/

Puoi farlo passare con un clic con:

function toggleTransition() {
  var el = $("div.box1");

  if (el.length) {
    el[0].className = "box";
    el.stop().css({maxWidth: 10000}).animate({maxWidth: 10001}, 2000, function() {
        el[0].className = "box hidden";
    });
  } else {
    el = $("div.box");
    el[0].className = "box";
    el.stop().css({maxWidth: 10001}).animate({maxWidth: 10000}, 50, function() {
        el[0].className = "box box1";
    });
  }

  return el;
}

someTag.click(toggleTransition);

Il CSS è quello che indovineresti:

.hidden {
    display: none;
}
.box {
    width: 100px;
    height: 100px;
    background-color: blue;
    color: yellow;
    font-size: 18px;
    left: 20px;
    top: 20px;
    position: absolute;
    -webkit-transform-origin: 0 50%;
    transform-origin: 0 50%;
    -webkit-transform: scale(.2);
    transform: scale(.2);
    -webkit-transition: transform 2s;
    transition: transform 2s;
}
.box1{
    -webkit-transform: scale(1);
    transform: scale(1);
}

La chiave sta limitando la proprietà display. Rimuovendo la classe nascosta e quindi aspettando 50 ms, quindi avviando la transizione tramite la classe aggiunta, otteniamo che appaia e poi si espanda come volevamo, invece di passare semplicemente sullo schermo senza alcuna animazione. Simile si verifica nell'altro modo, tranne per il fatto che attendiamo che l'animazione sia terminata prima di applicare nascosto.

Nota: sto abusando .animate(maxWidth)qui per evitare le setTimeoutcondizioni di gara. setTimeoutè rapido introdurre bug nascosti quando tu o qualcun altro raccogliete il codice inconsapevolmente. .animate()può essere facilmente ucciso con .stop(). Lo sto solo usando per mettere un ritardo di 50 ms o 2000 ms nella coda fx standard in cui è facile trovare / risolvere altri programmatori che si basano su questo.


1

Ho avuto un problema simile a cui non sono riuscito a trovare la risposta. Alcune ricerche di Google in seguito mi hanno portato qui. Considerando che non ho trovato la risposta semplice che speravo, mi sono imbattuto in una soluzione che è sia elegante che efficace.

Si scopre che la visibilityproprietà CSS ha un valore collapseche viene generalmente utilizzato per gli elementi della tabella. Tuttavia, se utilizzato su altri elementi, li rende effettivamente nascosti , praticamente come display: hiddense con l'abilità aggiunta che l'elemento non occupa spazio e puoi comunque animare l'elemento in questione.

Di seguito è riportato un semplice esempio di questo in azione.

function toggleVisibility() {
  let exampleElement = document.querySelector('span');
  if (exampleElement.classList.contains('visible')) {
    return;
  }
  exampleElement.innerHTML = 'I will not take up space!';
  exampleElement.classList.toggle('hidden');
  exampleElement.classList.toggle('visible');
  setTimeout(() => {
    exampleElement.classList.toggle('visible');
    exampleElement.classList.toggle('hidden');
  }, 3000);
}
#main {
  display: flex;
  flex-direction: column;
  width: 300px;
  text-align: center;
}

.hidden {
  visibility: collapse;
  opacity: 0;
  transition: visibility 2s, opacity 2s linear;
}

.visible {
  visibility: visible;
  opacity: 1;
  transition: visibility 0.5s, opacity 0.5s linear;
}
<div id="main">
  <button onclick="toggleVisibility()">Click Me!</button>
  <span class="hidden"></span>
  <span>I will get pushed back up...</span>
</div>


1

La soluzione universale più semplice al problema è: sentiti libero di specificare display:nonenel tuo CSS, tuttavia dovrai cambiarlo in block(o qualsiasi altra cosa) usando JavaScript, quindi dovrai anche aggiungere una classe al tuo elemento in questione che in realtà esegue la transizione con setTimeout () . È tutto.

Vale a dire:

<style>
    #el {
        display: none;
        opacity: 0;
    }
    #el.auto-fade-in {
        opacity: 1;
        transition: all 1s ease-out; /* Future, future, please come sooner! */
        -webkit-transition: all 1s ease-out;
        -moz-transition: all 1s ease-out;
        -o-transition: all 1s ease-out;
    }
</style>

<div id=el>Well, well, well</div>

<script>
    var el = document.getElementById('el');
    el.style.display = 'block';
    setTimeout(function () { el.className = 'auto-fade-in' }, 0);
</script>

Questo è stato testato negli ultimi browser sani di mente. Ovviamente non dovrebbe funzionare in Internet Explorer 9 o versioni precedenti.


1

Penso che SalmanPK abbia la risposta più vicina. Fa sbiadire un oggetto dentro o fuori, con le seguenti animazioni CSS. Tuttavia, la proprietà display non si anima in modo uniforme, ma solo l'opacità.

@-webkit-keyframes fadeIn {
    from { opacity: 0; }
      to { opacity: 1; }
}

@-webkit-keyframes fadeOut {
    from { opacity: 1; }
      to { opacity: 0; }
}

Se vuoi animare l'elemento che si sposta dal blocco di visualizzazione per non visualizzarne nessuno, non riesco a vedere che attualmente è possibile solo con CSS. Devi ottenere l'altezza e utilizzare un'animazione CSS per ridurla. Questo è possibile con CSS come mostrato nell'esempio seguente, ma sarebbe difficile conoscere gli esatti valori di altezza che è necessario animare per un elemento.

Esempio jsFiddle

CSS

@-webkit-keyframes pushDown {
  0% {
    height: 10em;
  }
  25% {
    height: 7.5em;
  }
  50% {
    height: 5em;
  }
  75% {
    height: 2.5em;
  }
  100% {
    height: 0em;
  }
}

.push-down {
    -webkit-animation: pushDown 2s forwards linear;
}

JavaScript

var element = document.getElementById("element");

// Push item down
element.className = element.className + " push-down";

1

Puoi farlo con eventi di transizione, quindi costruisci due classi CSS per la transizione, una contenente l'animazione e l'altra che non mostra alcuno stato. E li cambi dopo che l'animazione è terminata? Nel mio caso posso visualizzare nuovamente i div se premo un pulsante e rimuovo entrambe le classi.

Prova lo snippet di seguito ...

$(document).ready(function() {
  // Assign transition event
  $("table").on("animationend webkitAnimationEnd", ".visibility_switch_off", function(event) {
    // We check if this is the same animation we want
    if (event.originalEvent.animationName == "col_hide_anim") {
      // After the animation we assign this new class that basically hides the elements.
      $(this).addClass("animation-helper-display-none");
    }

  });

  $("button").click(function(event) {

    $("table tr .hide-col").toggleClass(function() {
      // We switch the animation class in a toggle fashion...
      // and we know in that after the animation end, there
      // is will the animation-helper-display-none extra
      // class, that we nee to remove, when we want to
      // show the elements again, depending on the toggle
      // state, so we create a relation between them.
      if ($(this).is(".animation-helper-display-none")) {
        // I'm toggling and there is already the above class, then
        // what we want it to show the elements , so we remove
        // both classes...
        return "visibility_switch_off animation-helper-display-none";
      }
      else {
        // Here we just want to hide the elements, so we just
        // add the animation class, the other will be added
        // later be the animationend event...
        return "visibility_switch_off";
      }
    });
  });
});
table th {
  background-color: grey;
}

table td {
  background-color: white;
  padding: 5px;
}

.animation-helper-display-none {
  display: none;
}

table tr .visibility_switch_off {
  animation-fill-mode: forwards;
  animation-name: col_hide_anim;
  animation-duration: 1s;
}

@-webkit-keyframes col_hide_anim {
  0% {opacity: 1;}
  100% {opacity: 0;}
}

@-moz-keyframes col_hide_anim {
  0% {opacity: 1;}
  100% {opacity: 0;}
}

@-o-keyframes col_hide_anim {
  0% {opacity: 1;}
  100% {opacity: 0;}
}

@keyframes col_hide_anim {
  0%   {opacity: 1;}
  100% {opacity: 0;}
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<table>
  <theader>
    <tr>
      <th>Name</th>
      <th class='hide-col'>Age</th>
      <th>Country</th>
    </tr>
  </theader>
  <tbody>
    <tr>
      <td>Name</td>
      <td class='hide-col'>Age</td>
      <td>Country</td>
    </tr>
  </tbody>
</table>

<button>Switch - Hide Age column with fadeout animation and display none after</button>


0

Se stai usando jQuery per impostare le tue classi, funzionerà al 100%:

$(document).ready(function() {
  $('button').click(function() {
    var container = $('.container');
    
    if (!container.hasClass('active')) {
      container.addClass('show').outerWidth();
      container.addClass('active');
    }
    else {
      container.removeClass('active').one('transitionend', function() {
        container.removeClass('show');
      });
    }
  });
});
.container {
  display: none;
  opacity: 0;
  transition: opacity 0.3s ease;
}

.container.show {
  display: flex;
}
 
.container.active {
  opacity: 1;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<button type="button">Toggle</button>

<div class="container">
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
</div>

Ovviamente potresti semplicemente usare jQuery .fadeIn()e le .fadeOut()funzioni, ma il vantaggio di impostare le classi invece è nel caso in cui desideri passare a un valore di visualizzazione diverso da block(come è il default con .fadeIn()e .fadeOut()).

Qui sto passando al display flexcon un piacevole effetto di dissolvenza.


0

Invece di utilizzarlo, displayè possibile memorizzare l'elemento "fuori schermo" fino a quando non è necessario, quindi impostarne la posizione nel punto desiderato e trasformarlo allo stesso tempo. Ciò comporta una serie di altri problemi di progettazione, quindi il tuo chilometraggio può variare.

Probabilmente non vorrai displaycomunque utilizzarlo , in quanto vorresti che il contenuto fosse accessibile agli screen reader, che per la maggior parte cerca di obbedire alle regole di visibilità - cioè, se non dovrebbe essere visibile alla vista, non verrà visualizzato come contenuto per l'agente.


0

Puoi semplicemente usare la visibilità CSS : nascosto / visibile invece di display : nessuno / blocco

div {
    visibility:hidden;
    -webkit-transition: opacity 1s ease-out;
    -moz-transition: opacity 1s ease-out;
    -o-transition: opacity 1s ease-out;
    transition: opacity 1s ease-out;
    opacity: 0;
}

parent:hover > div {
    opacity: 1;
    visibility: visible;
}

5
Questo però riserva lo spazio, lasciando un buco vuoto. Se vuoi comprimere uno spazio devi animare l'altezza o qualche altra proprietà.
Marcy Sutton,

0

Ho iniziato un progetto scheletro open source chiamato Toggle Display Animate .

Questo aiutante scheletro ti permetterà di imitare facilmente lo show / hide di jQuery, ma con animazioni di transizione CSS 3 in / out.

Usa i toggle di classe in modo da poter usare qualsiasi metodo CSS che desideri sugli elementi oltre a display: none | block | table | inline, ecc. Così come altri usi alternativi che possono essere pensati.

Il suo scopo principale di progettazione è per gli stati di attivazione / disattivazione degli elementi e supporta uno stato di ripristino in cui nascondere l'oggetto consente di eseguire il fotogramma chiave al contrario o riprodurre un'animazione alternativa per nascondere l'elemento.

La maggior parte del markup per il concetto su cui sto lavorando è CSS, e in realtà c'è pochissimo JavaScript effettivamente utilizzato.

C'è una demo qui: http://marcnewton.co.uk/projects/toggle-display-animate/

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.