Bootstrap 4 сниппет: адаптивное боковое меню

Bootstrap 4 сниппет: адаптивное боковое меню

Точнее, боковое меню, которое при уменьшении размера браузера трансформируется в стандартное для Bootstrap верхнее меню. Ну а чтобы не было так уж скучно, добавим ещё и аккордеон для пунктов второго уровня. В конце поста будет линк на Codepen, где можно посмотреть и исходный код, и сниппет в действии.

HTML

Всё до безобразия просто: копируем навигацию с сайта Bootstrap и немного её меняем. Прежде всего, в тэг списка пунктов меню добавим класс sidenav и идентификатор navAccordion:

<nav class="navbar navbar-expand-lg navbar-dark fixed-top bg-dark">
  <a class="navbar-brand" href="#">Sidebar Nav</a>
  <button
    class="navbar-toggler"
    type="button"
    data-toggle="collapse"
    data-target="#navbarCollapse"
    aria-controls="navbarCollapse"
    aria-expanded="false"
    aria-label="Toggle navigation"
  >
    <span class="navbar-toggler-icon"></span>
  </button>

  <div class="collapse navbar-collapse" id="navbarCollapse">
    <ul class="navbar-nav mr-auto sidenav" id="navAccordion">
      ...
    </ul>
    ...

 

А в ссылки, указывающие на пункты второго уровня добавим класс nav-link-collapse и конечно же атрибуты для аккордеона, которые опять-таки можно посмотреть на соответствующей странице документации Bootstrap. Т.е. пукнт меню с вложенными подпунктами будет выглядеть так:

<li class="nav-item">
  <a
    class="nav-link nav-link-collapse"
    href="#"
    id="hasSubItems"
    data-toggle="collapse"
    data-target="#collapseSubItems2"
    aria-controls="collapseSubItems2"
    aria-expanded="false"
  >Item 2</a>
  <ul class="nav-second-level collapse" id="collapseSubItems2" data-parent="#navAccordion">
    <li class="nav-item">
      <a class="nav-link" href="#">
        <span class="nav-link-text">Item 2.1</span>
      </a>
    </li>
    <li class="nav-item">
      <a class="nav-link" href="#">
        <span class="nav-link-text">Item 2.2</span>
      </a>
    </li>
  </ul>
</li>

 

CSS

Ключевой момент – медиа-запрос для sidenav. Зададим абсолютное позиционирование с желаемой шириной и растянем боковую панель на всю высоту окна. Также укажем подходящий для нашей цели flex-direction. При этом не забудем «отодвинуть» основной контент влево на ширину, равную ширине бокового меню:

@media (min-width: 992px) {
  .sidenav {
    position: absolute;
    top: 0;
    left: 0;
    width: 230px;
    height: calc(100vh - 3.5rem);
    margin-top: 3.5rem;
    background: #343a40;
    box-sizing: border-box;
    border-top: 1px solid rgba(0, 0, 0, 0.3);
  }

  .navbar-expand-lg .sidenav {
    flex-direction: column;
  }

  .content-wrapper {
    margin-left: 230px;
  }

  .footer {
    width: calc(100% - 230px);
    margin-left: 230px;
  }
}

 

Разумеется, чтобы сработало абсолютное позиционирование для меню, нужно задать относительное позиционирование для родителя (тэг html).

html {
    position: relative;
    ...
}

 

Кроме вышеописанного, будет совсем не лишним показать пользователю, что некоторые пункты меню раскрываются. Для чего справа от таких пунктов добавим знак +, а в раскрытом состоянии, соответственно, минус (и да поможет нам с символами Font Awesome):

.nav-link-collapse:after {
  float: right;
  content: '\f067';
  font-family: 'FontAwesome';
}

.nav-link-show:after {
  float: right;
  content: '\f068';
  font-family: 'FontAwesome';
}

 

Класса nav-link-show в html коде у нас как бы и нет, но при кликах на меню с подпунктами его добавлением займётся JavaScript.

JavaScript

Задача JS – при необходимости изменить минус на плюс у раскрытых пунктов меню, за исключением того, на котором кликнули. У последнего же будем просто переключать класс nav-link-show, т.е. если его не было – добавим, если был – удалим. jQuery позволяет это сделать просто, без всяких циклов и лишней головной боли:

$(document).ready(function() {
  $('.nav-link-collapse').on('click', function() {
    $('.nav-link-collapse').not(this).removeClass('nav-link-show');
    $(this).toggleClass('nav-link-show');
  });
});

 

Напоследок обещанная ссылка на демо и исходники:

Хотите предложить работу?
Контакты