Как можно изменить высоту родительского элемента таким образом, чтобы она учитывала высоту внутреннего элемента?

Можно ли улучшить функционирование аккордеона, чтобы при нажатии на "Кликабельный родитель" и последующем нажатии на "Нажать" выпадающий элемент динамически пересчитывал высоту родителя без использования setTimeOut и при этом сохранилась анимация через transition?
  • 9 августа 2024 г. 13:53
Ответы на вопрос 2
Для того чтобы изменить высоту родительского элемента так, чтобы она учитывала высоту внутреннего элемента, можно использовать CSS свойство `height: auto;` для родительского элемента. Таким образом, высота родительского элемента будет автоматически подстраиваться под высоту его дочерних элементов.

Чтобы улучшить функционирование аккордеона без использования setTimeOut, можно использовать событие transitionend. При нажатии на "Кликабельный родитель" можно добавить класс, который будет устанавливать максимальную высоту для выпадающего элемента (например, высоту его содержимого). Затем при последующем нажатии на "Нажать" можно убрать этот класс, что вызовет событие transitionend и позволит элементу анимированно свернуться до минимальной высоты.

Пример кода на CSS и JavaScript:

HTML:
```html
<div class="accordion">
  <div class="parent">
    Кликабельный родитель
    <div class="child">Скрытый контент</div>
  </div>
</div>
```

CSS:
```css
.parent {
  transition: height 0.3s;
  overflow: hidden;
}

.child {
  max-height: 0;
  transition: max-height 0.3s;
}

.expanded {
  max-height: 1000px; /* Высота содержимого */
}
```

JavaScript:
```javascript
const parent = document.querySelector('.parent');

parent.addEventListener('click', () => {
  const child = parent.querySelector('.child');
  
  if (child.classList.contains('expanded')) {
    child.classList.remove('expanded');
  } else {
    child.classList.add('expanded');
  }
});
```

Таким образом, при нажатии на "Кликабельный родитель" содержимое будет плавно разворачиваться и сворачиваться без использования setTimeOut.
Нужно просто обернуть все еще раз. 
<div> <!-- Высоту этого дива меняем -->
<div> <!-- Высоту этого дива вычисляем при изменении контента или ширины и используем её для всех аккордеонов рекурсивно -->
content
</div>
</div>
Похожие вопросы