@pilolin
HTML программист

Как реализовать dropdown под разное количество текста?

Делаю блок который может сворачиваться тем самым пряча часть контента, но проблема возникает в том что невозможно угадать высоту контента в свернутом виде на разных разрешениях часть строки может выглядывать, потому что разный размер шрифта и разное количество текста, где то 1 параграф большой, а где то 2 маленьких. Вариант разделить на 2 блока тот что всегда виден и второй что скрыт/развернут не подходит. Что можно придумать в этом случае?

<div class="dropdown" aria-expanded="false" data-height="высота в свернутом виде">
  <div class="dropdown__content">
      <!-- какой то текстовый контент -->
  </div>
  <button class="dropdown__button">Развернуть/Свернуть</button>
</div>

document.addEventListener('click', e => {
	if( !e.target.closest('.dropdown__button') ) return;
  
	const dropdown = e.target.closest('.dropdown');
	const dropdownContent = dropdown.querySelector('.dropdown__content');
	const dropdownButton = e.target.closest('.dropdown__button');
	const opened = (dropdown.getAttribute('aria-expanded') === 'true');

	if(opened) {
		dropdown.setAttribute('aria-expanded', false);
 		dropdownContent.style.maxHeight = dropdown.dataset.height + 'px';
	} else {
  		dropdown.setAttribute('aria-expanded', true);
  		dropdownContent.style.maxHeight = calcHeightContent(dropdownContent) + 'px';  
	}
})

function calcHeightContent(element) {
	const containerClone = element.cloneNode(true);
	let naturalHeight = 0;
	containerClone.style.position = 'absolute';
	containerClone.style.visibility = 'hidden';
	containerClone.style.opacity = 0;
	containerClone.style.maxHeight = '100%';
	containerClone.style.zIndex = -1;
	element.parentNode.append(containerClone);
	naturalHeight = containerClone.clientHeight;
	containerClone.remove();

	return naturalHeight;
}


  • Вопрос задан
  • 61 просмотр
Пригласить эксперта
Ответы на вопрос 1
profesor08
@profesor08 Куратор тега JavaScript
При раскрытии смотри высоту блока scrollHeight, анимируй раскрытие. Потом устанавливай высоту auto. При закрытии, устанавливай высоту в значение scrollHeight и анимируй уменьшение.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы