Журнал • знания • практикаПоиск по сайту

Сайты, дизайн и самостоятельная работа

Найти материал →

Адаптивная навигация на Css: пошаговый видеоразбор без зависимости от ширины устройства

5 минут чтения

Адаптивная навигация на Css: пошаговый видеоразбор без зависимости от ширины устройства

Адаптивную навигацию без привязки к ширине устройства можно собрать на CSS с помощью flex-wrap: пункты меню переносятся, когда им не хватает места в контейнере. Такой подход не требует медиазапросов для конкретных экранов и подходит для меню с обычными ссылками. Ниже - пошаговая инструкция и план видеодемонстрации.

Что важно знать в двух словах

  • Ориентируйтесь на доступное место в контейнере и длину пунктов, а не на модель устройства.
  • Свойство flex-wrap позволяет ссылкам переноситься на следующую строку.
  • Не скрывайте пункты меню и не уменьшайте текст до нечитаемого размера.
  • Проверяйте навигацию клавиатурой, на узких экранах и при увеличенном масштабе.

Для каких случаев метод подходит

Этот способ подходит для горизонтального меню из ссылок, которые могут переноситься на несколько строк: например, для навигации в шапке сайта или панели разделов. Он помогает реализовать адаптивное меню CSS без медиазапросов, завязанных на ширину телефона или планшета.

Метод не подходит, если дизайн требует скрывать пункты за кнопкой раскрытия, сохранять меню строго в одну строку или показывать сложную многоуровневую навигацию. Для таких сценариев потребуется JavaScript либо компонент меню с отдельной логикой управления.

Подготовка и входные условия

Понадобятся HTML-разметка навигации, доступ к CSS и браузер для проверки. Сначала определите, какие ссылки должны быть видны всегда, и убедитесь, что текст пунктов не чрезмерно длинный.

  • Используйте элемент <nav> с понятным доступным названием.
  • Разместите ссылки внутри списка, чтобы структура меню была понятна пользователям и вспомогательным технологиям.
  • Убедитесь, что родительский блок может сжиматься и не имеет фиксированной ширины, мешающей переносу.
  • Подготовьте страницу для проверки на широком и узком окне браузера.

Как выполнить задачу поэтапно

  1. Создайте семантическую структуру

    Добавьте навигацию с названием и списком ссылок. Названия должны описывать назначение разделов.

    <nav class="site-nav" aria-label="Основная навигация">
      <ul class="site-nav__list">
        <li><a href="/services/">Услуги</a></li>
        <li><a href="/projects/">Проекты</a></li>
        <li><a href="/about/">О компании</a></li>
        <li><a href="/contacts/">Контакты</a></li>
      </ul>
    </nav>
  2. Включите перенос элементов

    Сделайте список flex-контейнером и задайте ему flex-wrap: wrap. Браузер перенесёт ссылки на новую строку, когда они не поместятся в доступную ширину.

    .site-nav__list {
      display: flex;
      flex-wrap: wrap;
      gap: 0.5rem 1rem;
      margin: 0;
      padding: 0;
      list-style: none;
    }
    
    .site-nav__list a {
      display: block;
      padding: 0.5rem 0;
    }
  3. Проверьте ограничения родительского блока

    Если меню находится внутри flex- или grid-контейнера, проверьте, не запрещает ли его ширина сжатие. Для элемента меню часто помогает min-width: 0, а для навигации - max-width: 100%.

    .site-nav {
      max-width: 100%;
      min-width: 0;
    }
  4. Настройте вид ссылок и фокус

    Обеспечьте читаемый контраст, достаточные отступы и заметное состояние клавиатурного фокуса. Не удаляйте стандартный контур без замены на хорошо различимый стиль.

    .site-nav__list a:focus-visible {
      outline: 2px solid currentColor;
      outline-offset: 3px;
    }
  5. Проверьте перенос в реальном макете

    Меняйте ширину окна плавно, а не только переключайтесь между готовыми пресетами устройств. Так вы увидите, как меню ведёт себя при любом доступном размере контейнера.

    • Проверьте длинные названия разделов.
    • Убедитесь, что соседние элементы шапки не перекрывают меню.
    • Пройдите по ссылкам клавишей Tab и проверьте заметность фокуса.

Быстрый режим

  1. Разметьте меню как список ссылок внутри <nav>.
  2. Задайте списку display: flex, flex-wrap: wrap и подходящий gap.
  3. Уберите фиксированные ограничения ширины, мешающие сжатию контейнера.
  4. Проверьте ссылки при плавном изменении ширины и при навигации с клавиатуры.

Контроль результата

  • Ссылки остаются видимыми и не обрезаются при сужении контейнера.
  • Перенос строк происходит без наложения текста и элементов шапки.
  • Порядок ссылок остаётся логичным при переносе.
  • Названия пунктов меню читаемы и не обрезаны.
  • Между ссылками достаточно пространства для удобного выбора.
  • Клавиатурный фокус заметен и перемещается по ссылкам в ожидаемом порядке.
  • При увеличении масштаба страницы меню не выходит за пределы контейнера.

Ошибки, которые тормозят результат

  • Фиксированная ширина меню. Она мешает контейнеру подстраиваться под доступное пространство.
  • Запрет переноса. Свойство white-space: nowrap на списке или ссылках может привести к горизонтальному переполнению.
  • Скрытие ссылок через overflow. Пользователь может не заметить, что часть навигации недоступна.
  • Слишком маленький текст. Уменьшение шрифта ради одной строки ухудшает читаемость.
  • Отсутствие видимого фокуса. Это затрудняет использование меню с клавиатуры.
  • Проверка только на одном размере. Перенос может ломаться при промежуточной ширине или длинном тексте.
  • Непроверенные соседние блоки. Логотип, кнопка входа или поиск могут занимать место, необходимое меню.

Рабочие альтернативы

  • Медиазапросы. Подходят, если дизайн должен заметно меняться в конкретных диапазонах ширины, например менять расположение логотипа и меню.
  • Контейнерные запросы. Уместны, когда компонент должен менять оформление в зависимости от ширины своего контейнера, а не всего окна.
  • Раскрывающееся меню с JavaScript. Используйте, если на узком пространстве ссылки должны скрываться за кнопкой. Понадобятся управление состоянием, доступное имя кнопки и клавиатурная проверка.

Для видео о создании адаптивного меню сайта покажите сначала исходную разметку, затем добавление flex-wrap и проверку при изменении ширины контейнера. Такой сценарий наглядно объясняет, как сделать адаптивное меню CSS без привязки к конкретным устройствам и в чём состоит верстка адаптивного меню сайта.

Частые уточнения и ответы

Можно ли обойтись без медиазапросов?

Да, если достаточно переносить ссылки на новую строку. Для более существенного изменения структуры меню могут понадобиться медиазапросы или контейнерные запросы.

Работает ли такой способ на мобильных устройствах?

Да. Перенос определяется доступным пространством контейнера, поэтому меню подстраивается и на узком экране, и в узкой колонке на широком экране.

Нужно ли добавлять JavaScript?

Для переноса ссылок JavaScript не нужен. Он потребуется, если вы хотите скрывать пункты и открывать их по нажатию на кнопку.

Почему пункты меню не переносятся?

Проверьте, что flex-wrap: wrap задано именно flex-контейнеру. Также ищите фиксированную ширину и правила white-space: nowrap, которые могут запрещать перенос.

Как проверить навигацию без набора устройств?

Плавно меняйте ширину окна браузера или контейнера и наблюдайте за переходом между строками. Дополнительно проверьте меню клавиатурой и при увеличенном масштабе.

Подходит ли flex-wrap для многоуровневого меню?

Он управляет переносом элементов в flex-контейнере, но сам по себе не реализует раскрытие подменю. Для многоуровневой навигации отдельно продумайте управление, доступность и поведение на сенсорных экранах.

Scroll to Top