Acabo de preparar otra solución para esto, donde ya no es necesario usar un valor de -much a high-max-height. Necesita algunas líneas de código JavaScript para calcular la altura interna del DIV colapsado, pero después de eso, todo es CSS.
1) Recolección y ajuste de altura
Obtenga la altura interna del elemento contraído (usando scrollHeight
). Mi elemento tiene una clase .section__accordeon__content
y en realidad lo ejecuto en un forEach()
bucle para establecer la altura de todos los paneles, pero se entiende la idea.
document.querySelectorAll( '.section__accordeon__content' ).style.cssText = "--accordeon-height: " + accordeonPanel.scrollHeight + "px";
2) Use la variable CSS para expandir el elemento activo
Luego, use la variable CSS para establecer el max-height
valor cuando el elemento tenga una .active
clase.
.section__accordeon__content.active {
max-height: var(--accordeon-height);
}
Ejemplo final
Entonces, el ejemplo completo es así: primero recorra todos los paneles de acordeón y almacene sus scrollHeight
valores como variables CSS. Luego use la variable CSS como el max-height
valor en el estado activo / expandido / abierto del elemento.
Javascript:
document.querySelectorAll( '.section__accordeon__content' ).forEach(
function( accordeonPanel ) {
accordeonPanel.style.cssText = "--accordeon-height: " + accordeonPanel.scrollHeight + "px";
}
);
CSS:
.section__accordeon__content {
max-height: 0px;
overflow: hidden;
transition: all 425ms cubic-bezier(0.465, 0.183, 0.153, 0.946);
}
.section__accordeon__content.active {
max-height: var(--accordeon-height);
}
Y ahí lo tienes. Una animación adaptativa de altura máxima que utiliza solo CSS y algunas líneas de código JavaScript (no se requiere jQuery).
Espero que esto ayude a alguien en el futuro (o mi futuro yo como referencia).
.scrollHeight
función DOM no funcionará en IE <8.0 ( developer.mozilla.org/en/DOM/element.scrollHeight )