← Все вопросы

Как сделать горизонтальное меню (пункты в строку)?

Задан 1 месяц назад1.5к просмотров2 ответа
9

Сверстал меню списком <ul><li>, но пункты идут друг под другом столбиком, а мне нужно в одну строку, как в шапке сайта. Как выстроить элементы навигации горизонтально?

2 ответа

14
✓ Принятый ответ — помог автору

Пункты идут столбиком, потому что <li> — блочные элементы. Самый удобный способ выстроить их в строку — flexbox на <ul>:

<nav>
  <ul class="menu">
    <li><a href="#">Главная</a></li>
    <li><a href="#">О нас</a></li>
    <li><a href="#">Контакты</a></li>
  </ul>
</nav>
.menu {
  display: flex;       /* пункты встают в ряд */
  gap: 24px;           /* расстояние между ними */
  list-style: none;    /* убрать маркеры-точки */
  margin: 0;
  padding: 0;          /* убрать дефолтный отступ списка */
}
.menu a {
  text-decoration: none;
  color: #333;
}

Что здесь важно:

  • display: flex на <ul> ставит все <li> в строку;
  • gap задаёт промежутки без возни с margin;
  • list-style: none убирает маркеры, а padding: 0 — левый отступ, который браузер даёт спискам по умолчанию (иначе меню «съедет» вправо).

Чтобы прижать меню вправо или раскидать логотип и пункты по краям, используйте justify-content:

.menu { justify-content: flex-end; }      /* всё вправо */
/* или для «лого слева, меню справа» */
.header { display: flex; justify-content: space-between; align-items: center; }

Раньше для этого брали display: inline-block или float, но флекс проще и не оставляет щелей между пунктами.

5

Чтобы меню стало адаптивным, добавьте flex-wrap: wrap — на узких экранах пункты перенесутся на новую строку, а не вылезут за край. А для «бургера» на телефоне обычно прячут горизонтальное меню через media query и показывают вертикальное по клику. Но базовый ряд — это именно display: flex + list-style: none + padding: 0.

Ваш ответ

Войдите, чтобы ответить на вопрос.