
Bootstrap 4 сниппет: адаптивное боковое меню
20.06.2018 11:40 | HTML & CSS
Точнее, боковое меню, которое при уменьшении размера браузера трансформируется в стандартное для 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');
});
});
Напоследок обещанная ссылка на демо и исходники: