Это потому, что вы устанавливаете высоту auto
, а затем пытаетесь получить ее offsetHeight
.
Получение offsetHeight
запускает перекомпоновку , поэтому он уже собирается разметить страницу и попытаться перейти на height: auto
;Поскольку переходы на height: auto
не работают, он будет прыгать прямо на целевую высоту.Затем, когда вы устанавливаете высоту элемента равной значению, которое вы получили от offsetHeight
, элемент уже имеет эту высоту, поэтому переход не будет.
Два способа исправить это:
Более хакерский способ - повернуть оплавление, вызванное offsetHeight
, в свою пользу: просто попробуйте получить значение снова после того, как верните высоту обратно в 0, снова запустив оплавление:
if (current_height == 0)
{
accordion_content.style.height = "auto";
destination = accordion_content.offsetHeight;
accordion_content.style.height = "0px";
// Here is the trick:
accordion_content.offsetHeight // triggers a reflow
}
Другой способзаранее сохранить высоту содержимого элементов аккордеона, поэтому вы просто переходите к этому значению.Это может быть сложно, особенно если содержимое аккордеона может измениться, но оно менее зависит от эзотерического поведения браузера.