Ho appena preparato un'altra soluzione per questo, in cui non è più necessario utilizzare un valore da molto alto a massimo. Ha bisogno di alcune righe di codice javascript per calcolare l'altezza interna del DIV compresso ma dopo tutto, è tutto CSS.
1) Recupero e impostazione dell'altezza
Ottieni l'altezza interna dell'elemento compresso (usando scrollHeight
). Il mio elemento ha una classe .section__accordeon__content
e lo eseguo effettivamente in un forEach()
ciclo per impostare l'altezza per tutti i pannelli, ma hai l'idea.
document.querySelectorAll( '.section__accordeon__content' ).style.cssText = "--accordeon-height: " + accordeonPanel.scrollHeight + "px";
2) Utilizzare la variabile CSS per espandere l'elemento attivo
Quindi, utilizzare la variabile CSS per impostare il max-height
valore quando l'elemento ha una .active
classe.
.section__accordeon__content.active {
max-height: var(--accordeon-height);
}
Esempio finale
Quindi l'esempio completo è il seguente: esegui il primo ciclo attraverso tutti i pannelli di accordeon e memorizza i loro scrollHeight
valori come variabili CSS. Quindi utilizzare la variabile CSS come max-height
valore sullo stato attivo / espanso / aperto dell'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);
}
E il gioco è fatto. Un'animazione adattiva di altezza massima che utilizza solo CSS e alcune righe di codice JavaScript (non è richiesto jQuery).
Spero che questo aiuti qualcuno in futuro (o il mio io futuro per riferimento).
.scrollHeight
funzione DOM non funzionerà in IE <8.0 ( developer.mozilla.org/en/DOM/element.scrollHeight )