Com o CSS3, a possibilidade de criar simples animações sem a necessidade da utilização de Javascript é notável. O que é espetacular, pois isto significa:
- menos código Javascript/jQuery para embarcar
- menos iterações
- menor tempo de carregamento da ação desta animação
Hoje em dia criar um menu deslizante ou como se costuma dizer em inglês - um "slider menu", é tão fácil quanto isto:
<div id="menu">
<span>hover me</span>
<ul id="list">
<li>item</li>
<li>item</li>
<li>item</li>
<li>item</li>
<li>item</li>
</ul>
</div>
#list {
height: 0;
transition: height 1s ease-in-out;
overflow: hidden;
background: #d5d5d5;
}
#menu:hover #list {
height: 100px;
}
Exemplo online no jsFiddle:
► https://jsfiddle.net/7zp6ok03/
Mas e se nós quiséssemos que a altura desta lista fosse automática conforme a quantidade de itens que temos adicionados dentro dela?
Nós podemos ter uma grande lista no qual não sabemos qual irá ser a sua altura definitiva para sempre. Para deixarmos a altura desta lista automática, teríamos que definir uma altura para este elemento de -
height:auto;
, mas ao fazermos isto podemos reparar que esta animação deixará de funcionar, o que é normal, pois para que ela funcione é necessário existir uma altura padrão definida para que os cálculos de até onde esta lista se irá expandir sejam feitos.A solução para resolver este problema
Para fazermos com que esta altura seja automática temos que usar
max-height
ao invés de apenas height
, e fazer a correção da propriedade para transição apontando igualmente para a nova propriedade max-height
:transition: max-height 1s ease-in-out;
Eis um exemplo abaixo:
#list {
max-height: 0;
transition: max-height 1s ease-in-out;
overflow: hidden;
background: #d5d5d5;
}
#menu:hover #list {
max-height: 500px;
}
Define um valor grande para a
max-height
, maior do que o valor que pensas que a altura da lista irá ser para evitar com que ela fique demasiado curta.Exemplo online no jsFiddle:
► https://jsfiddle.net/afpehgsb/