Estoy tratando de hacer una <ul>
diapositiva hacia abajo usando transiciones CSS.
El <ul>
comienza a las height: 0;
. Al pasar el mouse, la altura se establece en height:auto;
. Sin embargo, esto hace que simplemente aparezca, no transición,
Si lo hago de height: 40px;
a height: auto;
, entonces se deslizará hacia arriba height: 0;
y de repente saltará a la altura correcta.
¿De qué otra forma podría hacer esto sin 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
Granizo
fuente
fuente
height:auto/max-height
solución solo funcionará si su área de expansión es mayor que laheight
que desea restringir. Si tiene unmax-height
de300px
, pero un menú desplegable de cuadro combinado, que puede regresar50px
,max-height
que no lo ayudará,50px
es variable dependiendo de la cantidad de elementos, puede llegar a una situación imposible donde no puedo solucionarlo porqueheight
no es arreglado,height:auto
era la solución, pero no puedo usar transiciones con esto.Respuestas:
Uso
max-height
en la transición y noheight
. Y establezca un valor enmax-height
algo más grande de lo que su caja obtendrá.Vea la demostración de JSFiddle proporcionada por Chris Jordan en otra respuesta aquí.
fuente
Deberías usar scaleY en su lugar.
Hice una versión con prefijo de proveedor del código anterior en jsfiddle , y cambié su jsfiddle para usar scaleY en lugar de height.
fuente
Actualmente no puede animar en altura cuando una de las alturas involucradas es
auto
, debe establecer dos alturas explícitas.fuente
this.$element[dimension](this.$element[dimension]())[0].offsetHeight
auto
...La solución que yo siempre he usado era la primera desaparición gradual, a continuación, reducir el tamaño de
font-size
,padding
ymargin
valores. No se ve igual que una toallita, pero funciona sin estáticaheight
omax-height
.Ejemplo de trabajo:
fuente
*
y aplicando otros cambios. Sin embargo, los botones deberían haberse visto afectados por mi código anterior, si se diseñaron correctamenteem
.line-height: 0;
yborder-width: 0;
line-height
si evita correctamente las unidades en el valor: developer.mozilla.org/en-US/docs/Web/CSS/…Sé que esta es la respuesta de treinta y tantos a esta pregunta, pero creo que vale la pena, así que aquí va. Esta es una solución solo CSS con las siguientes propiedades:
transform: scaleY(0)
haciendo la transición de la altura real (a diferencia de ), por lo que hace lo correcto si hay contenido después del elemento plegable.height: auto
), todo el contenido siempre tiene la altura correcta (a diferencia, por ejemplo, si elige unmax-height
que resulta ser demasiado baja). Y en el estado colapsado, la altura es cero como debería.Manifestación
Aquí hay una demostración con tres elementos plegables, todos de diferentes alturas, que usan el mismo CSS. Es posible que desee hacer clic en "página completa" después de hacer clic en "ejecutar fragmento". Tenga en cuenta que JavaScript solo alterna la
collapsed
clase CSS, no hay mediciones involucradas. (Puede hacer esta demostración exacta sin ningún tipo de JavaScript utilizando una casilla de verificación o:target
). También tenga en cuenta que la parte del CSS que es responsable de la transición es bastante corta, y el HTML solo requiere un único elemento contenedor adicional.¿Como funciona?
De hecho, hay dos transiciones involucradas en hacer que esto suceda. Uno de ellos hace la transición
margin-bottom
de 0px (en el estado expandido) al-2000px
estado colapsado (similar a esta respuesta ). El 2000 aquí es el primer número mágico, se basa en el supuesto de que su caja no será más alta que esta (2000 píxeles parece una opción razonable).Usar la
margin-bottom
transición solo por sí solo tiene dos problemas:margin-bottom: -2000px
no lo ocultará todo, habrá cosas visibles incluso en el caso colapsado. Esta es una solución menor que haremos más adelante.La solución de este segundo problema es donde entra la segunda transición, y esta transición se dirige conceptualmente a la altura mínima del contenedor ("conceptualmente" porque en realidad no estamos usando la
min-height
propiedad para esto; más sobre eso más adelante).Aquí hay una animación que muestra cómo la combinación de la transición del margen inferior con la transición de altura mínima, ambas de igual duración, nos proporciona una transición combinada de altura completa a altura cero que tiene la misma duración.
La barra izquierda muestra cómo el margen inferior negativo empuja el fondo hacia arriba, reduciendo la altura visible. La barra del medio muestra cómo la altura mínima asegura que en el caso de colapso, la transición no termine temprano, y en el caso de expansión, la transición no comienza tarde. La barra derecha muestra cómo la combinación de los dos hace que la caja pase de la altura completa a la altura cero en la cantidad de tiempo correcta.
Para mi demo, me decidí por 50px como el valor de altura mínima superior. Este es el segundo número mágico, y debería ser más bajo que la altura de la caja. 50 px parece razonable también; parece poco probable que a menudo quiera hacer un elemento plegable que no tenga ni 50 píxeles de altura en primer lugar.
Como puede ver en la animación, la transición resultante es continua, pero no es diferenciable: en el momento en que la altura mínima es igual a la altura completa ajustada por el margen inferior, hay un cambio repentino en la velocidad. Esto es muy notable en la animación porque usa una función de temporización lineal para ambas transiciones, y porque toda la transición es muy lenta. En el caso real (mi demo en la parte superior), la transición solo toma 300 ms, y la transición del margen inferior no es lineal. He jugado con muchas funciones de temporización diferentes para ambas transiciones, y las que terminé sentían que funcionaban mejor para la más amplia variedad de casos.
Quedan dos problemas por solucionar:
Resolvemos el primer problema dando al elemento contenedor a
max-height: 0
en el caso colapsado, con una0s 0.3s
transición. Esto significa que no es realmente una transición, sino quemax-height
se aplica con retraso; solo se aplica una vez que finaliza la transición. Para que esto funcione correctamente, también debemos elegir un valor numéricomax-height
para el estado opuesto, no colapsado. Pero a diferencia del caso de 2000px, donde elegir un número demasiado grande afecta la calidad de la transición, en este caso, realmente no importa. Entonces, podemos elegir un número que sea tan alto que sepamos que ninguna altura se acercará a esto. Elegí un millón de píxeles. Si cree que puede necesitar contenido de una altura de más de un millón de píxeles, entonces 1) lo siento, y 2) simplemente agregue un par de ceros.El segundo problema es la razón por la que en realidad no estamos utilizando
min-height
la transición de altura mínima. En cambio, hay un::after
pseudo-elemento en el contenedor con unaheight
transición de 50 px a cero. Esto tiene el mismo efecto que unmin-height
: No permitirá que el contenedor se encoja por debajo de la altura que tenga el pseudo-elemento actualmente. Pero debido a que estamos usandoheight
, nomin-height
, ahora podemos usarmax-height
(una vez más aplicado con un retraso) para establecer la altura real del pseudo-elemento a cero una vez que finaliza la transición, asegurando que al menos fuera de la transición, incluso los elementos pequeños tengan el altura correcta Porquemin-height
es más fuerte quemax-height
, esto no funcionaría si usáramos los contenedores enmin-height
lugar de los pseudoelementosheight
. Al igual quemax-height
en el párrafo anterior, estomax-height
también necesita un valor para el extremo opuesto de la transición. Pero en este caso, podemos elegir el 50px.Probado en Chrome (Win, Mac, Android, iOS), Firefox (Win, Mac, Android), Edge, IE11 (excepto por un problema de diseño de flexbox con mi demo que no me molestó en depurar) y Safari (Mac, iOS ) Hablando de flexbox, debería ser posible hacer que esto funcione sin usar ningún flexbox; de hecho, creo que podría hacer que casi todo funcione en IE7, excepto el hecho de que no tendrá transiciones CSS, lo que lo convierte en un ejercicio bastante inútil.
fuente
collapsible-wrapper
tiene una posición absoluta? Seoverflow: hidden
requiere el en el padre para la transición, pero interfiere con elementos posicionados absolutamente.clip-path: polygon(...)
lugar deoverflow: hidden
, porque a diferencia de este último, puede hacer la transición del primero. Como alternativa para los navegadores más antiguos, utilicé una transformación de escala adicional. Vea el comentario en la parte superior de github.com/StackExchange/Stacks/blob/develop/lib/css/components/…Puedes, con un poco de jiggery-pokery no semántico. Mi enfoque habitual es animar la altura de un DIV externo que tiene un solo hijo, que es un DIV sin estilo utilizado solo para medir la altura del contenido.
A uno le gustaría poder prescindir de la
.measuringWrapper
y simplemente configurar la altura del DIV en auto y tener esa animación, pero eso no parece funcionar (la altura se establece, pero no se produce animación).Mi interpretación es que se necesita una altura explícita para que se ejecute la animación. No puede obtener una animación sobre la altura cuando la altura (la altura inicial o final) es
auto
.fuente
max-height
, no es necesarioauto
, y especialmente no es necesario tener Javascript! Solo dos declaraciones simplesmargin-top
(ymargin-bottom
) son relativos al ancho cuando se definen en porcentajes, sí, eso es estúpido, pero también explica por qué los tiempos de animación de apertura y cierre son completamente diferentes: es lo mismo que se ve en la respuesta mejor calificada, que especifica -código de altura máxima. ¿Por qué es tan difícil hacer lo correcto?Una solución visual para animar la altura usando transiciones CSS3 es animar el relleno en su lugar.
No obtienes el efecto de borrado completo, pero jugar con los valores de duración de transición y relleno debería acercarte lo suficiente. Si no desea establecer explícitamente height / max-height, esto debería ser lo que está buscando.
http://jsfiddle.net/catharsis/n5XfG/17/ (diferido de stephband por encima de jsFiddle)
fuente
Mi solución alternativa es hacer una transición de la altura máxima a la altura exacta del contenido para obtener una animación agradable y fluida, luego usar una devolución de llamada de finalización de transición para establecer la altura máxima en 9999px para que el contenido pueda redimensionarse libremente.
fuente
.stop
hace el truco para el problema de bucle de animación bastante complejo. Ahora, cuando animas la altura y el color pero deseas interrumpir solo la animación de altura, las cosas se vuelven un poco más complicadas ... Entiendo tu punto.La respuesta aceptada funciona para la mayoría de los casos, pero no funciona bien cuando
div
puede variar mucho en altura: la velocidad de la animación no depende de la altura real del contenido y puede verse entrecortada.Todavía puede realizar la animación real con CSS, pero necesita usar JavaScript para calcular la altura de los elementos, en lugar de intentar usarlo
auto
. No se requiere jQuery, aunque es posible que deba modificar esto un poco si desea compatibilidad (funciona en la última versión de Chrome :)).fuente
document.getElementById('mydiv')
o$('#mydiv').get()
), y la función alterna entre ocultarlo / mostrarlo. Si configura las transiciones CSS, el elemento se animará automáticamente.min-height
como en la respuesta esperada causa problemas con la velocidad de la animación cuando el tamaño de la lista puede variar mucho).Hubo poca mención de la
Element.scrollHeight
propiedad que puede ser útil aquí y aún se puede usar con una transición CSS pura. La propiedad siempre contiene la altura "completa" de un elemento, independientemente de si su contenido se desborda y cómo se desborda como resultado de la altura contraída (por ejemploheight: 0
).Como tal, para un elemento
height: 0
(efectivamente colapsado por completo), su altura "normal" o "completa" todavía está fácilmente disponible a través de suscrollHeight
valor (invariablemente, una longitud de píxel ).Para tal elemento, suponiendo que ya tiene la transición configurada como, por ejemplo, (usando
ul
según la pregunta original):Podemos desencadenar la "expansión" animada deseada de altura, usando solo CSS, con algo como lo siguiente (aquí asumiendo que la
ul
variable se refiere a la lista):Eso es. Si necesita contraer la lista, cualquiera de las dos siguientes afirmaciones funcionará:
Mi caso de uso particular, giraba en torno a la animación de las listas de desconocido y longitudes menudo considerables, así que no estaba cómoda de decidirse por una arbitraria "suficientemente grande"
height
omax-height
especificación y correr el riesgo de corte del contenido o contenido que de repente se necesita desplazamiento (sioverflow: auto
, por ejemplo) . Además, la flexibilización y el tiempo se rompen conmax-height
soluciones basadas, porque la altura utilizada puede alcanzar su valor máximo mucho antes de lo que tomaríamax-height
alcanzar9999px
. Y a medida que crecen las resoluciones de pantalla, las longitudes de píxeles como9999px
dejan un mal sabor de boca. Esta solución particular resuelve el problema de una manera elegante, en mi opinión.Finalmente, esperamos que las futuras revisiones de CSS aborden la necesidad de los autores de hacer este tipo de cosas de manera aún más elegante: revisar la noción de valores "calculados" frente a "usados" y "resueltos", y considerar si las transiciones deberían aplicarse a las calculadas valores, incluidas las transiciones con
width
yheight
(que actualmente reciben un poco de un tratamiento especial).fuente
Element.scrollHeight
propiedad requiere JavaScript y, como dice claramente la pregunta, quieren hacerlo sin JavaScript.Úselo
max-height
con diferente transición de alivio y retraso para cada estado.HTML:
CSS:
Ver ejemplo: http://jsfiddle.net/0hnjehjc/1/
fuente
999999px
. Esto, por otro lado, cambiará su animación, porque los cuadros se calculan a partir de este valor. Por lo tanto, puede terminar con un "retraso" de animación en una dirección y un final realmente rápido en la otra dirección (corr: funciones de tiempo)No hay valores codificados.
Sin JavaScript
Sin aproximaciones
El truco consiste en utilizar un oculto y duplicado
div
para que el navegador entienda lo que significa 100%.Este método es adecuado siempre que pueda duplicar el DOM del elemento que desea animar.
fuente
transform: scaleY(1)
, ya que esta transición no elimina el espacio.Mientras publico esto, ya hay más de 30 respuestas, pero siento que mi respuesta mejora en la respuesta ya aceptada por Jake.
No estaba contento con el problema que surge del simple uso
max-height
y las transiciones CSS3, ya que, como muchos comentadores notaron, debe establecer sumax-height
valor muy cerca de la altura real o obtendrá un retraso. Vea este JSFiddle para ver un ejemplo de ese problema.Para evitar esto (sin usar JavaScript), agregué otro elemento HTML que transiciona el
transform: translateY
valor CSS.Esto significa ambos
max-height
ytranslateY
se usan:max-height
permite que el elemento empuje hacia abajo los elementos debajo de él, mientrastranslateY
da el efecto "instantáneo" que queremos. El problema conmax-height
todavía existe, pero su efecto se reduce. Esto significa que puede establecer una altura mucho mayor para sumax-height
valor y preocuparse menos por ello.El beneficio general es que en la transición de regreso (el colapso), el usuario ve la
translateY
animación de inmediato, por lo que realmente no importa cuánto tiempomax-height
tome.Solución como violín
fuente
translateY
másscale
porque no me gustó cómoscale
dio ese efecto de compresión.Ok, entonces creo que se me ocurrió una respuesta súper simple ... no
max-height
, usarelative
posicionamiento, trabaja enli
elementos y es puro CSS. No he probado nada más que Firefox, aunque a juzgar por el CSS, debería funcionar en todos los navegadores.FIDDLE: http://jsfiddle.net/n5XfG/2596/
CSS
HTML
fuente
EDITAR: desplácese hacia abajo para obtener una respuesta actualizada.
Estaba haciendo una lista desplegable y vi esta publicación ... muchas respuestas diferentes, pero decido compartir mi lista desplegable también ... No es perfecto, pero al menos usará solo CSS para ¡desplegable! He estado usando transform: translateY (y) para transformar la lista a la vista ...
Puede ver más en la prueba
http://jsfiddle.net/BVEpc/4/
He colocado div detrás de cada li porque mi la lista desplegable proviene de arriba y para mostrarles correctamente esto era necesario, mi código div es:
y pasar el mouse es:
y debido a que la altura ul está establecida en el contenido, puede superar el contenido de su cuerpo, por eso hice esto para ul:
y flotar:
la segunda vez después de la transición es demorada y se ocultará después de que mi lista desplegable se haya cerrado animadamente ...
Espero que alguien más se beneficie de esta.
EDITAR: ¡No puedo creer que las personas realmente usen este prototipo! ¡Este menú desplegable es solo para un submenú y eso es todo! He actualizado uno mejor que puede tener dos submenús para la dirección ltr y rtl con soporte para IE 8.
Fiddle para LTR
Fiddle para RTL
espero que alguien encuentre esto útil en el futuro.
fuente
Puede pasar de la altura: 0 a la altura: automático siempre que también proporcione la altura mínima y la altura máxima.
fuente
Solución Flexbox
Pros:
Contras:
La forma en que funciona es tener siempre una base flexible: auto en el elemento con contenido, y en cambio en cambio flex-grow y flex-shrink.
Editar: JS Fiddle mejorado inspirado en la interfaz Xbox One.
JS Fiddle
fuente
Ampliando la respuesta de @jake, la transición irá hasta el valor de altura máxima, causando una animación extremadamente rápida: si configura las transiciones para ambos: desplazarse y apagarse, puede controlar la velocidad loca un poco más.
Por lo tanto, li: hover es cuando el mouse ingresa al estado y luego la transición en la propiedad no suspendida será la salida del mouse.
Esperemos que esto sea de alguna ayuda.
p.ej:
Aquí hay un violín: http://jsfiddle.net/BukwJ/
fuente
Creo que se me ocurrió una solución realmente sólida.
¡OKAY! Sé que este problema es tan antiguo como Internet, pero creo que tengo una solución que convertí en un complemento llamado transición mutante . Mi solución establece los
style=""
atributos para los elementos rastreados siempre que haya un cambio en el DOM. el resultado final es que puede usar un buen CSS para sus transiciones y no usar soluciones hacky o javascript especial. Lo único que tiene que hacer es configurar lo que desea rastrear en el elemento en cuestión utilizandodata-mutant-attributes="X"
.¡Eso es! Esta solución utiliza MutationObserver para seguir los cambios en el DOM. Debido a esto, realmente no tiene que configurar nada ni usar javascript para animar cosas manualmente. Los cambios se rastrean automáticamente. Sin embargo, debido a que usa MutationObserver, esto solo hará la transición en IE11 +.
Violines!
height: auto
aheight: 100%
height: auto
al agregar niñosfuente
Aquí hay una manera de hacer la transición desde cualquier altura inicial, incluido 0, a automático (tamaño completo y flexible) sin requerir un código fijo por nodo o cualquier código de usuario para inicializar: https://github.com/csuwildcat / transición-auto . Esto es básicamente el santo grial para lo que quieres, creo -> http://codepen.io/csuwldcat/pen/kwsdF . Simplemente coloque el siguiente archivo JS en su página, y todo lo que necesita hacer después de eso es agregar / eliminar un solo atributo booleano -
reveal=""
- de los nodos que desea expandir y contraer.Esto es todo lo que necesita hacer como usuario, una vez que incluya el bloque de código que se encuentra debajo del código de ejemplo:
Aquí está el bloque de código para incluir en su página, después de eso, todo es salsa:
Suelte este archivo JS en su página; todo funciona Just Works ™
/ * Código de altura: auto; en transición * /
/ * Código para DEMO * /
fuente
clip
mi activador de propiedad ficticia, y por alguna razón IE dejó de permitir que el clip se animara. Cambié a la opacidad, y todo funciona de nuevo: codepen.io/csuwldcat/pen/FpzGa . He actualizado el código en la respuesta para que coincida.La respuesta de Jake para animar la altura máxima es genial, pero encontré molesto el retraso causado por establecer una altura máxima.
Se podría mover el contenido plegable a una división interna y calcular la altura máxima obteniendo la altura de la división interna (a través de JQuery sería la altura externa ()).
Aquí hay un enlace jsfiddle: http://jsfiddle.net/pbatey/duZpT
Aquí hay un jsfiddle con la cantidad mínima absoluta de código requerida: http://jsfiddle.net/8ncjjxh8/
fuente
Me doy cuenta de que este hilo está envejeciendo, pero ocupa un lugar destacado en ciertas búsquedas de Google, así que creo que vale la pena actualizarlo.
También solo obtiene / establece la altura del elemento:
Debería volcar este Javascript inmediatamente después de la etiqueta de cierre de target_box en una etiqueta de script en línea.
fuente
Pude hacer esto. Tengo un
.child
y un.parent
div. El div hijo se adapta perfectamente al ancho / alto de los padres con elabsolute
posicionamiento. Luego animé latranslate
propiedad paraY
reducir su valor100%
. Es una animación muy suave, sin fallas ni inconvenientes como cualquier otra solución aquí.Algo como esto, pseudocódigo
Se podría especificar un
height
sobre.parent
, enpx
,%
o como licenciaauto
. Este div luego enmascara el.child
div cuando se desliza hacia abajo.fuente
Publiqué una respuesta con JavaScript y obtuve un voto negativo, así que me molesté e intenté nuevamente, ¡y lo descifré solo con CSS!
Esta solución utiliza algunas 'técnicas':
padding-bottom:100%
'piratear' donde los porcentajes se definen en términos del ancho actual del elemento. Más información sobre esta técnica.Sin embargo, el resultado es que obtenemos una transición eficiente usando solo CSS y una única función de transición para lograr la transición sin problemas; ¡el Santo Grial!
Por supuesto, hay un inconveniente! No puedo averiguar cómo controlar el ancho con el que se corta el contenido (
overflow:hidden
); debido al hack de fondo acolchado, el ancho y la altura están íntimamente relacionados. Sin embargo, puede haber una manera, así que volveremos a ella.https://jsfiddle.net/EoghanM/n1rp3zb4/28/
fuente
input[type="checkbox"]:checked
lugar de:hover
si lo desea (es decir, no desea usar JavaScript para agregar ninguna clase)Aquí hay una solución que acabo de usar en combinación con jQuery. Esto funciona para la siguiente estructura HTML:
y la función:
Luego puede usar una función de clic para establecer y eliminar la altura usando
css()
CSS:
fuente
Recientemente he estado haciendo la transición
max-height
de losli
elementos en lugar del ajusteul
.El razonamiento es que la demora para pequeño
max-heights
es mucho menos notable (si es que lo hace) en comparación con grandemax-heights
, y también puedo establecer mimax-height
valor en relación con elfont-size
de enli
lugar de un gran número arbitrario usandoems
orems
.Si el tamaño de mi fuente es
1rem
, lo configurarémax-height
en algo como3rem
(para acomodar texto envuelto). Puedes ver un ejemplo aquí:http://codepen.io/mindfullsilence/pen/DtzjE
fuente
No he leído todo en detalle, pero recientemente tuve este problema e hice lo siguiente:
Esto le permite tener un div que al principio muestra contenido de hasta 200 px de altura y, al pasar el mouse, su tamaño se vuelve al menos tan alto como todo el contenido del div. El Div no se convierte en 3000 px, pero 3000 px es el límite que estoy imponiendo. Asegúrese de tener la transición en el non: hover, de lo contrario, podría obtener una representación extraña. De esta manera, el: hover hereda del no: hover.
La transición no funciona de px a% o a auto. Necesita usar la misma unidad de medida. Esto funciona bien para mi. Usar HTML5 lo hace perfecto ...
Recuerde que siempre hay una solución alternativa ...; )
Espero que alguien encuentre esto útil
fuente
La solución de altura máxima de Jake funciona bien, si el valor de altura máxima codificado proporcionado no es mucho mayor que la altura real (porque de lo contrario hay retrasos y problemas de sincronización indeseables). Por otro lado, si el valor codificado de forma accidental no es mayor que la altura real, el elemento no se abrirá por completo.
La siguiente solución de CSS también requiere un tamaño codificado que debería ser más grande que la mayoría de los tamaños reales existentes. Sin embargo, esta solución también funciona si el tamaño real es en algunas situaciones mayor que el tamaño codificado. En ese caso, la transición puede saltar un poco, pero nunca dejará un elemento parcialmente visible. Por lo tanto, esta solución también podría usarse para contenido desconocido, por ejemplo, desde una base de datos, donde solo sabe que el contenido generalmente no es mayor que x píxeles, pero hay excepciones.
La idea es utilizar un valor negativo para margen inferior (o margen superior para una animación ligeramente diferente) y colocar el elemento de contenido en un elemento central con desbordamiento: oculto. El margen negativo del elemento de contenido reduce la altura del elemento del medio.
El siguiente código utiliza una transición en el margen inferior de -150 px a 0 px. Esto solo funciona bien siempre que el elemento de contenido no sea superior a 150 px. Además, utiliza una transición en altura máxima para el elemento medio de 0px a 100%. Esto finalmente oculta el elemento del medio si el elemento de contenido es superior a 150 px. Para la altura máxima, la transición solo se usa para retrasar su aplicación por un segundo al cerrar, no para un efecto visual uniforme (y, por lo tanto, puede correr de 0px a 100%).
CSS:
HTML:
El valor para el margen inferior debe ser negativo y lo más cercano posible a la altura real del elemento de contenido. Si (el valor absoluto) es mayor, existen problemas similares de retraso y sincronización que con las soluciones de altura máxima, que sin embargo pueden limitarse siempre que el tamaño codificado no sea mucho mayor que el real. Si el valor absoluto para margen inferior es menor que la altura real, la tansición salta un poco. En cualquier caso, después de la transición, el elemento de contenido se muestra completamente o se elimina por completo.
Para obtener más detalles, consulte la publicación de mi blog http://www.taccgl.org/blog/css_transition_display.html#combined_height
fuente
Puede hacer esto creando una animación inversa (colapso) con clip-path.
fuente
Esto no es exactamente una "solución" al problema, sino más bien una solución alternativa. Solo funciona como está escrito con texto, pero puedo cambiarlo para que funcione con otros elementos según sea necesario, estoy seguro.
Aquí hay un ejemplo: http://codepen.io/overthemike/pen/wzjRKa
Esencialmente, establece el tamaño de fuente en 0 y realiza la transición en lugar de la altura, o la altura máxima, o scaleY (), etc. a un ritmo lo suficientemente rápido como para que la altura se transforme a lo que desea. Actualmente, no es posible transformar la altura real con CSS en automático, pero transformar el contenido dentro es, por lo tanto, la transición del tamaño de fuente.
fuente