Ich habe mir gerade eine andere Lösung dafür ausgedacht, bei der es nicht mehr notwendig ist, einen Wert von viel bis hoher maximaler Höhe zu verwenden. Es werden einige Zeilen Javascript-Code benötigt, um die innere Höhe des reduzierten DIV zu berechnen, aber danach ist alles CSS.
1) Abrufen und Einstellen der Höhe
Holen Sie sich die innere Höhe des reduzierten Elements (mit scrollHeight). Mein Element hat eine Klasse .section__accordeon__contentund ich führe diese tatsächlich in einer forEach()Schleife aus, um die Höhe für alle Bedienfelder festzulegen, aber Sie haben die Idee.
document.querySelectorAll( '.section__accordeon__content' ).style.cssText = "--accordeon-height: " + accordeonPanel.scrollHeight + "px";
2) Verwenden Sie die CSS-Variable, um das aktive Element zu erweitern
Verwenden Sie als Nächstes die CSS-Variable, um den max-heightWert festzulegen, wenn das Element eine .activeKlasse hat.
.section__accordeon__content.active {
max-height: var(--accordeon-height);
}
Letztes Beispiel
Das vollständige Beispiel sieht also so aus: Durchlaufen Sie zuerst alle Accordeon-Panels und speichern Sie ihre scrollHeightWerte als CSS-Variablen. Verwenden Sie als Nächstes die CSS-Variable als max-heightWert für den aktiven / erweiterten / offenen Status des Elements.
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);
}
Und da hast du es. Eine adaptive Animation mit maximaler Höhe, die nur CSS und einige Zeilen JavaScript-Code verwendet (keine jQuery erforderlich).
Hoffe, dies hilft jemandem in der Zukunft (oder meinem zukünftigen Selbst als Referenz).
.scrollHeightDOM-Funktion in IE <8.0 ( developer.mozilla.org/en/DOM/element.scrollHeight ) nicht funktionieren