Сжимающееся меню навигации при прокручивании

 alexei 24/02/2021 - 17:32

Сниппет, позволяющий сжимать меню навигации сайта во время прокручивания страницы при помощи CSS и JavaScript.



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

Шаг 1) Добавляем HTML:

Создаем меню навигации:


<div id="navbar">
  <a href="#default" id="logo">CompanyLogo</a>
  <div id="navbar-right">
    <a class="active" href="#home">Главная</a>
    <a href="#contact">Контакт</a>
    <a href="#about">О нас</a>
  </div>
</div>

Шаг 2) Добавляем CSS:

Задаем стили для меню навигации:


/* Создаем зафиксированную панель навигации */
#navbar {
  overflow: hidden;
  background-color: #f1f1f1;
  padding: 90px 10px; /* Большой отступ, который будет сжиматься (при помощи JS) */
  transition: 0.4s; /* Добавляет эффект трансформации при уменьшении отступа */
  position: fixed; /* Зафиксируем панель */
  width: 100%;
  top: 0; /* Прижмем к верху */
  z-index: 99;
}

/* Стили ссылок навигационной панели */
#navbar a {
  float: left;
  color: black;
  text-align: center;
  padding: 12px;
  text-decoration: none;
  font-size: 18px;
  line-height: 25px;
  border-radius: 4px;
}

/* Стили логотипа */
#navbar #logo {
  font-size: 35px;
  font-weight: bold;
  transition: 0.4s;
}

/* Стили ссылок при наведении мыши */
#navbar a:hover {
  background-color: #ddd;
  color: black;
}

/* Стили активной/выбранной ссылки */
#navbar a.active {
  background-color: dodgerblue;
  color: white;
}

/* Отображаем некоторые ссылки справа */
#navbar-right {
  float: right;
}

/* Добавляем адаптивность – при ширине экрана меньше 580px,
отображаем ссылки панели друг над другом */
@media screen and (max-width: 580px) {
  #navbar {
    padding: 20px 10px !important;
   /* !important нужно, чтобы JavaScript не переопределил отступы на маленьком экране */
  }
  #navbar a {
    float: none;
    display: block;
    text-align: left;
  }
  #navbar-right {
    float: none;
  }
}

Шаг 3) Добавляем JavaScript:


// Когда пользователь прокручивает страницу вниз дальше, чем на 80px
// от верха документа, изменяется отступы панели и размер шрифта логотипа
window.onscroll = function() {scrollFunction()};

function scrollFunction() {
  if (document.body.scrollTop > 80 || document.documentElement.scrollTop > 80) {
    document.getElementById("navbar").style.padding = "30px 10px";
    document.getElementById("logo").style.fontSize = "25px";
  } else {
    document.getElementById("navbar").style.padding = "80px 10px";
    document.getElementById("logo").style.fontSize = "35px";
  }
}