Estou tentando fazer um <ul>
slide para baixo usando transições CSS.
O <ul>
começa em height: 0;
. Ao passar o mouse, a altura é definida como height:auto;
. No entanto, isso está fazendo com que simplesmente apareça, não faça transição,
Se eu fizer isso de height: 40px;
para height: auto;
, ele deslizará para height: 0;
e, de repente, pulará para a altura correta.
De que outra forma eu poderia fazer isso sem usar JavaScript?
#child0 {
height: 0;
overflow: hidden;
background-color: #dedede;
-moz-transition: height 1s ease;
-webkit-transition: height 1s ease;
-o-transition: height 1s ease;
transition: height 1s ease;
}
#parent0:hover #child0 {
height: auto;
}
#child40 {
height: 40px;
overflow: hidden;
background-color: #dedede;
-moz-transition: height 1s ease;
-webkit-transition: height 1s ease;
-o-transition: height 1s ease;
transition: height 1s ease;
}
#parent40:hover #child40 {
height: auto;
}
h1 {
font-weight: bold;
}
The only difference between the two snippets of CSS is one has height: 0, the other height: 40.
<hr>
<div id="parent0">
<h1>Hover me (height: 0)</h1>
<div id="child0">Some content
<br>Some content
<br>Some content
<br>Some content
<br>Some content
<br>Some content
<br>
</div>
</div>
<hr>
<div id="parent40">
<h1>Hover me (height: 40)</h1>
<div id="child40">Some content
<br>Some content
<br>Some content
<br>Some content
<br>Some content
<br>Some content
<br>
</div>
</div>
css
css-transitions
Hailwood
fonte
fonte
height:auto/max-height
solução só funcionará se você estiver expandindo a área maior do que aheight
que deseja restringir. Se você tem um menu suspensomax-height
de300px
, mas uma caixa de combinação, que pode retornar50px
emax-height
não ajudá-lo,50px
é variável dependendo do número de elementos, você pode chegar a uma situação impossível em que eu não posso consertá-lo porqueheight
não é fixo,height:auto
foi a solução, mas não posso usar transições com isso.Respostas:
Use
max-height
na transição e nãoheight
. E defina um valormax-height
para algo maior do que sua caixa jamais receberá.Veja a demonstração do JSFiddle fornecida por Chris Jordan em outra resposta aqui.
fonte
Você deve usar scaleY.
Criei uma versão prefixada pelo fornecedor do código acima no jsfiddle e alterei seu jsfiddle para usar scaleY em vez de height.
fonte
No momento, não é possível animar em altura quando uma das alturas envolvidas é
auto
, você deve definir duas alturas explícitas.fonte
this.$element[dimension](this.$element[dimension]())[0].offsetHeight
auto
...A solução que eu sempre usei foi a primeira fora fade, então encolher os
font-size
,padding
emargin
valores. Não parece o mesmo que uma limpeza, mas funciona sem uma estáticaheight
oumax-height
.Exemplo de trabalho:
fonte
*
e aplicando outras alterações. Os botões deveriam ter sido afetados pelo meu código acima, no entanto, se tivessem o estilo corretoem
.line-height: 0;
eborder-width: 0;
line-height
se evitar corretamente unidades no valor: developer.mozilla.org/en-US/docs/Web/CSS/…Sei que essa é a trigésima terceira resposta a essa pergunta, mas acho que vale a pena, então aqui vai. Esta é uma solução somente CSS com as seguintes propriedades:
transform: scaleY(0)
), por isso faz a coisa certa se houver conteúdo após o elemento recolhível.height: auto
), todo o conteúdo sempre tem a altura correta (diferente de, por exemplo, se você escolher umamax-height
que seja muito baixo). E no estado recolhido, a altura é zero como deveria.Demo
Aqui está uma demonstração com três elementos recolhíveis, com diferentes alturas, que usam o mesmo CSS. Você pode clicar em "página inteira" após clicar em "executar trecho". Observe que o JavaScript apenas alterna a
collapsed
classe CSS, não há medição envolvida. (Você pode fazer esta demonstração exata sem qualquer JavaScript usando uma caixa de seleção ou:target
). Observe também que a parte do CSS responsável pela transição é bastante curta e o HTML requer apenas um único elemento adicional do wrapper.Como funciona?
De fato, existem duas transições envolvidas para que isso aconteça. Um deles faz a transição
margin-bottom
de 0px (no estado expandido) para-2000px
no estado recolhido (semelhante a esta resposta ). O 2000 aqui é o primeiro número mágico, é baseado na suposição de que sua caixa não será maior que isso (2000 pixels parece uma escolha razoável).Usando o
margin-bottom
transição sozinha por si só tem dois problemas:margin-bottom: -2000px
não ocultará tudo - haverá coisas visíveis mesmo no caso recolhido. Esta é uma pequena correção que faremos mais tarde.A correção desse segundo problema é onde entra a segunda transição, e essa transição visa conceitualmente a altura mínima do wrapper ("conceitualmente" porque não estamos realmente usando a
min-height
propriedade para isso; mais sobre isso posteriormente).Aqui está uma animação que mostra como a combinação da transição da margem inferior com a transição mínima da altura, ambas de igual duração, nos fornece uma transição combinada da altura total para a altura zero que tem a mesma duração.
A barra esquerda mostra como a margem inferior negativa empurra a parte inferior para cima, reduzindo a altura visível. A barra do meio mostra como a altura mínima garante que, no caso de colapso, a transição não termine mais cedo e, no caso de expansão, a transição não comece tarde. A barra direita mostra como a combinação dos dois faz com que a caixa faça a transição da altura total para a altura zero na quantidade correta de tempo.
Para minha demonstração, estabeleci 50px como o valor mínimo de altura superior. Este é o segundo número mágico e deve ser menor do que a altura da caixa jamais seria. 50px parece razoável também; parece improvável que você queira muitas vezes tornar um elemento dobrável que não tem nem 50 pixels de altura.
Como você pode ver na animação, a transição resultante é contínua, mas não diferenciável - no momento em que a altura mínima é igual à altura total ajustada pela margem inferior, ocorre uma mudança repentina na velocidade. Isso é muito perceptível na animação porque usa uma função de tempo linear para ambas as transições e porque toda a transição é muito lenta. No caso real (minha demonstração no topo), a transição leva apenas 300ms e a transição da margem inferior não é linear. Eu brinquei com muitas funções de tempo diferentes para ambas as transições, e as que eu acabei achando que funcionaram melhor na mais ampla variedade de casos.
Restam dois problemas para corrigir:
Resolvemos o primeiro problema, atribuindo ao elemento contêiner a
max-height: 0
no caso recolhido, com uma0s 0.3s
transição. Isso significa que não é realmente uma transição, masmax-height
é aplicada com um atraso; só se aplica quando a transição termina. Para que isso funcione corretamente, também precisamos escolher um numéricomax-height
para o estado oposto, sem recolhimento . Mas, diferentemente do caso de 2000 px, onde escolher um número muito grande afeta a qualidade da transição, nesse caso, isso realmente não importa. Assim, podemos simplesmente escolher um número que é tão alto que sabemos que nenhuma altura chegará perto disso. Eu escolhi um milhão de pixels. Se você acha que precisa oferecer suporte a conteúdo com mais de um milhão de pixels de altura, 1) desculpe-me e 2) apenas adicione alguns zeros.O segundo problema é a razão pela qual não estamos realmente usando
min-height
a transição de altura mínima. Em vez disso, há um::after
pseudoelemento no contêinerheight
que transita de 50px para zero. Isso tem o mesmo efeito quemin-height
: Não permitirá que o contêiner encolha abaixo da altura que o pseudoelemento tenha atualmente. Mas como estamos usandoheight
, nãomin-height
, agora podemos usarmax-height
(mais uma vez aplicado com atraso) para definir a altura real do pseudo-elemento como zero quando a transição terminar, garantindo que, pelo menos fora da transição, até mesmo pequenos elementos tenham o altura correta. Pormin-height
ser mais forte quemax-height
isso não funcionaria se usássemos o contêiner emmin-height
vez do pseudo-elementoheight
. Assim como omax-height
no parágrafo anterior, issomax-height
também precisa de um valor para o extremo oposto da transição. Mas, neste caso, podemos simplesmente escolher os 50px.Testado no Chrome (Win, Mac, Android, iOS), Firefox (Win, Mac, Android), Edge, IE11 (exceto por um problema de layout da caixa flexível na minha demonstração que não incomodava a depuração) e Safari (Mac, iOS ) Falando em flexbox, deve ser possível fazer isso funcionar sem usar flexbox; na verdade, acho que você poderia fazer quase tudo funcionar no IE7 - exceto pelo fato de não ter transições CSS, tornando-o um exercício inútil.
fonte
collapsible-wrapper
posição for absoluta. Ooverflow: hidden
pai é necessário para a transição, mas interfere nos elementos absolutamente posicionados.clip-path: polygon(...)
vez deoverflow: hidden
, porque, ao contrário do último, é possível fazer a transição do primeiro. Como substituto para navegadores mais antigos, usei uma transformação de escala adicional. Veja o comentário na parte superior do github.com/StackExchange/Stacks/blob/develop/lib/css/components/…Você pode, com um pouco de brincadeira não-semântica. Minha abordagem usual é animar a altura de uma DIV externa que tenha um único filho, que é uma DIV sem estilo usada apenas para medir a altura do conteúdo.
Alguém gostaria de poder simplesmente dispensar o
.measuringWrapper
e apenas definir a altura do DIV para automático e fazer com que o animar, mas isso não parece funcionar (a altura é definida, mas não ocorre animação).Minha interpretação é que é necessária uma altura explícita para que a animação seja executada. Você não pode obter uma animação em altura quando a altura (a altura inicial ou final) é
auto
.fonte
max-height
, não há necessidadeauto
e, especialmente, não há necessidade de Javascript! Apenas duas declarações simplesmargin-top
(emargin-bottom
) são relativos à largura quando definidos em porcentagens, sim, isso é estúpido, mas também explica por que os tempos de animação de abertura e fechamento são completamente diferentes - é a mesma coisa que você vê na resposta de melhor classificação, especificando um disco rígido. altura máxima codificada. Por que isso é tão difícil de fazer certo?Uma solução visual para animar a altura usando transições CSS3 é animar o preenchimento.
Você não obtém o efeito de limpeza total, mas brincar com os valores de duração da transição e preenchimento deve aproximá-lo o suficiente. Se você não deseja definir explicitamente altura / altura máxima, é isso que você está procurando.
http://jsfiddle.net/catharsis/n5XfG/17/ (extraído de stephband's acima do jsFiddle)
fonte
Minha solução alternativa é fazer a transição da altura máxima para a altura exata do conteúdo para uma boa animação suave e, em seguida, usar um retorno de chamada transiçãoEnd para definir a altura máxima para 9999px para que o conteúdo possa ser redimensionado livremente.
fonte
.stop
funciona o problema do loop de animação bastante complexo. Agora, quando você anima a altura e a cor, mas deseja interromper apenas a animação da altura, as coisas ficam um pouco mais complicadas ... Eu entendi o seu ponto.A resposta aceita funciona na maioria dos casos, mas não funciona bem quando você
div
pode variar bastante de altura - a velocidade da animação não depende da altura real do conteúdo e pode parecer instável.Você ainda pode executar a animação real com CSS, mas precisa usar o JavaScript para calcular a altura dos itens, em vez de tentar usar
auto
. Não é necessário jQuery, embora você precise modificá-lo um pouco, se quiser compatibilidade (funciona na versão mais recente do Chrome :)).fonte
document.getElementById('mydiv')
ou$('#mydiv').get()
), e a função alterna entre ocultar / mostrar. Se você configurar transições CSS, o elemento será animado automaticamente.min-height
como na resposta esperada causa problemas na velocidade da animação quando o tamanho da lista pode variar bastante).Houve pouca menção à
Element.scrollHeight
propriedade que pode ser útil aqui e ainda pode ser usada com uma transição CSS pura. A propriedade sempre contém a altura "completa" de um elemento, independentemente de como e como seu conteúdo excede como resultado da altura recolhida (por exemploheight: 0
).Como tal, para um elemento
height: 0
(efetivamente totalmente recolhido), sua altura "normal" ou "total" ainda está prontamente disponível através de seuscrollHeight
valor (invariavelmente um comprimento de pixel ).Para esse elemento, supondo que ele já tenha a transição configurada como por exemplo (usando
ul
conforme a pergunta original):Podemos acionar a "expansão" animada desejada de altura, usando apenas CSS, com algo como o seguinte (assumindo aqui que a
ul
variável se refere à lista):É isso aí. Se você precisar recolher a lista, uma das duas instruções a seguir fará:
Meu caso de uso específico girava em torno de listas animadas de comprimentos desconhecidos e muitas vezes consideráveis; portanto, não me sentia confortável em optar por uma especificação "suficientemente grande"
height
ou arbitráriamax-height
e por arriscar conteúdo de corte ou conteúdo que você precisa rolar de repente (seoverflow: auto
, por exemplo) . Além disso, a flexibilização e o tempo são interrompidos com asmax-height
soluções baseadas, porque a altura usada pode atingir seu valor máximo muito antes do que seria necessário paramax-height
alcançá-lo9999px
. E à medida que as resoluções de tela aumentam, os comprimentos de pixel9999px
deixam um gosto ruim na minha boca. Esta solução em particular resolve o problema de maneira elegante, na minha opinião.Finalmente, esperamos que futuras revisões dos autores de endereços CSS precisem fazer esse tipo de coisa de maneira ainda mais elegante - revisite a noção de valores "computados" vs "usados" e "resolvidos" e considere se as transições devem ser aplicadas a computadores computados. valores, incluindo transições com
width
eheight
(que atualmente recebem um tratamento especial).fonte
Element.scrollHeight
propriedade requer JavaScript e, como a pergunta indica claramente, eles querem fazer isso sem JavaScript.Use
max-height
com flexibilização e atraso de transição diferentes para cada estado.HTML:
CSS:
Consultar exemplo: http://jsfiddle.net/0hnjehjc/1/
fonte
999999px
. Por outro lado, isso mudará sua animação, porque os quadros são calculados a partir desse valor. Então você pode acabar com a animação "atraso" em um sentido e um fim muito rápido na outra direção (corr: o tempo-funções)Não há valores codificados.
Sem JavaScript.
Sem aproximações.
O truque é usar um arquivo oculto e duplicado
div
para fazer o navegador entender o que 100% significa.Este método é adequado sempre que você puder duplicar o DOM do elemento que deseja animar.
fonte
transform: scaleY(1)
, pois essa transição não remove o espaço.Ao postar isso, já existem mais de 30 respostas, mas sinto que minha resposta melhora a resposta já aceita por jake.
Eu não estava contente com o problema que surge do simples uso das
max-height
transições CSS3, pois, como muitos comentadores observaram, você deve definir seumax-height
valor muito próximo da altura real ou sofrerá um atraso. Veja este JSFiddle para um exemplo desse problema.Para contornar isso (ainda sem usar JavaScript), adicionei outro elemento HTML que faz a transição do
transform: translateY
valor CSS.Isso significa os dois
max-height
etranslateY
é usado:max-height
permite que o elemento empurre elementos abaixo dele, enquantotranslateY
fornece o efeito "instantâneo" que queremos. O problema commax-height
ainda existe, mas seu efeito é reduzido. Isso significa que você pode definir uma altura muito maior para o seumax-height
valor e se preocupar com isso menos.O benefício geral é que, na transição de volta (no colapso), o usuário vê a
translateY
animação imediatamente, portanto, não importa realmente quanto tempomax-height
leva.Solução como Fiddle
fonte
translateY
maisscale
porque eu não gostei de comoscale
deu esse efeito de compressão.Ok, então acho que encontrei uma resposta super simples ... não
max-height
, usarelative
posicionamento, trabalha comli
elementos e é CSS puro. Eu não testei em nada além do Firefox, apesar de julgar pelo CSS, ele deve funcionar em todos os navegadores.FIDDLE: http://jsfiddle.net/n5XfG/2596/
CSS
HTML
fonte
EDIT: Role para baixo para obter uma resposta atualizada
Eu estava fazendo uma lista suspensa e vi este Post ... muitas respostas diferentes, mas decido compartilhar minha lista suspensa também ... Não é perfeito, mas pelo menos usará apenas css para suspenso! Eu tenho usado transform: translateY (y) para transformar a lista na exibição ...
Você pode ver mais no teste
http://jsfiddle.net/BVEpc/4/ Coloquei
div por trás de cada li porque meu lista suspensa vem de cima e para mostrá-las corretamente, isso era necessário, meu código div é:
e passe o mouse é:
e como a altura de ul é definida como o conteúdo, ela pode superar o conteúdo do seu corpo, por isso fiz isso para ul:
e passe o mouse:
a segunda vez após a transição for atrasada e ela ficará oculta após minha lista suspensa ter sido animada ...
Espero que mais tarde alguém se beneficie dessa.
Edição: Eu simplesmente não posso acreditar ppl realmente usando este protótipo! este menu suspenso é apenas para um submenu e é tudo !! Atualizei um melhor que pode ter dois submenus para a direção ltr e rtl com o suporte do IE 8.
Fiddle for LTR
Fiddle for RTL
espero que alguém ache isso útil no futuro.
fonte
Você pode fazer a transição de height: 0 para height: auto, desde que você também forneça altura mínima e altura máxima.
fonte
Solução Flexbox
Prós:
Contras:
A maneira como funciona é sempre ter base flexível: auto no elemento com conteúdo e, em vez disso, fazer a transição flex-grow e flex-shrink.
Edit: JS Fiddle aprimorado, inspirado na interface do Xbox One.
JS Fiddle
fonte
Expandindo a resposta de @ jake, a transição alcançará o valor de altura máxima, causando uma animação extremamente rápida - se você definir as transições para ambos: pairar e desligar, poderá controlar um pouco mais a velocidade louca.
Portanto, o li: hover é quando o mouse entra no estado e, em seguida, a transição na propriedade não pairada será deixada pelo mouse.
Espero que isso ajude.
por exemplo:
Aqui está um violino: http://jsfiddle.net/BukwJ/
fonte
Eu acho que criei uma solução realmente sólida
ESTÁ BEM! Eu sei que esse problema é tão antigo quanto a Internet, mas acho que tenho uma solução que me transformei em um plug - in chamado transição de mutantes . Minha solução define os
style=""
atributos para elementos rastreados sempre que houver uma alteração no DOM. o resultado final é que você pode usar um bom ole CSS para suas transições e não usar correções de hackers ou javascript especial. A única coisa que você precisa fazer é definir o que deseja rastrear no elemento em questão usandodata-mutant-attributes="X"
.É isso aí! Esta solução usa MutationObserver para acompanhar as alterações no DOM. Por isso, você não precisa realmente configurar nada ou usar o javascript para animar manualmente as coisas. As alterações são rastreadas automaticamente. No entanto, como ele usa o MutationObserver, isso fará a transição apenas no IE11 +.
Fiddles!
height: auto
paraheight: 100%
height: auto
ao adicionar filhosfonte
Aqui está uma maneira de fazer a transição de qualquer altura inicial, incluindo 0, para automática (tamanho total e flexível) sem exigir código de configuração fixa por nó ou qualquer código de usuário para inicializar: https://github.com/csuwildcat / transição-automática . Este é basicamente o Santo Graal para o que você quer, acredito -> http://codepen.io/csuwldcat/pen/kwsdF . Basta colocar o seguinte arquivo JS em sua página e tudo o que você precisa fazer depois é adicionar / remover um único atributo booleano -
reveal=""
- dos nós que deseja expandir e contratar.Aqui está tudo o que você precisa fazer como usuário, depois de incluir o bloco de código encontrado abaixo do código de exemplo:
Aqui está o bloco de código a incluir na sua página; depois disso, é tudo molho:
Solte esse arquivo JS na sua página - tudo isso apenas funciona
/ * Código para altura: auto; transição * /
/ * Código para DEMO * /
fonte
clip
como meu gatilho de propriedade fictícia e, por algum motivo, o IE parou de permitir que o clipe fosse animado. Mudei para a opacidade e tudo funciona novamente: codepen.io/csuwldcat/pen/FpzGa . Atualizei o código na resposta para corresponder.A resposta de Jake para animar a altura máxima é ótima, mas achei o atraso causado por definir uma grande altura máxima irritante.
Pode-se mover o conteúdo recolhível para uma div interna e calcular a altura máxima obtendo a altura da div interna (via JQuery, seria o outerHeight ()).
Aqui está um link do jsfiddle: http://jsfiddle.net/pbatey/duZpT
Aqui está um jsfiddle com a quantidade mínima absoluta de código necessária: http://jsfiddle.net/8ncjjxh8/
fonte
Sei que esse segmento está envelhecendo, mas está classificado em algumas pesquisas no Google, então acho que vale a pena atualizar.
Você também obtém / define a altura do elemento:
Você deve despejar esse Javascript imediatamente após a tag de fechamento do target_box em uma tag de script embutido.
fonte
Eu fui capaz de fazer isso. Eu tenho um
.child
e um.parent
div. A div criança se encaixa perfeitamente dentro da largura / altura dos pais com oabsolute
posicionamento. Em seguida, animar atranslate
propriedade para empurrar seuY
valor para baixo100%
. Sua animação muito suave, sem falhas ou desvantagens como qualquer outra solução aqui.Algo assim, pseudo código
Você deve especificar um
height
no.parent
, nopx
,%
ou licença comoauto
. Essa div mascara a.child
div quando ela desliza para baixo.fonte
Eu postei uma resposta com algum JavaScript e obtive votos negativos, por isso fiquei irritado e tentei novamente, e o decifrei apenas com CSS!
Esta solução usa algumas 'técnicas':
padding-bottom:100%
'hack' onde porcentagens são definidas em termos da largura atual do elemento. Mais informações sobre esta técnica.O resultado, porém, é que obtemos uma transição de desempenho usando apenas CSS e uma única função de transição para obter a transição sem problemas; o Santo Graal!
Claro, há uma desvantagem! Não sei como controlar a largura em que o conteúdo é cortado (
overflow:hidden
); por causa do hack do fundo do preenchimento, a largura e a altura estão intimamente relacionadas. Pode haver uma maneira, então, voltarei a ela.https://jsfiddle.net/EoghanM/n1rp3zb4/28/
fonte
input[type="checkbox"]:checked
, em vez de:hover
se desejar (ou seja, você não quer usar JavaScript para adicionar quaisquer classes)Aqui está uma solução que acabei de usar em combinação com o jQuery. Isso funciona para a seguinte estrutura HTML:
e a função:
Você pode usar uma função de clique para definir e remover a altura usando
css()
CSS:
fonte
Estive recentemente fazendo a transição
max-height
dosli
elementos em vez da embalagemul
.O raciocínio é que o atraso para os pequenos
max-heights
é muito menos perceptível (se em tudo) em relação ao grandemax-heights
, e eu também pode definir o meumax-height
valor relativo aofont-size
doli
em vez de um número enorme arbitrária usandoems
ourems
.Se o tamanho da minha fonte for
1rem
, definirei meumax-height
como algo como3rem
(para acomodar o texto quebrado). Você pode ver um exemplo aqui:http://codepen.io/mindfullsilence/pen/DtzjE
fonte
Não li tudo em detalhes, mas tive esse problema recentemente e fiz o seguinte:
Isso permite que você tenha uma div que, a princípio, mostre conteúdo com até 200px de altura e, ao passar o mouse, o tamanho se torna pelo menos tão alto quanto o conteúdo inteiro da div. O Div não se torna 3000px, mas 3000px é o limite que estou impondo. Certifique-se de fazer a transição no non: hover, caso contrário você poderá obter uma renderização estranha. Dessa maneira, o: hover é herdado do non: hover.
A transição não funciona do px para% ou para automático. Você precisa usar a mesma unidade de medida. Este trabalho é bom para mim. Usar HTML5 o torna perfeito ....
Lembre-se de que sempre há uma solução alternativa ...; )
Espero que alguém ache isso útil
fonte
A solução de altura máxima da Jake funciona bem, se o valor da altura máxima codificado fornecido não for muito maior que a altura real (porque, caso contrário, existem atrasos e problemas de tempo indesejáveis). Por outro lado, se o valor codificado permanentemente não for maior que a altura real, o elemento não abrirá completamente.
A solução somente CSS a seguir também requer um tamanho codificado que deve ser maior que a maioria dos tamanhos reais que ocorrem. No entanto, esta solução também funciona se, em algumas situações, o tamanho real for maior que o tamanho codificado. Nesse caso, a transição pode pular um pouco, mas nunca deixará um elemento parcialmente visível. Portanto, essa solução também pode ser usada para conteúdo desconhecido, por exemplo, de um banco de dados, onde você sabe que o conteúdo geralmente não é maior que x pixels, mas há exceções.
A idéia é usar um valor negativo para margem inferior (ou margem superior para uma animação ligeiramente diferente) e colocar o elemento de conteúdo em um elemento intermediário com estouro: oculto. A margem negativa do elemento de conteúdo reduz a altura do elemento do meio.
O código a seguir usa uma transição na margem inferior de -150px para 0px. Só isso funciona bem, desde que o elemento de conteúdo não seja superior a 150px. Além disso, ele usa uma transição na altura máxima para o elemento do meio de 0px a 100%. Por fim, isso oculta o elemento do meio se o elemento de conteúdo for superior a 150px. Para altura máxima, a transição é usada apenas para atrasar sua aplicação em um segundo ao fechar, não para um efeito visual suave (e, portanto, pode variar de 0px a 100%).
CSS:
HTML:
O valor da margem inferior deve ser negativo e o mais próximo possível da altura real do elemento de conteúdo. Se (o valor do absoute) for maior, existem problemas de atraso e tempo semelhantes aos das soluções de altura máxima, que podem ser limitadas desde que o tamanho do código rígido não seja muito maior que o real. Se o valor absoluto para o fundo da margem for menor que a altura real, a transição pula um pouco. De qualquer forma, após a transição, o elemento de conteúdo é totalmente exibido ou totalmente removido.
Para obter mais detalhes, consulte minha postagem no blog http://www.taccgl.org/blog/css_transition_display.html#combined_height
fonte
Você pode fazer isso criando uma animação reversa (recolhida) com o caminho do clipe.
fonte
Esta não é exatamente uma "solução" para o problema, mas mais uma solução alternativa. Funciona apenas como escrito com texto, mas pode ser alterado para funcionar com outros elementos, conforme necessário, tenho certeza.
Aqui está um exemplo: http://codepen.io/overthemike/pen/wzjRKa
Essencialmente, você define o tamanho da fonte como 0 e faz a transição para que, em vez da altura, altura máxima ou escalaY () etc., em um ritmo rápido o suficiente para que a altura se transforme no que você deseja. Atualmente, não é possível transformar a altura real com CSS para automático, mas transformar o conteúdo é, portanto, a transição do tamanho da fonte.
fonte