Показать сообщение отдельно
  #1 (permalink)  
Старый 25.04.2021, 18:20
Интересующийся
Отправить личное сообщение для 1111 Посмотреть профиль Найти все сообщения от 1111
 
Регистрация: 05.12.2018
Сообщений: 11

Плавное открывание элемента
Здравствуйте,

Есть блок nav, который при нажатии на бургер должен оттолкнуть все ниже стоящее элементы с плавным открыванием, для этого я использую свойство heigth для nav в котором указываю высоту, но проблема в том, что могут добавляться пункты в nav, и тогда нужно в ручную пересчитывать высоту в свойстве height (если указать height: auto; то transition не срабатывает).
Получить высоту через Js я тоже не могу, т.к. при загрузки страницы, nav скрытый.

Вопрос: Как можно сделать плавное открывание меню и чтобы оно работало при любом количестве элементов в nav?

<header class="header">
  <div class="burger">
        <span class="burger__icon"></span>
    </div>
    <div class="logo">
        <a class="logo__link" href="/">
            <img src="#" alt="Logo" class="logo__img" width="100" height="26">
        </a>
    </div>
    <nav class="nav nav--hide">
        <ul class="nav__list">
            <li class="nav__item">
                <a class="nav__link" href="#">Оплата и доставка</a>
            </li>
            <li class="nav__item">
                <a class="nav__link" href="#">Контакты</a>
            </li>
        </ul>
        <p class="nav__caption">Caption 1</p>
        <ul class="nav__list">
            <li class="nav__item">
                <a class="nav__link" href="#">1</a>
            </li>
            <li class="nav__item">
                <a class="nav__link" href="#">2</a>
            </li>
            <li class="nav__item">
                <a class="nav__link" href="#">3</a>
            </li>
            <li class="nav__item">
                <a class="nav__link" href="#">4</a>
            </li>
            <li class="nav__item">
                <a class="nav__link" href="#">5</a>
            </li>
        </ul>
        <p class="nav__caption">Caption 2</p>
        <ul class="nav__list">
            <li class="nav__item">
                <a class="nav__link" href="#">1</a>
            </li>
            <li class="nav__item">
                <a class="nav__link" href="#">2</a>
            </li>
            <li class="nav__item">
                <a class="nav__link" href="#">3</a>
            </li>
            <li class="nav__item">
                <a class="nav__link" href="#">4</a>
            </li>
            <li class="nav__item">
                <a class="nav__link" href="#">5</a>
            </li>
            <li class="nav__item">
                <a class="nav__link" href="#">6</a>
            </li>
            <li class="nav__item">
                <a class="nav__link" href="#">7</a>
            </li>
        </ul>
    </nav>
</header>
<style>
img {
	max-width: 100%;
  height: auto;
}

.header {
  position: relative;
  max-width: 1440px;
  width: 100%;
  padding: 0;
  margin: 0 auto;
}

.burger {
  position: absolute;
  top: 7px;
  width: 30px;
  height: 21px;
  padding-left: 5px;
  cursor: pointer;
}

.burger__icon {
  width: 30px;
  height: 2px;
  background-color: #8978B7;
  display: block;
}

.burger__icon::before,
.burger__icon::after 
{
  content: "";
  position: absolute;
  top: 9px;
  width: 30px;
  height: 2px;
  background-color: inherit;
  display: block;
}

.burger__icon::after {
 top: 19px; 
}

.burger:hover {
  opacity: 0.5;
}

.logo {
	width: 100%;
  padding: 10px 0;
  margin: 0;
  text-align: center;
  border-bottom: 1px solid #8978B7;
}

.nav {
  width: 100%;
  height: auto;
  transition: height 500ms linear;
  overflow: hidden;
}

.nav--hide {
  height: 0px;
}

.nav__caption {
  background-color: #474F80;
  color: #ffffff;
  text-align: center;
  padding: 5px 0;
  font-weight: bold;
  text-transform: uppercase;
  font-size: 16px;
}

.nav__list {
  padding: 0;
  margin: 0;
	list-style-type: none;
  text-align: center;
}

.nav__item {
  border-bottom: 1px solid #8978B7;
  padding: 5px 0;
}

.nav__item:last-child {
	border-bottom: none;  
}

.nav__link {
	text-decoration: none;
  color: #8978B7;
}

.nav__link:hover {
  opacity: 1;
  color: #423663;
}
.nav__link:active {
  opacity: 0.5;
}
</style>


const burger = document.querySelector('.burger');
const nav = document.querySelector('.nav');
const onBurgerClick = () => {
  nav.classList.toggle('nav--hide');
};

burger.addEventListener('click', onBurgerClick);



jsfiddle
https://jsfiddle.net/4vpyq369/1/
Ответить с цитированием