иконка discount

Скидка 15% по промокоду

кибер понедельник до 01.12иконка discount
CYBER2025
логотип PurpleSchool
логотип PurpleSchool

Функция append в Go Golang

Автор

Олег Марков

Введение

Шапка в контексте веб‑разработки и интерфейсов — это верхняя часть страницы или приложения, которая появляется на всех или большинстве экранов и содержит ключевые элементы навигации и брендинга. Вы её видите везде: логотип, главное меню, кнопка входа, иногда строка поиска, уведомления и т.п. Часто шапка реализуется как фиксированный элемент, который остается при прокрутке, или как адаптивный блок, перестраивающийся под разные размеры экрана.

Смотрите, здесь важно понимать две вещи:

  1. Шапка — это не только верстка (HTML и CSS), но и логика поведения (JavaScript).
  2. Хорошо спроектированная шапка избавляет вас от множества проблем: от верстки до поддержки и доработок.

В этой статье мы разберем:

  • из чего состоит типичная шапка;
  • как сверстать базовую шапку на HTML и CSS;
  • как сделать адаптивную шапку для мобильных устройств;
  • как реализовать липкую (sticky) или фиксированную шапку;
  • как добавить динамическое поведение на JavaScript;
  • как структурировать код, чтобы шапку было удобно поддерживать и расширять.

Я покажу вам примеры кода и по шагам объясню, что и зачем делается.

Структура шапки: базовые элементы

Основные составляющие шапки

Чаще всего шапка содержит:

  • логотип или название продукта;
  • основную навигацию (меню);
  • вспомогательные элементы: кнопка входа/регистрации, иконки профиля, корзины, уведомлений;
  • поиск (необязательно);
  • переключатели языка/темы/валюты и т.д.

Чтобы шапку было просто поддерживать, её лучше разбивать на логические области:

  • левый блок — логотип;
  • центральный блок — навигация;
  • правый блок — действия пользователя.

Давайте разберемся, как это оформить в HTML.

Базовая HTML-разметка шапки

Сейчас я покажу вам простой, но удобный каркас шапки.

<header class="site-header">
  <div class="site-header__inner">
    <!-- Логотип / бренд -->
    <a href="/" class="site-header__logo">
      <!-- Обычно здесь логотип в виде изображения или текста -->
      <span class="site-header__logo-text">MyProject</span>
    </a>

    <!-- Главное меню -->
    <nav class="site-header__nav" aria-label="Главная навигация">
      <ul class="site-header__nav-list">
        <!-- Каждый пункт меню — отдельный элемент списка -->
        <li class="site-header__nav-item">
          <a href="/features" class="site-header__nav-link">Функции</a>
        </li>
        <li class="site-header__nav-item">
          <a href="/pricing" class="site-header__nav-link">Цены</a>
        </li>
        <li class="site-header__nav-item">
          <a href="/blog" class="site-header__nav-link">Блог</a>
        </li>
        <li class="site-header__nav-item">
          <a href="/contacts" class="site-header__nav-link">Контакты</a>
        </li>
      </ul>
    </nav>

    <!-- Блок действий пользователя -->
    <div class="site-header__actions">
      <!-- Например, кнопка входа -->
      <a href="/login" class="btn btn--secondary">Войти</a>
      <!-- И кнопка регистрации -->
      <a href="/signup" class="btn btn--primary">Регистрация</a>
    </div>
  </div>
</header>

Обратите внимание на несколько моментов:

  • Мы используем семантический тег header — это помогает доступности и SEO.
  • Внутри есть nav с атрибутом aria-label — это полезно для экранных читалок.
  • Меню оформлено через список ul/li — это структурирует навигацию и удобно стилизуется.
  • Используем модульные классы site-header... — вам будет проще масштабировать стиль.

Теперь давайте посмотрим, как оформить это в CSS.

Базовая стилизация шапки

Верстка шапки с помощью flexbox

Наша задача: разместить логотип слева, меню по центру, действия справа. С flexbox это делается довольно просто.

/* Общий контейнер шапки */
.site-header {
  position: relative;           /* Пока шапка обычная, не фиксированная */
  z-index: 100;                 /* Чуть выше основного контента */
  background-color: #ffffff;    /* Белый фон */
  border-bottom: 1px solid #eee;/* Легкая линия снизу */
}

/* Внутренняя обертка для выравнивания содержимого */
.site-header__inner {
  max-width: 1200px;            /* Ограничиваем ширину по центру экрана */
  margin: 0 auto;               /* Центрируем содержимое */
  display: flex;                /* Включаем flexbox */
  align-items: center;          /* Выравниваем элементы по вертикали */
  justify-content: space-between; /* Разносим логотип и действия по краям */
  padding: 12px 16px;           /* Внутренние отступы */
  box-sizing: border-box;       /* Учитываем padding в ширине */
}

/* Логотип */
.site-header__logo {
  display: inline-flex;         /* Чтобы можно было выровнять содержимое */
  align-items: center;          /* Вертикальное выравнивание текста/иконки */
  text-decoration: none;        /* Убираем подчеркивание */
}

.site-header__logo-text {
  font-size: 20px;              /* Крупный текст для бренда */
  font-weight: 700;             /* Жирное начертание */
  color: #222;                  /* Темный текст */
}

/* Навигация */
.site-header__nav {
  margin: 0 24px;               /* Небольшой отступ слева и справа */
}

.site-header__nav-list {
  display: flex;                /* Горизонтальный список */
  gap: 16px;                    /* Расстояние между пунктами меню */
  list-style: none;             /* Убираем маркеры списка */
  margin: 0;                    /* Убираем внешние отступы по умолчанию */
  padding: 0;                   /* Убираем внутренние отступы по умолчанию */
}

.site-header__nav-link {
  text-decoration: none;        /* Убираем подчеркивание */
  color: #555;                  /* Спокойный базовый цвет */
  font-size: 14px;
  padding: 4px 0;               /* Чуть увеличиваем кликабельную область */
}

.site-header__nav-link:hover,
.site-header__nav-link:focus {
  color: #000;                  /* Подсветка при наведении и фокусе */
}

/* Блок действий пользователя */
.site-header__actions {
  display: flex;
  align-items: center;
  gap: 8px;                     /* Расстояние между кнопками */
}

/* Базовые стили кнопок */
.btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  padding: 6px 12px;
  border-radius: 4px;
  font-size: 14px;
  border: 1px solid transparent;
  text-decoration: none;
  cursor: pointer;
}

/* Вторичная кнопка (контурная) */
.btn--secondary {
  color: #333;
  background-color: #ffffff;
  border-color: #ccc;
}

/* Основная кнопка */
.btn--primary {
  color: #ffffff;
  background-color: #007bff;    /* Синий цвет */
  border-color: #007bff;
}

.btn--primary:hover,
.btn--primary:focus {
  background-color: #0069d9;    /* Чуть темнее при наведении */
  border-color: #0062cc;
}

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

Теперь давайте посмотрим, как сделать эту шапку удобной на мобильных устройствах.

Адаптивная шапка и мобильное меню

Зачем нужна адаптивность шапки

На десктопе много горизонтального места, а на телефоне — нет. Если попытаться показать то же меню из 6–8 пунктов на ширине 320–375 пикселей, ссылки будут либо слипаться, либо переноситься в две строки, что выглядит плохо и неудобно.

Типичное решение — «гамбургер»-меню:

  • на широкой ширине показываем полное меню;
  • на узкой — скрываем пункты меню, показываем иконку кнопки;
  • по нажатию открываем выпадающее/выезжающее меню.

Давайте реализуем такой вариант.

HTML-разметка для мобильного меню

Нам нужно добавить кнопку, которая будет управлять видимостью навигации.

<header class="site-header">
  <div class="site-header__inner">
    <a href="/" class="site-header__logo">
      <span class="site-header__logo-text">MyProject</span>
    </a>

    <!-- Кнопка открытия мобильного меню -->
    <button class="site-header__burger" type="button" aria-label="Открыть меню">
      <!-- Здесь можно использовать SVG или псевдоэлементы -->
      <span class="site-header__burger-line"></span>
      <span class="site-header__burger-line"></span>
      <span class="site-header__burger-line"></span>
    </button>

    <nav class="site-header__nav" aria-label="Главная навигация">
      <ul class="site-header__nav-list">
        <li class="site-header__nav-item">
          <a href="/features" class="site-header__nav-link">Функции</a>
        </li>
        <li class="site-header__nav-item">
          <a href="/pricing" class="site-header__nav-link">Цены</a>
        </li>
        <li class="site-header__nav-item">
          <a href="/blog" class="site-header__nav-link">Блог</a>
        </li>
        <li class="site-header__nav-item">
          <a href="/contacts" class="site-header__nav-link">Контакты</a>
        </li>
      </ul>
    </nav>

    <div class="site-header__actions">
      <a href="/login" class="btn btn--secondary">Войти</a>
      <a href="/signup" class="btn btn--primary">Регистрация</a>
    </div>
  </div>
</header>

Теперь вы увидите, как это выглядит в стилях.

CSS: скрытие меню и показ «бургер»-кнопки

Подход такой:

  • на десктопе кнопка burger скрыта, меню видно;
  • на мобильном наоборот — меню скрыто, кнопка видно;
  • при открытии меню с помощью класса модификатора показываем навигацию.
/* Кнопка "бургер" по умолчанию скрыта (для больших экранов) */
.site-header__burger {
  display: none;                /* На десктопе не показываем */
  flex-direction: column;       /* Линии одна под другой */
  justify-content: center;
  gap: 4px;
  width: 32px;
  height: 32px;
  padding: 0;
  border: none;
  background: transparent;
  cursor: pointer;
}

/* Линии в "бургер"-кнопке */
.site-header__burger-line {
  width: 20px;
  height: 2px;
  background-color: #333;
  border-radius: 1px;
}

/* Медиа-запрос для мобильных устройств */
@media (max-width: 768px) {
  .site-header__inner {
    /* На мобильных можем чуть по‑другому распределить элементы */
    justify-content: space-between;
  }

  /* Показываем "бургер" на мобильных */
  .site-header__burger {
    display: flex;
  }

  /* Прячем меню и действия по умолчанию */
  .site-header__nav,
  .site-header__actions {
    display: none;
  }

  /* Оформляем раскрытое мобильное меню */
  .site-header--menu-open .site-header__nav {
    display: block;             /* Показываем меню под шапкой */
    position: absolute;
    top: 100%;                  /* Сразу под шапкой */
    left: 0;
    right: 0;
    background-color: #ffffff;
    border-bottom: 1px solid #eee;
  }

  .site-header--menu-open .site-header__nav-list {
    display: flex;
    flex-direction: column;     /* Вертикальное меню */
    padding: 8px 0;
  }

  .site-header--menu-open .site-header__nav-link {
    padding: 10px 16px;         /* Увеличиваем область нажатия */
    display: block;
  }

  /* Можно также показывать блок действий в меню */
  .site-header--menu-open .site-header__actions {
    display: flex;              /* Показываем кнопки входа/регистрации */
    flex-direction: column;
    padding: 8px 16px 12px;
    gap: 8px;
  }
}

Здесь я использую класс-модификатор site-header--menu-open. Он будет добавляться к корневому элементу шапки при открытии меню. Давайте теперь посмотрим на JavaScript.

JavaScript: логика открытия и закрытия меню

Задача:

  • при клике по burger добавлять/убирать класс site-header--menu-open на header;
  • по возможности закрывать меню при переходе по пункту навигации.
<script>
// Ждем, пока DOM будет готов
document.addEventListener('DOMContentLoaded', function () {
  // Находим DOM-элементы
  var header = document.querySelector('.site-header');
  var burger = document.querySelector('.site-header__burger');
  var navLinks = document.querySelectorAll('.site-header__nav-link');

  // Обработчик клика по "бургер"-кнопке
  burger.addEventListener('click', function () {
    // Переключаем класс, который открывает/закрывает меню
    header.classList.toggle('site-header--menu-open');
  });

  // Закрываем меню при клике по пункту навигации (на мобильном)
  navLinks.forEach(function (link) {
    link.addEventListener('click', function () {
      // Убираем класс, если меню было открыто
      header.classList.remove('site-header--menu-open');
    });
  });
});
</script>

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

Фиксированная и липкая шапка

Иногда нужно, чтобы шапка всегда оставалась видимой при прокрутке. Есть две основных модели:

  • фиксированная шапка (fixed) — всегда прижата к верхнему краю окна;
  • липкая шапка (sticky) — ведет себя как обычная, но когда доходит до верха при прокрутке, «прилипает» к нему.

Давайте разберем обе.

Фиксированная шапка

Сделать шапку фиксированной довольно просто — нужно изменить пару свойств CSS.

/* Вариант фиксированной шапки */
.site-header--fixed {
  position: fixed;   /* Фиксируем относительно окна браузера */
  top: 0;            /* Прижимаем к верху */
  left: 0;
  right: 0;
}

Но здесь есть важный момент: когда вы делаете шапку position: fixed, она «выпрыгивает» из потока документа, и основной контент поднимается вверх, оказываясь под ней. Чтобы этого не произошло, добавьте сверху отступ для основного контейнера.

/* Например, для основного содержимого страницы */
.page-content {
  padding-top: 64px;  /* Высота шапки (примерно) */
}

Смотрите, высоту лучше не угадывать, а привязать к реальному значению. Для этого можно использовать CSS‑переменную.

:root {
  --site-header-height: 64px; /* Здесь задаем высоту шапки один раз */
}

.site-header__inner {
  min-height: var(--site-header-height);
}

.site-header--fixed + .page-content {
  /* Добавляем отступ сразу после фиксированной шапки */
  padding-top: var(--site-header-height);
}

Теперь, когда вы добавите класс site-header--fixed к header, страница не «прыгнет», а контент аккуратно начнется под шапкой.

Липкая шапка (sticky)

Липкую шапку еще проще сделать только средствами CSS.

.site-header--sticky {
  position: sticky;     /* Липкое позиционирование */
  top: 0;               /* Начинает «липнуть» при достижении верха */
  z-index: 100;         /* Чтобы быть поверх контента */
}

При этом header остается в потоке документа, поэтому дополнительный отступ к контенту обычно не нужен. Но важно помнить:

  • позиционирование sticky работает, только если над элементом нет ограничивающих overflow: hidden / auto контейнеров (они создают новый контекст прокрутки);
  • поддержка в современных браузерах хорошая, но если у вас есть очень старые браузеры, может понадобиться запасной вариант.

Если вы хотите включать/выключать липкость динамически, можете добавить условный класс через JavaScript, но в большинстве случаев достаточно статического варианта.

Дополнительные элементы шапки

Строка поиска в шапке

Часто в шапке нужен простой поиск по сайту. Давайте посмотрим, как его аккуратно встроить.

<div class="site-header__search">
  <!-- Форма отправляет запрос на страницу поиска -->
  <form action="/search" method="get" class="search-form">
    <!-- Поле ввода запроса -->
    <input
      type="search"
      name="q"
      class="search-form__input"
      placeholder="Поиск по сайту"
      aria-label="Поиск по сайту"
    >
    <!-- Кнопка отправки -->
    <button type="submit" class="search-form__button">
      <!-- Здесь может быть иконка лупы -->
      Найти
    </button>
  </form>
</div>

И минимальная стилизация:

.site-header__search {
  margin: 0 16px;
  flex: 1;                       /* Можно дать блоку поиска возможность растягиваться */
  max-width: 300px;              /* Но ограничить максимальную ширину */
}

.search-form {
  display: flex;
  align-items: center;
}

.search-form__input {
  flex: 1;
  padding: 6px 8px;
  border-radius: 4px 0 0 4px;
  border: 1px solid #ccc;
  border-right: none;
  font-size: 14px;
}

.search-form__button {
  padding: 6px 10px;
  border-radius: 0 4px 4px 0;
  border: 1px solid #ccc;
  background-color: #f5f5f5;
  cursor: pointer;
}

На мобильном поиск часто убирают в отдельную иконку, открывающую строку поиска. Либо отображают поиск на отдельной странице — это упрощает интерфейс.

Иконки профиля, корзины, уведомлений

Эти элементы часто реализуются как кнопки с иконками. Хорошая практика — добавлять подписи для доступности:

<div class="site-header__icons">
  <!-- Иконка уведомлений -->
  <button class="icon-button" type="button" aria-label="Уведомления">
    <!-- Здесь может быть SVG-иконка колокольчика -->
    <span class="icon icon--bell"></span>
  </button>

  <!-- Иконка корзины -->
  <a href="/cart" class="icon-button" aria-label="Корзина">
    <span class="icon icon--cart"></span>
    <!-- Бейдж с количеством товаров -->
    <span class="icon-button__badge">3</span>
  </a>

  <!-- Иконка профиля -->
  <a href="/profile" class="icon-button" aria-label="Профиль">
    <span class="icon icon--user"></span>
  </a>
</div>

И пример стилизации:

.site-header__icons {
  display: flex;
  align-items: center;
  gap: 8px;
}

.icon-button {
  position: relative;
  display: inline-flex;
  width: 32px;
  height: 32px;
  align-items: center;
  justify-content: center;
  border-radius: 16px;
  border: none;
  background-color: transparent;
  cursor: pointer;
}

.icon-button__badge {
  position: absolute;
  top: -4px;
  right: -4px;
  min-width: 16px;
  height: 16px;
  padding: 0 4px;
  border-radius: 8px;
  background-color: #ff4757;
  color: #ffffff;
  font-size: 10px;
  display: flex;
  align-items: center;
  justify-content: center;
}

Такой подход позволяет легко добавлять новые иконки и управлять их поведением отдельно от основной навигации.

Организация кода шапки в проекте

Разделение на компоненты

Когда шапка становится сложной, важно не превращать её в «монолитный» кусок HTML и CSS. Удобно разбить шапку на компоненты:

  • header-layout — общий каркас шапки;
  • logo — компонент логотипа;
  • main-nav — компонент основного меню;
  • user-actions — блок кнопок и иконок;
  • search-bar — строка поиска;
  • mobile-menu — логика раскрытия меню на мобильном.

В шаблонизаторе или фронтенд-фреймворке (React, Vue, Angular) это обычно оформляется в виде отдельных файлов. На «чистом» HTML можно сделать include‑шаблоны на уровне бэкенда (например, в Go templates, PHP, Django и т.д.).

Простой пример разбиения (условно, через комментарии):

<header class="site-header site-header--fixed">
  <div class="site-header__inner">
    <!-- component: logo -->
    <a href="/" class="site-header__logo">
      <span class="site-header__logo-text">MyProject</span>
    </a>

    <!-- component: burger -->
    <button class="site-header__burger" type="button" aria-label="Открыть меню">
      <span class="site-header__burger-line"></span>
      <span class="site-header__burger-line"></span>
      <span class="site-header__burger-line"></span>
    </button>

    <!-- component: main-nav -->
    <nav class="site-header__nav" aria-label="Главная навигация">
      <!-- ... -->
    </nav>

    <!-- component: user-actions -->
    <div class="site-header__actions">
      <!-- ... -->
    </div>
  </div>
</header>

Так вы четко видите, что шапка — это набор переиспользуемых частей.

Модификаторы для разных страниц

Иногда на разных страницах нужна разная шапка:

  • на главной — прозрачная поверх баннера;
  • внутри кабинета — с другим цветом и дополнительным меню;
  • на лендинге — без некоторых пунктов.

Вместо того чтобы плодить несколько версий разметки, используйте модификаторы на корневом элементе:

<header class="site-header site-header--transparent">
  <!-- Шапка для главной страницы -->
</header>

<header class="site-header site-header--dashboard">
  <!-- Шапка для личного кабинета -->
</header>

И настройте различия в CSS:

.site-header--transparent {
  background-color: transparent;
  border-bottom: none;
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
}

.site-header--dashboard {
  background-color: #111827; /* Темная шапка */
  color: #ffffff;
}

.site-header--dashboard .site-header__nav-link {
  color: #e5e7eb;
}

Такой подход легко поддерживать, если вы заранее продумали архитектуру классов.

Доступность и UX шапки

Фокус и клавиатурная навигация

Шапка — один из первых элементов, с которым взаимодействуют пользователи, в том числе с клавиатурой. Давайте убедимся, что:

  • все интерактивные элементы доступны через Tab;
  • есть заметные стили фокуса;
  • aria‑атрибуты проставлены корректно.

Пример стилей фокуса:

.site-header a:focus,
.site-header button:focus {
  outline: 2px solid #2563eb;  /* Синяя рамка */
  outline-offset: 2px;         /* Небольшой отступ от элемента */
}

Для меню «бургер» удобно использовать aria-expanded:

<button
  class="site-header__burger"
  type="button"
  aria-label="Открыть меню"
  aria-expanded="false"
>
  <span class="site-header__burger-line"></span>
  <span class="site-header__burger-line"></span>
  <span class="site-header__burger-line"></span>
</button>

И обновлять значение при клике:

document.addEventListener('DOMContentLoaded', function () {
  var header = document.querySelector('.site-header');
  var burger = document.querySelector('.site-header__burger');

  burger.addEventListener('click', function () {
    var isOpen = header.classList.toggle('site-header--menu-open');
    // Обновляем aria-expanded в зависимости от состояния
    burger.setAttribute('aria-expanded', isOpen ? 'true' : 'false');
  });
});

Так пользователи с экранными читалками будут понимать, открыто меню или нет.

Поведение шапки при прокрутке

Иногда шапку делают динамической: она уменьшается при скролле вниз или скрывается, а потом появляется при прокрутке вверх. Покажу вам базовый пример поведения «скрывать при скролле вниз, показывать при скролле вверх».

/* Состояние, когда шапка скрыта вверх */
.site-header--hidden {
  transform: translateY(-100%); /* Уводим шапку за пределы экрана */
  transition: transform 0.2s ease-in-out;
}

/* По умолчанию шапка видна */
.site-header {
  transition: transform 0.2s ease-in-out;
}
document.addEventListener('DOMContentLoaded', function () {
  var header = document.querySelector('.site-header');
  var lastScrollY = window.scrollY;

  window.addEventListener('scroll', function () {
    var currentScrollY = window.scrollY;

    // Если прокручиваем вниз и уже не в самом верху
    if (currentScrollY > lastScrollY && currentScrollY > 50) {
      // Добавляем класс, скрывающий шапку
      header.classList.add('site-header--hidden');
    } else {
      // При прокрутке вверх показываем шапку
      header.classList.remove('site-header--hidden');
    }

    lastScrollY = currentScrollY;
  });
});

Этот паттерн улучшает UX на мобильных, где вертикальное пространство особенно ценно.

Заключение

Шапка — это ключевой элемент интерфейса, который одновременно решает задачи навигации, брендинга и взаимодействия с пользователем. От того, насколько аккуратно вы её спроектируете и реализуете, зависит удобство использования сайта и дальнейшая поддержка кода.

Мы разобрали:

  • базовую структуру шапки на HTML;
  • стилизацию с помощью flexbox;
  • адаптивное мобильное меню с «бургер»-кнопкой;
  • реализацию фиксированной и липкой шапки;
  • добавление поисковой строки и иконок действий;
  • организацию кода и модификации шапки под разные сценарии;
  • практики по доступности и динамическому поведению при прокрутке.

Используя эти подходы, вы можете создать гибкую, удобную и легко расширяемую шапку, которая подойдет как для небольших лендингов, так и для крупных веб‑приложений.

Частозадаваемые технические вопросы по теме статьи и ответы на них

Как сделать, чтобы шапка перекрывала контент только при открытом мобильном меню

Сделайте шапку position: relative, а при открытии меню добавляйте overlay под шапкой:

.site-header__overlay {
  position: fixed;  /* Фиксируем поверх контента */
  inset: 0;         /* Растягиваем на весь экран */
  background: rgba(0, 0, 0, 0.4);
  display: none;
}

.site-header--menu-open .site-header__overlay {
  display: block;   /* Показываем затемнение только при открытом меню */
}
<header class="site-header">
  <div class="site-header__overlay"></div>
  <!-- остальная разметка шапки -->
</header>

Так контент не сдвигается, но клики по нему блокируются при открытом меню.

Как предотвратить «прыжок» контента при появлении фиксированной шапки только после скролла

Измерьте высоту шапки в JavaScript и задайте padding-top динамически:

document.addEventListener('DOMContentLoaded', function () {
  var header = document.querySelector('.site-header');
  var content = document.querySelector('.page-content');
  var headerHeight = header.offsetHeight;

  window.addEventListener('scroll', function () {
    if (window.scrollY > 100) {
      header.classList.add('site-header--fixed');
      content.style.paddingTop = headerHeight + 'px';
    } else {
      header.classList.remove('site-header--fixed');
      content.style.paddingTop = '';
    }
  });
});

Так отступ добавляется ровно в момент фиксации и равен реальной высоте шапки.

Как оптимально подсвечивать активный пункт меню в шапке

Если бэкенд знает текущий путь, добавляйте класс active в разметку сервера. В чистом фронтенде можно сравнивать location.pathname:

document.addEventListener('DOMContentLoaded', function () {
  var path = window.location.pathname;
  var links = document.querySelectorAll('.site-header__nav-link');

  links.forEach(function (link) {
    if (link.getAttribute('href') === path) {
      link.classList.add('site-header__nav-link--active');
    }
  });
});

И в CSS:

.site-header__nav-link--active {
  color: #000;
  border-bottom: 2px solid #2563eb; /* Подчеркиваем активный пункт */
}

Как сделать, чтобы шапка не мерцала при переходах в SPA

В SPA оставляйте шапку частью корневого layout, а контент меняйте внутри. В React, например, делайте Header вне Router, а внутри только маршруты страницы. Тогда шапка монтируется один раз и не перерисовывается при каждом переходе.

Как разделить стили шапки на модули в большом проекте

Используйте методологию БЭМ и разбейте стили на несколько файлов:

  • header.base.css — базовая сетка и структура;
  • header.theme.css — цвета, шрифты, темы;
  • header.responsive.css — медиа‑запросы;
  • header.states.css — состояния, анимации.

Подключайте эти файлы в сборщик (Webpack, Vite, Gulp) и объединяйте в один итоговый CSS. Так изменения в одном аспекте (например, адаптивность) не затрагивают остальной код.

Стрелочка влевоСтрока таблицы HTML tr - полное руководство для верстальщиков и разработчиковЗаголовок таблицы HTML th - полное руководствоСтрелочка вправо

Постройте личный план изучения Html до уровня Middle — бесплатно!

Html — часть карты развития Frontend

  • step100+ шагов развития
  • lessons30 бесплатных лекций
  • lessons300 бонусных рублей на счет

Все гайды по Html

Тег section в HTML - семантическая разметка структуры страницыТег nav в HTML - полное руководство по семантической навигацииТег main в HTML - подробное руководство по использованиюТег header в HTML - полное практическое руководствоТег footer в HTML - назначение семантика и практические примерыТег figure в HTML - как правильно оформлять иллюстрации и подписиТег figcaption в HTML - подробное руководство с примерамиТег aside в HTML - назначение правильная семантика и примеры
Текстовая область HTML textarea - практическое руководствоВыпадающий список HTML select - полное руководство для разработчиковОпция списка HTML option - как работает и как правильно использоватьАтрибут method в HTML - как правильно отправлять данные формыЗаголовок группы HTML legend - как правильно использовать и оформлятьТег input в HTML - типы атрибуты валидация и примерыТег формы form в HTMLГруппа полей HTML fieldsetАтрибут action в HTML - как правильно задавать адрес отправки формы
Открыть базу знаний

Лучшие курсы по теме

изображение курса

HTML и CSS

Антон Ларичев
AI-тренажеры
Практика в студии
Гарантия
Бонусы
иконка звёздочки рейтинга4.9
3 999 ₽ 6 990 ₽
Подробнее
изображение курса

TypeScript с нуля

Антон Ларичев
AI-тренажеры
Практика в студии
Гарантия
Бонусы
иконка звёздочки рейтинга4.8
3 999 ₽ 6 990 ₽
Подробнее
изображение курса

Next.js - с нуля

Антон Ларичев
AI-тренажеры
Практика в студии
Гарантия
Бонусы
иконка звёздочки рейтинга4.7
3 999 ₽ 6 990 ₽
Подробнее

Отправить комментарий