Меню
HTML
<ul class="header-nav">
<li class="dropdown-item">
<a href="#">Товары</a>
<ul class="sub-menu">
<li>
<a href="#">Товар 1</a>
</li>
<li>
<a href="#">Товар 2</a>
</li>
<li>
<a href="#">Товар 3</a>
</li>
</ul>
</li>
<li class="dropdown-item">
<a href="#">Услуги</a>
<ul class="sub-menu">
<li>
<a href="#">Услуга 1</a>
</li>
<li>
<a href="#">Услуга 2</a>
</li>
<li>
<a href="#">Услуга 3</a>
</li>
</ul>
</li>
<li>
<a href="#">FAQ</a>
</li>
<li>
<a href="#">Блог</a>
</li>
<li>
<a href="#">Контакты</a>
</li>
</ul>
CSS
.header-nav {
display: flex;
width: auto;
align-items: center;
flex-wrap: wrap;
row-gap: 20px;
column-gap: 32px;
font-weight: 400;
font-size: 18px;
line-height: 133%;
letter-spacing: -0.02em;
list-style: none;
}
.header-nav .dropdown-item {
position: relative;
}
.header-nav li > a {
position: relative;
color: #2e4a82;
}
.header-nav li > a::after {
content: "";
position: absolute;
left: 50%;
bottom: -3px;
width: 0;
height: 1px;
background-color: #2e4a82;;
transform: translateX(-50%);
transition: width 0.3s ease;
}
.header-nav li > a:hover::after {
width: 100%;
}
.header-nav .dropdown-item > a {
padding-right: 24px;
}
.header-nav .dropdown-item > a::before {
content: "";
position: absolute;
top: 9px;
right: 0;
display: inline-flex;
width: 14px;
aspect-ratio: 14/8;
background: center / contain no-repeat url("data:image/svg+xml,%3Csvg width='14' height='8' viewBox='0 0 14 8' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M12.4697 1.05812C12.7626 0.814042 13.2373 0.814042 13.5302 1.05812C13.8231 1.3022 13.8231 1.69783 13.5302 1.94191L7.53022 6.94191C7.23732 7.18599 6.76256 7.18599 6.46967 6.94191L0.46967 1.94191C0.176777 1.69783 0.176777 1.3022 0.46967 1.05812C0.762563 0.814042 1.23732 0.814042 1.53022 1.05812L6.99994 5.61622L12.4697 1.05812Z' fill='black'/%3E%3C/svg%3E");
transition: transform 0.3s ease;
}
.sub-menu {
position: absolute;
top: 40px;
left: 0;
z-index: 10;
width: max-content;
padding: 15px 25px;
background-color: #fff;
border: 1px solid #000;
opacity: 0;
visibility: hidden;
pointer-events: none;
transition: opacity 0.2s ease, visibility 0.2s ease;
list-style: none;
}
.sub-menu li {
margin-bottom: 10px;
}
.sub-menu li a {
font-size: 16px;
}
.sub-menu li:last-child {
margin-bottom: 0;
}
.dropdown-item--opened > a::before {
transform: rotate(180deg);
}
.dropdown-item--opened .sub-menu {
opacity: 1;
visibility: visible;
pointer-events: auto;
}
.header-nav li.dropdown-item.dropdown-item--opened > a::after {
width: 100%;
}
.header-nav .sub-menu li a::after {
display: none;
}
@media (max-width: 500px) {
.header-nav {
flex-direction: column;
align-items: flex-start;
row-gap: 20px;
}
.sub-menu {
position: static;
opacity: 1;
visibility: visible;
pointer-events: initial;
padding: 12px 0px 0px 6px;
border: none;
background-color: transparent;
}
.header-nav .dropdown-item > a::before {
display: none;
}
.header-nav .dropdown-item > a {
padding-right: 0;
}
}
JS
const dropdownItems = document.querySelectorAll('.dropdown-item');
if (dropdownItems.length) {
dropdownItems.forEach(item => {
const link = item.firstElementChild;
if (link && link.tagName.toLowerCase() === 'a') {
link.addEventListener('click', e => {
e.preventDefault();
});
}
item.addEventListener('click', e => {
e.stopPropagation();
dropdownItems.forEach(el => {
if (el !== item) {
el.classList.remove('dropdown-item--opened');
}
});
item.classList.toggle('dropdown-item--opened');
});
});
document.addEventListener('click', e => {
if (!e.target.closest('.dropdown-item')) {
dropdownItems.forEach(el => el.classList.remove('dropdown-item--opened'));
}
});
}
Выпадающее меню для сайта на HTML, CSS и JavaScript
На этой странице представлен сниппет кода для создания выпадающего меню с подкатегориями. Такой элемент часто используется в шапке сайта, чтобы разместить ссылки на основные разделы: товары, услуги, блог, FAQ и контакты. Меню адаптивное, работает на чистом JavaScript без сторонних библиотек и подходит для любых проектов.
Используя данный пример, вы сможете быстро встроить готовую навигацию на сайт, изменить названия пунктов и стилизовать меню под свой дизайн. Код легко кастомизируется и будет полезен как новичкам, так и опытным верстальщикам.
Особенности:
- Гибкая структура меню на HTML с вложенными списками
- Красивый hover-эффект подчеркивания для ссылок
- Реализация выпадающих подменю на CSS и JS
- Иконка-стрелка для пунктов с подменю
- Автоматическое закрытие открытых подменю при клике вне области меню
- Лёгкая адаптация под любые проекты