Como ter várias transições CSS em um elemento?

327

É uma pergunta bastante direta, mas não consigo encontrar uma documentação muito boa sobre as propriedades de transição CSS. Aqui está o trecho CSS:

    .nav a
{
    text-transform:uppercase;
    text-decoration:none;
    color:#d3d3d3;
    line-height:1.5 em;
    font-size:.8em;
    display:block;
    text-align:center;
    text-shadow: 0 -1.5em 0 rgba(255, 255, 255, 0.15);
    -webkit-transition: color .2s linear;
    -moz-transition: color .2s linear;
    -o-transition: color .2s linear;
    transition: color .2s linear;
    -webkit-transition: text-shadow .2s linear;
    -moz-transition: text-shadow .2s linear;
    -o-transition: text-shadow .2s linear;
    transition: text-shadow .2s linear;
}

.nav a:hover
{
    color:#F7931E;
    text-shadow: 0 1.5em 0 rgba(247, 147, 30, 0.15);
}

Como você pode ver, as propriedades de transição são substituídas uma pela outra. Como está, a sombra do texto será animada, mas não a cor. Como faço para os dois animarem simultaneamente? Obrigado por todas as respostas.

Eric Thoma
fonte
Não se esqueça que transition: allé muito buggy para o safari / ipad: joelglovier.com/writing/…
Oğuzhan Kahyaoğlu

Respostas:

584

As propriedades de transição são delimitadas por vírgula em todos os navegadores que suportam transições:

.nav a {
  transition: color .2s, text-shadow .2s;
}

easeé a função de tempo padrão, para que você não precise especificá-la. Se você realmente quiser linear, precisará especificá-lo:

transition: color .2s linear, text-shadow .2s linear;

Isso começa a ficar repetitivo; portanto, se você usar as mesmas funções de tempo e tempo em várias propriedades, é melhor seguir em frente e usar as várias transition-*propriedades em vez da abreviação:

transition-property: color, text-shadow;
transition-duration: .2s;
transition-timing-function: linear;
coreyward
fonte
11
Presumo porque transformar é uma cadeia, onde as questões de ordem, de modo a sintaxe sente bom se você está acostumado a encadeamento funcional, enquanto transição requer uma lista desordenada de elementos inteiramente independentes, de modo vírgulas são apropriados
mirichan
1
Como um comentário geral sobre transições no CSS, deve-se ter em mente que ter várias definições de transição uma após a outra não funcionará e, para isso, elas devem estar na mesma definição (como na SA aqui). Pelas regras básicas do CSS, a regra "mais recente" se aplica; portanto, se houver várias definições em linhas separadas, somente a última definição será aplicada. FYI
TheCuBeMan
37

Você também pode simplesmente de forma significativa com:

.nav a {
    -webkit-transition: all .2s;
}
XML
fonte
44
Você pode remover 'all', pois esse é o padrão, a menos que seja especificado de outra forma.
joshnh
13
+1 para um ponto excelente, mas acho que é útil explicitamente mantê-lo lá, principalmente pela consistência e compreensão entre as equipes.
XML
4
Cuidado com isso! Se o desenvolvimento para celulares, em combinação com elementos acelerados por hardware, torna novos dispositivos com falhas e antigos, inutilizáveis.
Ilya Karnaukhov 19/09/14
2
Obrigado, @ CanerŞahin. Você pode nos fornecer alguma documentação ou ferramentas de benchmarking que ajudem as pessoas a entender esse ponto? Além disso, você vê evidências de que "tudo" é pior do que não usar nenhum especificador?
XML
3
@XML A maneira como foi explicado existem dois efeitos negativos. 1, o navegador adiciona recursos extras devido ao uso de 'all'. O navegador escutará atentamente esse elemento, aguardando as alterações com menor desempenho e que possam criar trepidação de página. 2, pode criar efeitos inesperados se um desenvolvedor posteriormente colocar uma cor de fundo que será então transferida, o que pode não ser esperado ou necessário.
Stefan Burt
29

Algo como o seguinte permitirá várias transições simultaneamente:

-webkit-transition: color .2s linear, text-shadow .2s linear;
   -moz-transition: color .2s linear, text-shadow .2s linear;
     -o-transition: color .2s linear, text-shadow .2s linear;
        transition: color .2s linear, text-shadow .2s linear;

Exemplo: http://jsbin.com/omogaf/2

Delan Azabani
fonte
24

Se você tornar todas as propriedades animadas iguais, poderá definir cada uma separadamente, o que permitirá que você não repita o código.

 transition: all 2s;
 transition-property: color, text-shadow;

Há mais sobre isso aqui: transição abreviada de CSS com várias propriedades?

Eu evitaria usar a propriedade all (a propriedade de transição substitui 'all'), pois você pode acabar com um comportamento indesejado e resultados inesperados no desempenho.

Corey Young
fonte
2
.nav a {
    transition: color .2s, text-shadow .2s;
}
Locoroco
fonte
1

Aqui está uma combinação MENOS para fazer a transição de duas propriedades ao mesmo tempo:

.transition-two(@transition1, @transition1-duration, @transition2, @transition2-duration) {
 -webkit-transition: @transition1 @transition1-duration, @transition2 @transition2-duration;
    -moz-transition: @transition1 @transition1-duration, @transition2 @transition2-duration;
      -o-transition: @transition1 @transition1-duration, @transition2 @transition2-duration;
          transition: @transition1 @transition1-duration, @transition2 @transition2-duration;
}
Mark P
fonte
O autoprefixer é ainda melhor!
reescrito
autoprefixer + caneta FTW.
Jason Lydon
1

É possível fazer várias transições definidas com diferentes valores para a função de duração, atraso e tempo. Para dividir transições diferentes, use,

button{
  transition: background 1s ease-in-out 2s, width 2s linear;
  -webkit-transition: background 1s ease-in-out 2s, width 2s linear; /* Safari */
}

Referência: https://kolosek.com/css-transition/

Nesha Zoric
fonte
0

Também é possível evitar a especificação completa das propriedades.

#box {
  transition: 0.4s;
  position: absolute;
  border: 1px solid darkred;
  bottom: 20px; left: 20px;
  width: 200px; height: 200px;
  opacity: 0;
}

#box.on {
  opacity: 1;
  height: 300px;
  width: 500px;
 }
jerblack
fonte