Stenografia di transizione CSS con più proprietà?


519

Non riesco a trovare la sintassi corretta per la scorciatoia di transizione CSS con più proprietà. Questo non fa nulla:

.element {
  -webkit-transition: height .5s, opacity .5s .5s;
     -moz-transition: height .5s, opacity .5s .5s;
      -ms-transition: height .5s, opacity .5s .5s;
          transition: height .5s, opacity .5s .5s;
  height: 0;
  opacity: 0;
  overflow: 0;
}
.element.show {
  height: 200px;
  opacity: 1;
}

Aggiungo la classe show con javascript. L'elemento diventa più alto e visibile, semplicemente non passa. Test negli ultimi Chrome, FF e Safari.

Che cosa sto facendo di sbagliato?

EDIT: Giusto per essere chiari, sto cercando la versione abbreviata per ridimensionare il mio CSS. È abbastanza gonfio con tutti i prefissi del fornitore. Inoltre ha ampliato il codice di esempio.


2
Controlla questa documentazione. developer.mozilla.org/en/CSS/CSS_transitions
websymphony

3
In realtà cambi i valori di altezza e opacità? Altrimenti non cambiano
yunzen

Non sono troppo esperto con le transizioni CSS: i .5svalori doppi sono opacityprevisti dopo ?
BoltClock

La documentazione non fornisce un esempio per l'utilizzo della versione abbreviata con più proprietà. L'altezza varia da 0 a 200 px, l'opacità da 0 a 1. Il secondo .5s è un ritardo sulla transizione dell'opacità. Voglio che un elemento cresca in altezza, e quando è finito, dissolvilo.
Gregory Bolkenstijn

2
Ah sì, il valore del ritardo.
BoltClock

Risposte:


752

Sintassi:

transition: <property> || <duration> || <timing-function> || <delay> [, ...];

Si noti che la durata deve precedere il ritardo, se quest'ultimo è specificato.

Transizioni individuali combinate in dichiarazioni stenografiche:

-webkit-transition: height 0.3s ease-out, opacity 0.3s ease 0.5s;
-moz-transition: height 0.3s ease-out, opacity 0.3s ease 0.5s;
-o-transition: height 0.3s ease-out, opacity 0.3s ease 0.5s;
transition: height 0.3s ease-out, opacity 0.3s ease 0.5s;

O semplicemente trasferiscili tutti:

-webkit-transition: all 0.3s ease-out;
-moz-transition: all 0.3s ease-out;
-o-transition: all 0.3s ease-out;
transition: all 0.3s ease-out;

Ecco un esempio semplice . Eccone un altro con la proprietà delay .


Modifica: precedentemente elencati qui erano le compatibilità e problemi noti riguardanti transition. Rimosso per leggibilità.

In conclusione: basta usarlo. La natura di questa proprietà è ininterrotta per tutte le applicazioni e la compatibilità è ora ben superiore al 94% a livello globale.

Se vuoi ancora essere sicuro, fai riferimento a http://caniuse.com/css-transitions


1
Hai provato questo? Non funziona per me. Inoltre non riesco a utilizzare la proprietà all in quanto ho un ritardo sulla seconda proprietà.
Gregory Bolkenstijn,

3
Ci sono delle prestazioni / memoria / altre implicazioni da usare allinvece di elencare le proprietà specifiche? Ad esempio, se sto pianificando la transizione backgrounde colorsolo - sto meglio specificando entrambi o semplicemente usando all? Inoltre, dato che IE6-9 non supporta le transizioni e IE10 le supporta in modo non prefissato, c'è qualche vantaggio / svantaggio nell'includere le ms-transition:direttive?
mattstuehler,

9
C'è sicuramente un impatto sulle prestazioni durante la transizione di tutte le proprietà anziché semplicemente quella di cui hai bisogno. Potrebbe causare seri danni se si hanno molti elementi che trasferiscono contemporaneamente tutte le proprietà. A proposito ms-transition, non conosco alcun motivo, ora che IE10 è fuori, perché qualcuno dovrebbe ancora usare al ms-transitionposto dello standard transition. Non causerà alcun problema ad entrambi, ma, soprattutto su un foglio di stile pesante di transizione, gonferà il tuo CSS. Ancora più importante, anche la dimensione del file subirà un colpo.
Rémi Breton,

3
Ho avuto lo stesso problema e sembrava che usare "transizione: opacità 1s .5s, altezza massima .5s 0" non funzionasse mentre "transizione: opacità 1s .5s, altezza massima .5s 0s" era. La prima volta che vedo un'unità richiesta per un valore zero in css!
mlarcher,

5
Vale la pena sottolineare che l'utilizzo di "tutto" è più lento rispetto alla specifica di proprietà specifiche.
Nathan,

433

Se hai diverse proprietà specifiche che vuoi trasferire allo stesso modo (perché hai anche alcune proprietà che hai nello specifico non vuoi trasferire, diciamo opacity), un'altra opzione è fare qualcosa del genere (prefissi omessi per brevità):

.myclass {
    transition: all 200ms ease;
    transition-property: box-shadow, height, width, background, font-size;
}

La seconda dichiarazione sovrascrive la alldichiarazione abbreviata sopra di essa e rende (occasionalmente) un codice più conciso.

/* prefixes omitted for brevity */
.box {
    height: 100px;
    width: 100px;
    background: red;
    box-shadow: red 0 0 5px 1px;
    transition: all 500ms ease;
    /*note: not transitioning width */
    transition-property: height, background, box-shadow;
}

.box:hover {
  height: 50px;
  width: 50px;
  box-shadow: blue 0 0 10px 3px;
  background: blue;
}
<p>Hover box for demo</p>
<div class="box"></div>

dimostrazione


4
Questo è utile! Non solo a causa transition-propertydell'override, ma anche perché ad esempio transition-delaydeve essere specificato dopo la scorciatoia (almeno nel webkit). In altre parole, la scorciatoia implica a transition-delaydi 0 e mettere un ritardo autonomo prima che la stenografia lo riporti a 0.
duncanwilcox,

@duncanwilcox puoi farlo transition: [props] [duration] [easing] [delay] in tutti i browser moderni
Jason,

9
Preferisci questa risposta MOLTO più della risposta accettata.
Erutan409,

3
bello! mi piace molto l'approccio!
wasddd_

36

Io che lavoro con questo:

element{
   transition : height 3s ease-out, width 5s ease-in;
}

Questo è quello che stavo cercando: scorciatoia per più proprietà. Grazie!
Adam Moisa,

2

Avendo il ritardo di 0,5 sulla transizione della proprietà di opacità, l'elemento sarà completamente trasparente (e quindi invisibile) per tutto il tempo in cui la sua altezza sta passando. Quindi l'unica cosa che vedrai in realtà è che l'opacità sta cambiando. Quindi otterrai lo stesso effetto di lasciare la proprietà height fuori dalla transizione:

"transizione: opacità .5s .5s;"

È quello che stai cercando? In caso contrario, e vuoi vedere la transizione in altezza, non puoi avere un'opacità pari a zero per tutto il tempo in cui sta passando.


Neanche questo funziona, poiché l'altezza rimarrà 0 durante la transizione dell'opacità.
Xesau,

0

Questo mi ha aiutato a capire / ottimizzare, solo ciò di cui avevo bisogno per animare:

// SCSS - Multiple Animation: Properties | durations | etc.
// on hover, animate div (width/opacity) - from: {0px, 0} to: {100vw, 1}

.base {
  max-width: 0vw;
  opacity: 0;

  transition-property: max-width, opacity; // relative order
  transition-duration: 2s, 4s; // effects relatively ordered animation properties
  transition-delay: 6s; // effects delay of all animation properties
  animation-timing-function: ease;

  &:hover {
    max-width: 100vw;
    opacity: 1;

    transition-duration: 5s; // effects duration of all aniomation properties
    transition-delay: 2s, 7s; // effects relatively ordered animation properties
  }
}

~ Questo vale per tutte le proprietà di transizione (durata, funzione di temporizzazione della transizione, ecc.) All'interno della classe '.base'


-4

Penso che funzioni con questo:

element{
   transition: all .3s;
   -webkit-transition: all .3s;
   -moz-transition: all .3s;
   -o-transition: all .3s;
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.