Właśnie wymyśliłem dla tego inne rozwiązanie, w którym nie jest już konieczne stosowanie wartości od - dużo do dużej - maksymalnej wysokości. Potrzebuje kilku wierszy kodu javascript, aby obliczyć wewnętrzną wysokość zwiniętego DIV, ale potem wszystko to jest CSS.
1) Pobieranie i ustawianie wysokości
Pobierz wewnętrzną wysokość zwiniętego elementu (używając scrollHeight
). Mój element ma klasę .section__accordeon__content
i faktycznie uruchamiam to w forEach()
pętli, aby ustawić wysokość dla wszystkich paneli, ale masz pomysł.
document.querySelectorAll( '.section__accordeon__content' ).style.cssText = "--accordeon-height: " + accordeonPanel.scrollHeight + "px";
2) Użyj zmiennej CSS, aby rozwinąć aktywny element
Następnie użyj zmiennej CSS, aby ustawić max-height
wartość, gdy element ma .active
klasę.
.section__accordeon__content.active {
max-height: var(--accordeon-height);
}
Ostatni przykład
Pełny przykład wygląda tak: najpierw przejrzyj wszystkie panele akordeonu i zapisz ich scrollHeight
wartości jako zmienne CSS. Następnie użyj zmiennej CSS jako plikumax-height
wartości stanu aktywnego / rozwiniętego / otwartego elementu.
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);
}
I masz to. Adaptacyjna animacja o maksymalnej wysokości wykorzystująca tylko CSS i kilka wierszy kodu JavaScript (nie jest wymagana jQuery).
Mam nadzieję, że to pomoże komuś w przyszłości (lub mojej przyszłej jaźni w celach informacyjnych).
.scrollHeight
funkcja DOM nie działa w IE <8,0 ( developer.mozilla.org/en/DOM/element.scrollHeight )