Я реализую компонент, имеющий скрытое содержимое, отображаемое при нажатии кнопки. Я хотел бы выполнить переход на max-height
раскрытого контента, например, так:
<button id="show-hide">Toggle content</button>
<div id="revealable-content" class="content is-collapsed">
Content to be revealed
<a href="https://www.example.com">with a link</a>
</div>
.content {
overflow: hidden;
height: auto;
max-height: 200px;
width: 200px;
background-color: darkgray;
transition: max-height 1000ms;
}
.content.is-collapsed {
max-height: 0
}
const button = document.getElementById('show-hide')
const content = document.getElementById('revealable-content')
let hidden = true
button.addEventListener('click', () => {
hidden = !hidden
if (hidden) {
content.classList.add('is-collapsed')
} else {
content.classList.remove('is-collapsed')
}
})
Пока все хорошо. Теперь я хочу сделать это более доступным, поэтому я добавляю атрибут hidden
к содержимому div и устанавливаю для него значение true или false, когда я знаю, что анимация была выполнена с использованием setTimeout
:
// at the bottom of the event handler...
setTimeout(() => {
content.hidden = hidden
}, 1000)
Это нарушает «расширяющуюся» анимацию, но, как ни странно, не «разрушающуюся» анимацию. При падении анимация перехода запускается в течение 1 секунды, как и ожидалось. Однако при расширении max-height
применяется немедленно без перехода.
См. этот кодовый элемент для демонстрации.
Что происходит, и как я могу это исправить