HTML header jako element struktury strony, semantyki i nowoczesnego projektowania witryn

HTML header jako element struktury strony, semantyki i nowoczesnego projektowania witryn

HTML header to pojęcie, które może odnosić się do kilku różnych elementów związanych z budową strony internetowej. Najczęściej oznacza znacznik <header>, wykorzystywany do oznaczania nagłówkowej części dokumentu lub wybranej sekcji. W praktyce mianem headera określa się również górny obszar strony zawierający logo, menu, wyszukiwarkę, dane kontaktowe, przyciski i inne ważne elementy nawigacyjne. Niekiedy początkujący twórcy stron mylą także HTML header z sekcją <head>, która pełni zupełnie inną funkcję i zawiera informacje niewidoczne bezpośrednio w głównej części witryny.

Zrozumienie roli headera jest bardzo ważne zarówno dla programistów, projektantów stron, specjalistów SEO, jak i osób samodzielnie zarządzających serwisem internetowym. Dobrze zaprojektowany nagłówek pomaga użytkownikowi szybko zorientować się, gdzie się znajduje, czym zajmuje się witryna i w jaki sposób może przejść do interesujących go treści. Jednocześnie semantycznie poprawny kod ułatwia interpretację struktury dokumentu przez przeglądarki, wyszukiwarki oraz technologie wspomagające.

HTML header nie jest wyłącznie miejscem na logo i menu. Może pełnić funkcję informacyjną, nawigacyjną, wizerunkową i sprzedażową. Jego zawartość zależy od rodzaju strony, wielkości serwisu, potrzeb odbiorców oraz miejsca, w którym znacznik <header> został użyty.

Czym jest HTML header?

W języku HTML znacznik <header> jest semantycznym elementem reprezentującym wprowadzenie do dokumentu albo określonej sekcji. Może zawierać między innymi tytuł, nagłówki, logo, menu, opis, dane autora, wyszukiwarkę oraz inne informacje pomagające zrozumieć zawartość.

Podstawowy przykład może wyglądać następująco:

<header>
  <h1>Nazwa firmy</h1>
  <p>Profesjonalne usługi dla klientów biznesowych</p>
</header>

W tym przypadku header pełni funkcję nagłówka całej strony. Zawiera główny tytuł oraz krótki opis przedstawiający charakter serwisu.

Znacznik <header> może pojawić się także wewnątrz artykułu:

<article>
  <header>
    <h2>Jak zaprojektować stronę firmową</h2>
    <p>Autor: Jan Kowalski</p>
  </header>

  <p>Treść artykułu...</p>
</article>

Tutaj header nie jest nagłówkiem całej witryny, lecz częścią wprowadzającą do konkretnego artykułu.

HTML header a sekcja head

Jednym z najczęstszych błędów jest mylenie znaczników <header> i <head>. Choć ich nazwy są podobne, odpowiadają za zupełnie inne obszary dokumentu.

Element head

Znacznik <head> znajduje się na początku dokumentu HTML i zawiera informacje przeznaczone przede wszystkim dla przeglądarki, wyszukiwarki i innych systemów przetwarzających stronę.

W sekcji <head> umieszcza się między innymi:

  • tytuł dokumentu;
  • metadane;
  • informacje o kodowaniu znaków;
  • odnośniki do arkuszy CSS;
  • ustawienia widoku mobilnego;
  • skrypty;
  • dane strukturalne;
  • ikony witryny.

Przykład:

<head>
  <meta charset=\"UTF-8\">
  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">
  <title>Przykładowa strona internetowa</title>
  <link rel=\"stylesheet\" href=\"style.css\">
</head>

Zawartość <head> nie jest standardowo wyświetlana jako część strony widocznej dla użytkownika.

Element header

Znacznik <header> znajduje się natomiast wewnątrz <body>, czyli w widocznej części dokumentu. Reprezentuje obszar wprowadzający lub nagłówkowy.

<body>
  <header>
    <a href=\"/\">
      <img src=\"logo.svg\" alt=\"Nazwa firmy\">
    </a>

    <nav>
      <a href=\"/oferta\">Oferta</a>
      <a href=\"/o-nas\">O nas</a>
      <a href=\"/kontakt\">Kontakt</a>
    </nav>
  </header>
</body>

Można więc przyjąć prostą zasadę:

<head> zawiera informacje o dokumencie, natomiast <header> jest widocznym elementem jego treści.

Do czego służy znacznik header?

Głównym zadaniem znacznika <header> jest oznaczenie części wprowadzającej. Nie oznacza to jednak, że jego zawartość musi zawsze wyglądać tak samo.

Header może zawierać:

  • nazwę strony;
  • logo;
  • główny nagłówek;
  • podtytuł;
  • opis sekcji;
  • menu nawigacyjne;
  • wyszukiwarkę;
  • dane autora;
  • datę publikacji;
  • przyciski logowania;
  • przycisk kontaktowy;
  • informacje o kategorii;
  • elementy pomocnicze.

Zastosowanie zależy od kontekstu. Header całej strony zwykle pełni inną funkcję niż header artykułu, produktu czy sekcji tematycznej.

Semantyczne znaczenie elementu header

Semantyczny HTML polega na używaniu znaczników zgodnie z ich znaczeniem, a nie wyłącznie w celu uzyskania określonego wyglądu.

Przed wprowadzeniem elementów takich jak <header>, <nav>, <main>, <article> czy <footer> wiele stron budowano głównie z elementów <div>. Kod wyglądał na przykład tak:

<div class=\"header\">
  <div class=\"logo\">Firma</div>
  <div class=\"menu\">...</div>
</div>

Taka konstrukcja może działać wizualnie, ale sam znacznik <div> nie przekazuje informacji o funkcji elementu. Klasa header jest zrozumiała dla programisty, ale nie ma wbudowanego znaczenia semantycznego.

Wersja wykorzystująca elementy semantyczne może wyglądać tak:

<header>
  <a href=\"/\" class=\"logo\">Firma</a>

  <nav aria-label=\"Główna nawigacja\">
    ...
  </nav>
</header>

Dzięki temu struktura staje się bardziej czytelna zarówno dla człowieka, jak i systemów analizujących dokument.

Gdzie można umieścić HTML header?

Znacznik <header> może być używany w różnych miejscach dokumentu. Najczęściej występuje jako nagłówek całej witryny, ale nie jest do tego ograniczony.

Header całej strony

Najbardziej typowe zastosowanie to górna część dokumentu:

<body>
  <header class=\"site-header\">
    <a href=\"/\" class=\"site-logo\">Nazwa marki</a>

    <nav class=\"main-navigation\">
      ...
    </nav>
  </header>

  <main>
    ...
  </main>
</body>

Taki header może być wspólny dla wszystkich podstron.

Header artykułu

Każdy artykuł może mieć własny nagłówek:

<article>
  <header class=\"article-header\">
    <p class=\"category\">Poradniki</p>
    <h1>Jak stworzyć skuteczną stronę internetową</h1>
    <p>Opublikowano 10 maja 2026 roku</p>
  </header>

  <p>Treść...</p>
</article>

Header sekcji

Element <section> również może zawierać header:

<section>
  <header>
    <h2>Nasze usługi</h2>
    <p>Poznaj główne obszary naszej działalności.</p>
  </header>

  ...
</section>

Header formularza lub panelu

W bardziej rozbudowanych aplikacjach header może wprowadzać do panelu, formularza albo widoku danych:

<section class=\"dashboard\">
  <header>
    <h2>Panel użytkownika</h2>
    <p>Zarządzaj zamówieniami i ustawieniami konta.</p>
  </header>

  ...
</section>

Czy na stronie może być więcej niż jeden header?

Tak. Dokument może zawierać wiele elementów <header>, o ile każdy z nich wprowadza do innej części treści.

Przykład:

<body>
  <header class=\"site-header\">
    <h1>Portal technologiczny</h1>
  </header>

  <main>
    <article>
      <header>
        <h2>Nowe standardy projektowania stron</h2>
        <p>Autor: Anna Nowak</p>
      </header>

      <p>Treść artykułu...</p>
    </article>

    <article>
      <header>
        <h2>Najważniejsze trendy w UX</h2>
        <p>Autor: Piotr Wiśniewski</p>
      </header>

      <p>Treść artykułu...</p>
    </article>
  </main>
</body>

W tym przykładzie jeden header dotyczy całej witryny, a dwa kolejne należą do poszczególnych artykułów.

Nie należy więc utożsamiać <header> wyłącznie z jedną stałą belką u góry ekranu. Jest to element semantyczny, który może być używany wielokrotnie.

Jakie elementy najczęściej znajdują się w headerze strony?

Górna część witryny jest jednym z najważniejszych obszarów interfejsu. Użytkownik widzi ją zwykle bezpośrednio po wejściu na stronę.

Logo

Logo pomaga rozpoznać markę i zazwyczaj prowadzi do strony głównej.

<a href=\"/\" class=\"logo\" aria-label=\"Strona główna firmy Example\">
  <img src=\"logo.svg\" alt=\"Example\">
</a>

Warto zadbać o poprawny tekst alternatywny oraz czytelny link.

Menu główne

Menu prowadzi do najważniejszych części serwisu.

<nav aria-label=\"Główna nawigacja\">
  <ul>
    <li><a href=\"/oferta\">Oferta</a></li>
    <li><a href=\"/realizacje\">Realizacje</a></li>
    <li><a href=\"/blog\">Blog</a></li>
    <li><a href=\"/kontakt\">Kontakt</a></li>
  </ul>
</nav>

Wyszukiwarka

W większych witrynach wyszukiwarka może być bardzo istotnym elementem.

<form role=\"search\" action=\"/szukaj\">
  <label for=\"search\">Szukaj w serwisie</label>
  <input id=\"search\" name=\"q\" type=\"search\">
  <button type=\"submit\">Szukaj</button>
</form>

Przycisk działania

Header często zawiera przycisk prowadzący do najważniejszej konwersji, na przykład rezerwacji, kontaktu, zakupu albo logowania.

<a href=\"/kontakt\" class=\"cta-button\">Umów konsultację</a>

Dane kontaktowe

W lokalnych firmach można umieścić numer telefonu lub godziny pracy.

<a href=\"tel:+48123456789\">123 456 789</a>

Ikony konta i koszyka

W sklepie internetowym header może zawierać dostęp do profilu i koszyka.

<nav aria-label=\"Nawigacja użytkownika\">
  <a href=\"/konto\">Moje konto</a>
  <a href=\"/koszyk\">Koszyk</a>
</nav>

Podstawowa struktura headera strony internetowej

Prosty, semantyczny header może wyglądać następująco:

<header class=\"site-header\">
  <div class=\"header-container\">
    <a href=\"/\" class=\"logo\">
      <img src=\"logo.svg\" alt=\"Nazwa firmy\">
    </a>

    <nav class=\"main-nav\" aria-label=\"Główna nawigacja\">
      <ul>
        <li><a href=\"/oferta\">Oferta</a></li>
        <li><a href=\"/o-nas\">O nas</a></li>
        <li><a href=\"/blog\">Blog</a></li>
        <li><a href=\"/kontakt\">Kontakt</a></li>
      </ul>
    </nav>

    <a href=\"/wycena\" class=\"header-cta\">Poproś o wycenę</a>
  </div>
</header>

Taki kod można rozbudować o mobilne menu, wyszukiwarkę, wybór języka, dane kontaktowe lub inne funkcje.

HTML header a nagłówki h1, h2 i h3

Element <header> nie jest tym samym co nagłówki <h1>, <h2>, <h3> i kolejne. Header jest kontenerem semantycznym, natomiast znaczniki h1–h6 określają hierarchię tytułów.

Przykład poprawnego połączenia:

<header>
  <h1>Sklep z wyposażeniem wnętrz</h1>
  <p>Nowoczesne rozwiązania do domu i biura.</p>
</header>

W artykule może natomiast pojawić się:

<article>
  <header>
    <h2>Jak urządzić małe mieszkanie</h2>
    <p>Praktyczny poradnik dla właścicieli niewielkich wnętrz.</p>
  </header>

  ...
</article>

Nagłówek wewnątrz headera powinien odpowiadać poziomowi struktury dokumentu. Nie należy wybierać poziomu wyłącznie na podstawie rozmiaru czcionki. Wygląd można ustawić w CSS.

Czy header musi zawierać h1?

Nie. Element <header> nie musi zawierać nagłówka <h1>. Może zawierać logo, menu, wyszukiwarkę i inne elementy.

Przykład:

<header class=\"site-header\">
  <a href=\"/\" class=\"logo\">
    <img src=\"logo.svg\" alt=\"Firma Example\">
  </a>

  <nav aria-label=\"Główne menu\">
    ...
  </nav>
</header>

Główny nagłówek <h1> może znaleźć się później, na przykład w sekcji hero:

<main>
  <section class=\"hero\">
    <h1>Projektujemy strony internetowe dla firm</h1>
    <p>Łączymy użyteczność, estetykę i skuteczność.</p>
  </section>
</main>

To często lepsze rozwiązanie, ponieważ wspólny header może być identyczny na wszystkich podstronach, natomiast h1 powinien opisywać konkretną zawartość danego widoku.

Header a element nav

Element <nav> oznacza ważną grupę linków nawigacyjnych. Bardzo często znajduje się wewnątrz headera, ale nie jest z nim tożsamy.

<header>
  <a href=\"/\">Logo</a>

  <nav aria-label=\"Menu główne\">
    ...
  </nav>
</header>

Header może zawierać nav, ale nav może również występować poza headerem, na przykład w stopce lub panelu bocznym.

<footer>
  <nav aria-label=\"Nawigacja w stopce\">
    ...
  </nav>
</footer>

Nie każda grupa linków musi być oznaczona jako <nav>. Element ten najlepiej stosować dla ważnych bloków nawigacyjnych.

Header a element main

Znacznik <main> reprezentuje główną, unikalną treść strony. Standardowy układ może wyglądać tak:

<body>
  <header>
    ...
  </header>

  <main>
    ...
  </main>

  <footer>
    ...
  </footer>
</body>

Header strony znajduje się zwykle przed <main>, ponieważ zawiera elementy wspólne dla całej witryny. Wewnątrz main mogą jednak znajdować się artykuły lub sekcje posiadające własne headery.

<main>
  <article>
    <header>
      <h1>Tytuł artykułu</h1>
    </header>

    ...
  </article>
</main>

Header a element footer

Header i footer pełnią przeciwstawne funkcje strukturalne.

Header

Wprowadza do dokumentu lub sekcji. Zawiera tytuł, opis, logo, menu albo informacje początkowe.

Footer

Kończy dokument lub sekcję. Może zawierać dane autora, prawa autorskie, linki pomocnicze, informacje kontaktowe lub metadane końcowe.

Przykład artykułu:

<article>
  <header>
    <h2>Tytuł wpisu</h2>
    <p>Opublikowano 20 czerwca 2026 roku</p>
  </header>

  <p>Treść artykułu...</p>

  <footer>
    <p>Autor: Anna Kowalska</p>
    <a href=\"/kategoria/web-development\">Web development</a>
  </footer>
</article>

Header strony a sekcja hero

Header i hero są często mylone, ponieważ oba mogą znajdować się w górnej części strony.

Header strony

Zawiera przede wszystkim elementy identyfikacji i nawigacji, takie jak logo, menu, wyszukiwarka i konto użytkownika.

Sekcja hero

Jest głównym obszarem promocyjnym lub informacyjnym pod headerem. Zwykle zawiera h1, opis, grafikę i wezwanie do działania.

<header class=\"site-header\">
  ...
</header>

<main>
  <section class=\"hero\">
    <h1>Nowoczesne strony internetowe dla biznesu</h1>
    <p>Projektujemy serwisy wspierające rozwój firm.</p>
    <a href=\"/kontakt\">Porozmawiajmy</a>
  </section>
</main>

Niektórzy projektanci umieszczają hero wewnątrz headera, ale rozdzielenie tych elementów często ułatwia utrzymanie czytelnej struktury.

Jak ostylować HTML header w CSS?

Sam HTML określa strukturę, natomiast wygląd headera definiuje się w CSS.

Podstawowy przykład:

.site-header {
  background: #ffffff;
  border-bottom: 1px solid #e5e5e5;
}

.header-container {
  width: min(1200px, 100% - 32px);
  margin-inline: auto;
  min-height: 72px;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 24px;
}

.main-nav ul {
  display: flex;
  align-items: center;
  gap: 24px;
  margin: 0;
  padding: 0;
  list-style: none;
}

.main-nav a {
  color: #222222;
  text-decoration: none;
}

Taki styl tworzy poziomy nagłówek z logo, menu i dodatkowym elementem po prawej stronie.

Responsywny HTML header

Header musi działać poprawnie na różnych rozmiarach ekranu. Menu mieszczące się na komputerze może być zbyt szerokie na telefonie.

Podstawowym rozwiązaniem jest ukrycie klasycznej nawigacji i pokazanie przycisku menu mobilnego.

<header class=\"site-header\">
  <a href=\"/\" class=\"logo\">Firma</a>

  <button
    class=\"menu-toggle\"
    type=\"button\"
    aria-expanded=\"false\"
    aria-controls=\"main-menu\"
  >
    Menu
  </button>

  <nav id=\"main-menu\" class=\"main-nav\" aria-label=\"Główna nawigacja\">
    <ul>
      <li><a href=\"/oferta\">Oferta</a></li>
      <li><a href=\"/blog\">Blog</a></li>
      <li><a href=\"/kontakt\">Kontakt</a></li>
    </ul>
  </nav>
</header>

Przykładowy CSS:

.menu-toggle {
  display: none;
}

@media (max-width: 768px) {
  .menu-toggle {
    display: inline-flex;
  }

  .main-nav {
    display: none;
  }

  .main-nav.is-open {
    display: block;
  }
}

Do pełnego działania potrzebny jest również JavaScript aktualizujący stan menu oraz atrybut aria-expanded.

Przycisk mobilnego menu

Przycisk otwierający menu powinien być prawdziwym elementem <button>, a nie zwykłym <div> lub linkiem bez adresu.

Poprawna konstrukcja:

<button
  type=\"button\"
  class=\"menu-toggle\"
  aria-expanded=\"false\"
  aria-controls=\"main-navigation\"
  aria-label=\"Otwórz menu\"
>
  <span aria-hidden=\"true\">☰</span>
</button>

Po otwarciu menu należy zmienić:

aria-expanded=\"true\"

oraz odpowiednio zaktualizować etykietę, jeśli aplikacja tego wymaga.

Sticky header

Sticky header pozostaje widoczny podczas przewijania strony. Może ułatwiać dostęp do menu, ale trzeba stosować go rozsądnie.

Przykład:

.site-header {
  position: sticky;
  top: 0;
  z-index: 1000;
  background: #ffffff;
}

Element sticky działa w ramach swojego kontekstu przewijania. Niektóre właściwości rodziców, na przykład określone ustawienia overflow, mogą wpływać na jego zachowanie.

Zalety sticky headera

  • szybki dostęp do menu;
  • łatwiejszy powrót do najważniejszych sekcji;
  • większa widoczność przycisku działania;
  • wygoda w długich dokumentach.

Wady sticky headera

  • zajmuje część ekranu;
  • może utrudniać czytanie na telefonie;
  • bywa nachalny;
  • może zasłaniać kotwice i nagłówki;
  • zwiększa złożoność interfejsu.

Na małych ekranach warto zmniejszyć jego wysokość albo ograniczyć liczbę widocznych elementów.

Fixed header a sticky header

Element position: fixed jest przytwierdzony do okna przeglądarki:

.site-header {
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
}

W takim przypadku trzeba często dodać odstęp dla treści:

body {
  padding-top: 72px;
}

Header sticky zachowuje natomiast miejsce w układzie i zaczyna przyklejać się dopiero po osiągnięciu określonej pozycji.

W wielu projektach position: sticky jest prostsze i bezpieczniejsze, ale wybór zależy od zamierzonego efektu.

Transparentny header

Na stronach wizerunkowych header może być umieszczony na tle zdjęcia lub sekcji hero.

.site-header {
  position: absolute;
  inset: 0 0 auto 0;
  background: transparent;
  color: #ffffff;
}

Takie rozwiązanie wymaga szczególnej dbałości o kontrast. Logo i linki muszą pozostać czytelne na różnych fragmentach obrazu.

Można zastosować:

  • ciemną nakładkę na zdjęcie;
  • jednolity pasek;
  • cień tekstu;
  • zmianę wyglądu po przewinięciu;
  • osobne wersje logo;
  • ograniczenie różnorodności tła.

Header zmieniający wygląd podczas przewijania

JavaScript może dodawać klasę po przewinięciu strony:

const header = document.querySelector(\".site-header\");

window.addEventListener(\"scroll\", () => {
  header.classList.toggle(\"is-scrolled\", window.scrollY > 20);
});

CSS:

.site-header {
  background: transparent;
  transition: background-color 0.2s ease;
}

.site-header.is-scrolled {
  background: #ffffff;
  box-shadow: 0 4px 16px rgba(0, 0, 0, 0.08);
}

Należy uważać, aby zmiana nie powodowała nagłych przesunięć układu. Lepiej animować kolor, cień lub przezroczystość niż wysokość całego nagłówka.

Dostępność HTML header

Dostępny header powinien być obsługiwany klawiaturą, czytelny dla czytników ekranu i zrozumiały bez polegania wyłącznie na wyglądzie.

Link pomijający nawigację

Na początku strony warto dodać link pozwalający przejść bezpośrednio do głównej treści:

<a class=\"skip-link\" href=\"#main-content\">
  Przejdź do treści
</a>

<header>
  ...
</header>

<main id=\"main-content\">
  ...
</main>

CSS może ukrywać go poza ekranem, dopóki nie otrzyma fokusu:

.skip-link {
  position: absolute;
  left: -9999px;
}

.skip-link:focus {
  left: 16px;
  top: 16px;
  z-index: 2000;
  padding: 12px 16px;
  background: #ffffff;
}

Widoczny fokus

Linki i przyciski muszą mieć czytelny stan fokusu:

.site-header a:focus-visible,
.site-header button:focus-visible {
  outline: 3px solid currentColor;
  outline-offset: 4px;
}

Nie należy usuwać obramowania fokusu bez zapewnienia wyraźnej alternatywy.

Poprawne etykiety

Ikona bez tekstu powinna mieć nazwę dostępną dla technologii wspomagających.

<button aria-label=\"Otwórz wyszukiwarkę\">
  <svg aria-hidden=\"true\">...</svg>
</button>

Kolejność klawiatury

Kolejność elementów w kodzie powinna odpowiadać logicznej kolejności interakcji. Nie należy tworzyć skomplikowanych układów wizualnych, które znacząco różnią się od kolejności DOM.

Kontrast

Tekst, ikony i przyciski powinny być dobrze widoczne na tle. Dotyczy to również stanów aktywnych, rozwijanych menu i elementów nakładanych na zdjęcia.

HTML header a SEO

Sam znacznik <header> nie gwarantuje wyższej pozycji w wyszukiwarce. Może jednak pośrednio wspierać jakość strony poprzez lepszą strukturę, czytelną nawigację i poprawne użycie nagłówków.

Jasna struktura dokumentu

Semantyczny kod pomaga uporządkować treść. Wyszukiwarka łatwiej rozpoznaje, które elementy pełnią funkcję nawigacji, a które należą do głównej zawartości.

Linkowanie wewnętrzne

Menu w headerze przekazuje linki do najważniejszych podstron. Powinno być jednak rozsądnie ograniczone. Umieszczenie kilkudziesięciu linków w głównym menu może pogorszyć użyteczność i utrudnić zrozumienie hierarchii serwisu.

Nagłówki

Jeśli header artykułu zawiera h1, powinien on trafnie opisywać treść. Nie warto powtarzać tej samej frazy w wielu nagłówkach wyłącznie w celu pozycjonowania.

Szybkość

Rozbudowany header może obciążać stronę, szczególnie gdy zawiera duże skrypty, ciężkie fonty, animacje lub wielomegabajtowe grafiki.

Dostosowanie mobilne

Nawigacja musi działać na telefonach. Problemy z menu mobilnym mogą utrudniać korzystanie ze strony i obniżać skuteczność całego serwisu.

Jak projektować header przyjazny użytkownikowi?

Dobry nagłówek powinien pomagać, a nie przytłaczać.

Ogranicz liczbę elementów

Nie każda podstrona musi znaleźć się w głównym menu. Najważniejsze sekcje powinny być łatwo widoczne, a treści pomocnicze mogą trafić do stopki lub menu rozwijanego.

Używaj zrozumiałych nazw

Nazwy linków powinny być proste:

  • Oferta;
  • Usługi;
  • O nas;
  • Realizacje;
  • Blog;
  • Kontakt.

Kreatywne etykiety mogą budować charakter marki, ale nie powinny utrudniać orientacji.

Wyróżnij najważniejsze działanie

Jeżeli głównym celem jest kontakt, rezerwacja albo zakup, jeden przycisk może zostać wizualnie wyróżniony. Nie warto jednak tworzyć kilku konkurujących ze sobą przycisków.

Zachowaj spójność

Układ headera powinien być podobny na wszystkich podstronach. Nagła zmiana położenia logo lub menu może dezorientować użytkownika.

Dostosuj wysokość

Zbyt wysoki nagłówek ogranicza obszar treści. Zbyt niski może utrudnić kliknięcie elementów. Na telefonie należy zapewnić odpowiednio duże obszary dotykowe.

Header dla strony firmowej

Na stronie firmowej najczęściej sprawdza się prosty układ:

  • logo po lewej;
  • menu pośrodku lub po prawej;
  • wyróżniony przycisk kontaktowy;
  • opcjonalnie numer telefonu;
  • mobilny przycisk menu.

Przykład:

<header class=\"site-header\">
  <div class=\"header-container\">
    <a href=\"/\" class=\"logo\">
      <img src=\"logo.svg\" alt=\"Firma Budowlana Nowak\">
    </a>

    <nav aria-label=\"Główna nawigacja\">
      <ul>
        <li><a href=\"/uslugi\">Usługi</a></li>
        <li><a href=\"/realizacje\">Realizacje</a></li>
        <li><a href=\"/o-nas\">O nas</a></li>
        <li><a href=\"/kontakt\">Kontakt</a></li>
      </ul>
    </nav>

    <a href=\"tel:+48123456789\">123 456 789</a>
  </div>
</header>

Header dla sklepu internetowego

Sklep potrzebuje większej liczby funkcji:

  • logo;
  • wyszukiwarka;
  • menu kategorii;
  • konto;
  • lista ulubionych;
  • koszyk;
  • informacje o dostawie;
  • wybór języka lub waluty.

Przykład uproszczony:

<header class=\"shop-header\">
  <div class=\"shop-header-top\">
    <a href=\"/\" class=\"logo\">
      <img src=\"logo.svg\" alt=\"Sklep Example\">
    </a>

    <form role=\"search\" action=\"/szukaj\">
      <label class=\"visually-hidden\" for=\"shop-search\">
        Szukaj produktów
      </label>
      <input
        id=\"shop-search\"
        type=\"search\"
        name=\"q\"
        placeholder=\"Czego szukasz?\"
      >
      <button type=\"submit\">Szukaj</button>
    </form>

    <nav aria-label=\"Konto i zakupy\">
      <a href=\"/konto\">Konto</a>
      <a href=\"/koszyk\">Koszyk</a>
    </nav>
  </div>

  <nav class=\"category-nav\" aria-label=\"Kategorie produktów\">
    ...
  </nav>
</header>

W sklepie należy szczególnie uważać na przeładowanie nagłówka. Wyszukiwarka często jest ważniejsza niż rozbudowane menu.

Header dla bloga

Nagłówek bloga może eksponować:

  • nazwę serwisu;
  • główne kategorie;
  • wyszukiwarkę;
  • archiwum;
  • newsletter;
  • profil autora.

Przykład:

<header class=\"blog-header\">
  <a href=\"/\" class=\"blog-title\">
    Marketing w praktyce
  </a>

  <nav aria-label=\"Kategorie bloga\">
    <a href=\"/seo\">SEO</a>
    <a href=\"/content-marketing\">Content marketing</a>
    <a href=\"/social-media\">Social media</a>
  </nav>

  <form role=\"search\" action=\"/szukaj\">
    ...
  </form>
</header>

W headerze pojedynczego wpisu mogą znaleźć się tytuł, data, autor i kategoria.

Header dla aplikacji internetowej

Aplikacje SaaS i panele użytkownika często mają inny układ niż klasyczne strony.

Header może zawierać:

  • nazwę modułu;
  • wyszukiwarkę;
  • powiadomienia;
  • profil użytkownika;
  • przełącznik organizacji;
  • pomoc;
  • przycisk tworzenia nowego elementu.

Przykład:

<header class=\"app-header\">
  <button type=\"button\" aria-label=\"Otwórz menu boczne\">
    ☰
  </button>

  <h1>Panel projektów</h1>

  <nav aria-label=\"Narzędzia użytkownika\">
    <button type=\"button\">Powiadomienia</button>
    <a href=\"/profil\">Profil</a>
  </nav>
</header>

W aplikacji nagłówek może zmieniać się zależnie od widoku, ale powinien zachować spójne funkcje.

Mega menu w headerze

Mega menu to rozbudowany panel pokazujący wiele kategorii i podkategorii. Sprawdza się w dużych sklepach, portalach i serwisach korporacyjnych.

Przykładowa struktura:

<nav aria-label=\"Główna nawigacja\">
  <ul>
    <li>
      <button
        type=\"button\"
        aria-expanded=\"false\"
        aria-controls=\"products-menu\"
      >
        Produkty
      </button>

      <div id=\"products-menu\" hidden>
        <section>
          <h2>Dom</h2>
          <a href=\"/meble\">Meble</a>
          <a href=\"/oswietlenie\">Oświetlenie</a>
        </section>

        <section>
          <h2>Ogród</h2>
          <a href=\"/narzedzia\">Narzędzia</a>
          <a href=\"/meble-ogrodowe\">Meble ogrodowe</a>
        </section>
      </div>
    </li>
  </ul>
</nav>

Mega menu musi być obsługiwane klawiaturą, zamykane klawiszem Escape i odpowiednio zarządzać fokusem.

Dropdown menu w headerze

Rozwijane menu powinno być zbudowane tak, aby działało nie tylko po najechaniu myszą.

Niewłaściwe rozwiązanie polegające wyłącznie na :hover może być niedostępne dla użytkowników klawiatury i ekranów dotykowych.

Lepsze podejście wykorzystuje przycisk:

<button
  type=\"button\"
  aria-expanded=\"false\"
  aria-controls=\"services-menu\"
>
  Usługi
</button>

<ul id=\"services-menu\" hidden>
  <li><a href=\"/strony-internetowe\">Strony internetowe</a></li>
  <li><a href=\"/sklepy\">Sklepy internetowe</a></li>
  <li><a href=\"/seo\">SEO</a></li>
</ul>

JavaScript powinien przełączać atrybut hidden oraz aria-expanded.

Breadcrumbs a header

Okruszki nawigacyjne mogą znaleźć się w headerze artykułu lub podstrony, ale często lepiej umieścić je nad nim.

<nav aria-label=\"Okruszki\">
  <ol>
    <li><a href=\"/\">Strona główna</a></li>
    <li><a href=\"/blog\">Blog</a></li>
    <li aria-current=\"page\">HTML header</li>
  </ol>
</nav>

<header class=\"page-header\">
  <h1>HTML header</h1>
  <p>Przewodnik po semantycznym nagłówku strony.</p>
</header>

Aktualna strona może zostać oznaczona atrybutem aria-current=\"page\".

HTML header i logo SVG

Logo w formacie SVG jest skalowalne i zwykle dobrze sprawdza się w headerze.

Najprostsze osadzenie:

<a href=\"/\" class=\"logo\">
  <img
    src=\"/assets/logo.svg\"
    alt=\"Nazwa firmy\"
    width=\"160\"
    height=\"48\"
  >
</a>

Podanie wymiarów pomaga ograniczyć przesunięcia układu podczas ładowania.

SVG można również umieścić bezpośrednio w kodzie, co pozwala łatwo zmieniać kolor przez CSS. Należy jednak zadbać o poprawną dostępność.

Obrazy w headerze

Jeśli header zawiera zdjęcie lub grafikę, warto zoptymalizować plik.

Należy zwrócić uwagę na:

  • właściwe wymiary;
  • kompresję;
  • nowoczesny format;
  • poprawny tekst alternatywny;
  • deklarację szerokości i wysokości;
  • opóźnione ładowanie tylko wtedy, gdy ma sens;
  • dostosowanie do ekranów o różnej gęstości.

Logo znajdujące się wysoko na stronie zwykle nie powinno być ładowane z dużym opóźnieniem, ponieważ może wpływać na pierwsze wrażenie i stabilność układu.

HTML header a wydajność strony

Header jest ładowany na każdej podstronie, dlatego jego optymalizacja ma duże znaczenie.

Najczęstsze źródła problemów to:

  • ciężkie biblioteki menu;
  • niepotrzebne animacje;
  • duże logo;
  • wiele zewnętrznych fontów;
  • skomplikowane mega menu;
  • rozbudowane skrypty śledzące;
  • automatycznie odtwarzane wideo;
  • duża liczba ikon pobieranych z zewnętrznej biblioteki.

Warto ograniczyć skrypty do niezbędnego minimum i nie obciążać headera efektami, które nie wspierają użyteczności.

Minimalistyczny header

Minimalistyczny nagłówek może zawierać jedynie logo, kilka linków i jeden przycisk.

<header class=\"minimal-header\">
  <a href=\"/\" class=\"logo\">Studio Forma</a>

  <nav aria-label=\"Główne menu\">
    <a href=\"/projekty\">Projekty</a>
    <a href=\"/studio\">Studio</a>
    <a href=\"/kontakt\">Kontakt</a>
  </nav>
</header>

Minimalizm sprawdza się szczególnie w portfolio, stronach kreatywnych i prostych serwisach usługowych. Nie powinien jednak prowadzić do ukrywania ważnych informacji.

Wielopoziomowy header

Niektóre strony wykorzystują dwa lub trzy poziomy nagłówka:

  1. pasek informacyjny;
  2. główny obszar z logo i narzędziami;
  3. menu kategorii.

Przykład:

<header class=\"site-header\">
  <div class=\"top-bar\">
    <p>Darmowa dostawa od 200 zł</p>
  </div>

  <div class=\"main-header\">
    <a href=\"/\" class=\"logo\">Sklep Example</a>
    <form role=\"search\">...</form>
    <nav aria-label=\"Konto użytkownika\">...</nav>
  </div>

  <nav class=\"category-menu\" aria-label=\"Kategorie\">
    ...
  </nav>
</header>

Taki układ może być funkcjonalny, ale na telefonie powinien zostać znacznie uproszczony.

Top bar nad headerem

Top bar to wąski pasek zawierający promocję, dane kontaktowe lub ważny komunikat.

<div class=\"top-bar\">
  <p>Bezpłatna konsultacja dla nowych klientów</p>
  <a href=\"/kontakt\">Umów termin</a>
</div>

Może znajdować się przed headerem albo wewnątrz niego. Jeśli komunikat można zamknąć, przycisk powinien być dostępny:

<button type=\"button\" aria-label=\"Zamknij komunikat\">
  ×
</button>

Nie należy stosować zbyt wielu pasków, ponieważ zmniejszają obszar widocznej treści.

Header z wyszukiwarką

Wyszukiwarka powinna mieć poprawną etykietę:

<form class=\"header-search\" role=\"search\" action=\"/search\">
  <label for=\"site-search\">Szukaj w serwisie</label>
  <input
    id=\"site-search\"
    name=\"q\"
    type=\"search\"
    autocomplete=\"off\"
  >
  <button type=\"submit\">Szukaj</button>
</form>

Jeśli etykieta ma być niewidoczna wizualnie, można zastosować klasę ukrywającą ją w sposób dostępny dla czytników ekranu:

.visually-hidden {
  position: absolute;
  width: 1px;
  height: 1px;
  padding: 0;
  margin: -1px;
  overflow: hidden;
  clip: rect(0, 0, 0, 0);
  white-space: nowrap;
  border: 0;
}

Placeholder nie zastępuje prawidłowej etykiety.

Header z przełącznikiem języka

W serwisach wielojęzycznych przełącznik powinien jasno wskazywać dostępne wersje.

<nav aria-label=\"Wybór języka\">
  <a href=\"/pl/\" lang=\"pl\" hreflang=\"pl\" aria-current=\"page\">
    Polski
  </a>
  <a href=\"/en/\" lang=\"en\" hreflang=\"en\">
    English
  </a>
</nav>

Nie należy opierać przełącznika wyłącznie na flagach, ponieważ język nie zawsze odpowiada jednemu krajowi.

Header z trybem ciemnym

Przełącznik motywu może znajdować się w nagłówku:

<button
  type=\"button\"
  class=\"theme-toggle\"
  aria-label=\"Włącz tryb ciemny\"
  aria-pressed=\"false\"
>
  <span aria-hidden=\"true\">◐</span>
</button>

Stan aria-pressed powinien być aktualizowany przez JavaScript. Preferencję można zachować lokalnie, ale warto również uwzględniać ustawienie systemowe użytkownika.

Header z logowaniem

Przycisk logowania powinien jasno komunikować funkcję:

<nav aria-label=\"Konto użytkownika\">
  <a href=\"/logowanie\">Zaloguj się</a>
  <a href=\"/rejestracja\">Załóż konto</a>
</nav>

Po zalogowaniu:

<nav aria-label=\"Konto użytkownika\">
  <a href=\"/konto\">Moje konto</a>
  <form action=\"/wyloguj\" method=\"post\">
    <button type=\"submit\">Wyloguj się</button>
  </form>
</nav>

Wylogowanie zmienia stan sesji, dlatego w niektórych aplikacjach lepiej realizować je jako żądanie POST zamiast zwykłego linku.

Header z koszykiem

Koszyk może wskazywać liczbę produktów:

<a href=\"/koszyk\" class=\"cart-link\">
  Koszyk
  <span aria-label=\"3 produkty w koszyku\">3</span>
</a>

Nie należy przekazywać znaczenia wyłącznie przez ikonę lub kolor. Informacja powinna być zrozumiała również dla użytkownika czytnika ekranu.

Header z ikonami mediów społecznościowych

Ikony społecznościowe zwykle nie są najważniejszą funkcją nagłówka. Jeśli są używane, powinny mieć dostępne nazwy:

<a href=\"https://example.com\" aria-label=\"Profil firmy na LinkedIn\">
  <svg aria-hidden=\"true\">...</svg>
</a>

Otwarcie linku w nowej karcie powinno być stosowane rozważnie. Jeśli jest konieczne, można poinformować użytkownika o takim zachowaniu.

Struktura menu w HTML

Menu najczęściej tworzy się jako listę:

<nav aria-label=\"Główna nawigacja\">
  <ul>
    <li><a href=\"/\">Start</a></li>
    <li><a href=\"/uslugi\">Usługi</a></li>
    <li><a href=\"/kontakt\">Kontakt</a></li>
  </ul>
</nav>

Lista odzwierciedla grupę powiązanych opcji. CSS może usunąć standardowe punktory.

.main-nav ul {
  list-style: none;
  margin: 0;
  padding: 0;
}

Oznaczanie aktywnej strony w menu

Aktualny link warto oznaczyć atrybutem aria-current:

<a href=\"/blog\" aria-current=\"page\">Blog</a>

Można również zastosować styl:

.main-nav a[aria-current=\"page\"] {
  font-weight: 700;
  text-decoration: underline;
}

Nie należy polegać wyłącznie na zmianie koloru.

Typografia w headerze

Nagłówek powinien być czytelny, nawet jeśli wykorzystuje charakterystyczną typografię marki.

Warto zadbać o:

  • odpowiednią wielkość tekstu;
  • czytelne odstępy;
  • kontrast;
  • unikanie bardzo cienkich krojów;
  • ograniczenie liczby fontów;
  • poprawne ładowanie;
  • dostosowanie do małych ekranów.

Tekst menu nie powinien być zbyt mały. Ważne elementy interaktywne muszą być łatwe do zauważenia.

Rozmiar obszarów klikalnych

Link może mieć niewielką ikonę, ale jego obszar interakcji powinien być odpowiednio duży.

.icon-button {
  width: 44px;
  height: 44px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
}

Jest to szczególnie ważne na urządzeniach dotykowych.

Animacje w headerze

Animacje mogą poprawić odbiór, jeśli są subtelne i funkcjonalne.

Można animować:

  • otwieranie menu;
  • zmianę ikony;
  • pojawienie się pola wyszukiwania;
  • zmianę tła po przewinięciu;
  • podkreślenie aktywnego linku.

Należy unikać:

  • ciągłego pulsowania;
  • gwałtownych ruchów;
  • przesuwania całego układu;
  • długich opóźnień;
  • efektów utrudniających interakcję.

Warto respektować preferencję ograniczania ruchu:

@media (prefers-reduced-motion: reduce) {
  * {
    scroll-behavior: auto;
  }

  .site-header,
  .main-nav {
    transition: none;
  }
}

Z-index w headerze

Sticky lub fixed header często wymaga wyższego z-index, aby pozostawać nad treścią.

.site-header {
  position: sticky;
  top: 0;
  z-index: 100;
}

Nie warto stosować przypadkowo bardzo wysokich wartości. Lepiej stworzyć logiczną skalę warstw dla:

  • treści;
  • headera;
  • dropdownów;
  • modalnych okien;
  • powiadomień.

Problemy z warstwami mogą wynikać z nowych kontekstów stosu tworzonych przez właściwości takie jak transform, opacity czy position.

Najczęstsze błędy w kodzie HTML header

Używanie div zamiast headera bez potrzeby

<div class=\"header\">
  ...
</div>

Nie jest to zawsze błąd, ale jeśli element rzeczywiście pełni funkcję nagłówka dokumentu lub sekcji, lepiej zastosować <header>.

Umieszczanie headera w head

Niepoprawna konstrukcja:

<head>
  <header>...</header>
</head>

Element <header> powinien znajdować się w <body>.

Traktowanie headera jako nagłówka tekstowego

<header> nie zastępuje <h1> lub <h2>. Jest kontenerem, w którym mogą znajdować się nagłówki.

Brak nav wokół głównego menu

Sama lista linków działa, ale znacznik <nav> lepiej opisuje jej funkcję.

Menu działające tylko po najechaniu

Takie menu może być niedostępne na telefonach i dla klawiatury.

Klikalny div zamiast buttona

<div onclick=\"openMenu()\">Menu</div>

Lepsze rozwiązanie:

<button type=\"button\" onclick=\"openMenu()\">Menu</button>

Nieczytelne ikony bez etykiet

Ikona hamburgera, koszyka lub lupy powinna mieć dostępną nazwę.

Zbyt wiele linków

Przeładowane menu utrudnia decyzję i orientację.

Brak testów mobilnych

Header może wyglądać dobrze na szerokim ekranie, ale rozjeżdżać się na telefonie.

Zbyt wysoki sticky header

Duży przyklejony nagłówek może zajmować znaczną część ekranu.

Kiedy nie używać elementu header?

Nie każdy element znajdujący się u góry sekcji musi być headerem.

Znacznik może być niepotrzebny, gdy:

  • jest to wyłącznie dekoracyjny kontener;
  • nie pełni funkcji wprowadzającej;
  • zawiera przypadkową grupę elementów;
  • lepiej opisuje go inny znacznik;
  • jest to tylko pojedynczy nagłówek bez dodatkowej struktury.

Przykład:

<section>
  <h2>Oferta</h2>
  ...
</section>

Nie trzeba dodawać <header>, jeśli sekcja zawiera tylko jeden nagłówek i zastosowanie kontenera nie wnosi dodatkowej wartości.

Czy header może znajdować się w footerze?

Semantycznie taka konstrukcja zwykle nie ma sensu. Header reprezentuje wprowadzenie do dokumentu lub sekcji, natomiast footer zawiera informacje końcowe.

Element <header> nie powinien być potomkiem <footer>. Podobnie nie powinien znajdować się wewnątrz innego <header>.

Jeżeli w stopce potrzebny jest tytuł grupy linków, wystarczy użyć odpowiedniego nagłówka:

<footer>
  <section>
    <h2>Informacje</h2>
    ...
  </section>
</footer>

Header w komponencie React

W React element semantyczny zapisuje się tak samo:

function SiteHeader() {
  return (
    <header className=\"site-header\">
      <a href=\"/\" className=\"logo\">
        Firma
      </a>

      <nav aria-label=\"Główna nawigacja\">
        <a href=\"/oferta\">Oferta</a>
        <a href=\"/kontakt\">Kontakt</a>
      </nav>
    </header>
  );
}

Należy pamiętać o używaniu className zamiast class.

W aplikacjach korzystających z routingu warto zastąpić zwykłe linki komponentem dostarczanym przez framework, o ile zachowuje poprawną semantykę i dostępność.

Header w Vue

Przykład komponentu:

<template>
  <header class=\"site-header\">
    <RouterLink to=\"/\" class=\"logo\">
      Firma
    </RouterLink>

    <nav aria-label=\"Główna nawigacja\">
      <RouterLink to=\"/oferta\">Oferta</RouterLink>
      <RouterLink to=\"/kontakt\">Kontakt</RouterLink>
    </nav>
  </header>
</template>

Logikę mobilnego menu można obsługiwać stanem komponentu, aktualizując jednocześnie atrybut aria-expanded.

Header w szablonie WordPress

W klasycznych motywach WordPress nagłówek bywa umieszczany w pliku header.php.

Przykład:

<!doctype html>
<html <?php language_attributes(); ?>>
<head>
  <meta charset=\"<?php bloginfo(\'charset\'); ?>\">
  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">
  <?php wp_head(); ?>
</head>

<body <?php body_class(); ?>>
<?php wp_body_open(); ?>

<header class=\"site-header\">
  <a href=\"<?php echo esc_url(home_url(\'/\')); ?>\">
    <?php bloginfo(\'name\'); ?>
  </a>

  <nav aria-label=\"Główna nawigacja\">
    <?php
      wp_nav_menu([
        \'theme_location\' => \'primary\',
        \'container\' => false
      ]);
    ?>
  </nav>
</header>

Ważne jest rozróżnienie pliku header.php, który może zawierać również początek dokumentu i sekcję <head>, od samego elementu <header>.

Dynamiczny header

Niektóre serwisy zmieniają header zależnie od:

  • stanu logowania;
  • typu podstrony;
  • urządzenia;
  • roli użytkownika;
  • wybranego języka;
  • etapu procesu zakupowego;
  • przewinięcia strony.

Dynamiczność powinna być przewidywalna. Najważniejsze elementy nie powinny nagle zmieniać miejsca bez wyraźnego powodu.

Header w procesie zakupowym

W koszyku lub podczas płatności często stosuje się uproszczony header. Może zawierać jedynie logo, informację o bezpieczeństwie i kontakt do pomocy.

Celem jest ograniczenie elementów odciągających uwagę.

<header class=\"checkout-header\">
  <a href=\"/\" class=\"logo\">Sklep Example</a>
  <p>Bezpieczne płatności</p>
  <a href=\"/pomoc\">Potrzebujesz pomocy?</a>
</header>

Nie należy jednak utrudniać użytkownikowi powrotu do sklepu ani ukrywać ważnych informacji.

Header na landing page

Landing page często ma minimalistyczny nagłówek:

  • logo;
  • jeden przycisk;
  • ewentualnie telefon;
  • brak rozbudowanego menu.

Przykład:

<header class=\"landing-header\">
  <a href=\"/\" class=\"logo\">Marka</a>
  <a href=\"#formularz\" class=\"cta\">Umów rozmowę</a>
</header>

Ograniczenie nawigacji może zwiększyć koncentrację na głównym celu, ale strona nadal powinna pozostawać przejrzysta i wiarygodna.

Header a prawa autorskie i znaki towarowe

Logo, nazwy i grafiki umieszczone w headerze mogą być chronione. Należy korzystać z materiałów, do których właściciel strony posiada prawa.

Nie warto pobierać przypadkowych ikon, fontów lub logotypów bez sprawdzenia licencji. Dotyczy to szczególnie komercyjnych motywów i bibliotek graficznych.

Testowanie HTML header

Header należy sprawdzić w różnych warunkach.

Ważne testy obejmują:

  • szeroki monitor;
  • laptop;
  • tablet;
  • telefon;
  • orientację pionową i poziomą;
  • obsługę klawiaturą;
  • powiększenie tekstu;
  • tryb wysokiego kontrastu;
  • wolne połączenie;
  • wyłączony JavaScript;
  • różne przeglądarki;
  • zalogowanego i niezalogowanego użytkownika.

Warto także sprawdzić bardzo długie nazwy linków, wersje językowe oraz sytuację, w której użytkownik zwiększa domyślny rozmiar czcionki.

Debugowanie headera

Najczęstsze problemy to:

  • menu wychodzące poza ekran;
  • dropdown ukrywający się pod treścią;
  • sticky header, który nie działa;
  • nieprawidłowy z-index;
  • przesunięcie treści pod fixed header;
  • brak reakcji przycisku mobilnego;
  • skaczący układ;
  • nieczytelny fokus;
  • niewłaściwa kolejność elementów;
  • konflikt stylów.

Narzędzia deweloperskie przeglądarki pozwalają sprawdzić strukturę DOM, style, wymiary i aktywne reguły CSS.

Przykład kompletnego dostępnego headera

<a class=\"skip-link\" href=\"#main-content\">
  Przejdź do głównej treści
</a>

<header class=\"site-header\">
  <div class=\"header-container\">
    <a href=\"/\" class=\"logo\" aria-label=\"Example — strona główna\">
      <img
        src=\"/assets/logo.svg\"
        alt=\"Example\"
        width=\"150\"
        height=\"44\"
      >
    </a>

    <button
      class=\"menu-toggle\"
      type=\"button\"
      aria-expanded=\"false\"
      aria-controls=\"main-navigation\"
    >
      <span aria-hidden=\"true\">☰</span>
      <span class=\"visually-hidden\">Otwórz menu</span>
    </button>

    <nav
      id=\"main-navigation\"
      class=\"main-nav\"
      aria-label=\"Główna nawigacja\"
    >
      <ul>
        <li><a href=\"/oferta\">Oferta</a></li>
        <li><a href=\"/realizacje\">Realizacje</a></li>
        <li><a href=\"/o-nas\">O nas</a></li>
        <li><a href=\"/blog\">Blog</a></li>
        <li><a href=\"/kontakt\">Kontakt</a></li>
      </ul>
    </nav>

    <a href=\"/wycena\" class=\"header-cta\">
      Poproś o wycenę
    </a>
  </div>
</header>

<main id=\"main-content\">
  <h1>Projektujemy funkcjonalne strony internetowe</h1>
</main>

Taki przykład stanowi dobrą bazę, ale wymaga jeszcze stylów oraz obsługi menu mobilnego.

Przykładowy CSS kompletnego headera

* {
  box-sizing: border-box;
}

body {
  margin: 0;
  font-family: system-ui, sans-serif;
}

.skip-link {
  position: fixed;
  left: 16px;
  top: -100px;
  z-index: 2000;
  padding: 12px 16px;
  background: #ffffff;
  color: #000000;
}

.skip-link:focus {
  top: 16px;
}

.site-header {
  position: sticky;
  top: 0;
  z-index: 100;
  background: #ffffff;
  border-bottom: 1px solid #dddddd;
}

.header-container {
  width: min(1200px, calc(100% - 32px));
  min-height: 72px;
  margin-inline: auto;
  display: flex;
  align-items: center;
  gap: 24px;
}

.logo {
  flex: 0 0 auto;
}

.logo img {
  display: block;
  max-width: 100%;
  height: auto;
}

.main-nav {
  margin-left: auto;
}

.main-nav ul {
  display: flex;
  align-items: center;
  gap: 24px;
  margin: 0;
  padding: 0;
  list-style: none;
}

.main-nav a,
.header-cta {
  color: #222222;
  text-decoration: none;
}

.header-cta {
  display: inline-flex;
  align-items: center;
  min-height: 44px;
  padding: 0 18px;
  border: 1px solid currentColor;
  border-radius: 6px;
}

.menu-toggle {
  display: none;
  width: 44px;
  height: 44px;
  margin-left: auto;
  align-items: center;
  justify-content: center;
}

.site-header a:focus-visible,
.site-header button:focus-visible {
  outline: 3px solid currentColor;
  outline-offset: 4px;
}

.visually-hidden {
  position: absolute;
  width: 1px;
  height: 1px;
  padding: 0;
  margin: -1px;
  overflow: hidden;
  clip: rect(0, 0, 0, 0);
  white-space: nowrap;
  border: 0;
}

@media (max-width: 800px) {
  .header-container {
    min-height: 64px;
    flex-wrap: wrap;
  }

  .menu-toggle {
    display: inline-flex;
  }

  .main-nav {
    display: none;
    width: 100%;
    margin-left: 0;
  }

  .main-nav.is-open {
    display: block;
  }

  .main-nav ul {
    flex-direction: column;
    align-items: stretch;
    gap: 0;
    padding-block: 12px;
  }

  .main-nav a {
    display: block;
    padding: 12px 0;
  }

  .header-cta {
    display: none;
  }
}

Przykładowy JavaScript menu mobilnego

const toggle = document.querySelector(\".menu-toggle\");
const navigation = document.querySelector(\"#main-navigation\");

if (toggle && navigation) {
  toggle.addEventListener(\"click\", () => {
    const isOpen = toggle.getAttribute(\"aria-expanded\") === \"true\";

    toggle.setAttribute(\"aria-expanded\", String(!isOpen));
    navigation.classList.toggle(\"is-open\", !isOpen);

    const label = toggle.querySelector(\".visually-hidden\");

    if (label) {
      label.textContent = isOpen ? \"Otwórz menu\" : \"Zamknij menu\";
    }
  });
}

Kod sprawdza istnienie elementów, przełącza stan oraz aktualizuje opis przycisku.

W bardziej rozbudowanym wdrożeniu warto również:

  • zamykać menu klawiszem Escape;
  • przenosić fokus w odpowiedni sposób;
  • zamykać menu po kliknięciu linku;
  • reagować na zmianę szerokości ekranu;
  • blokować niepotrzebne przewijanie tła.

HTML header bez JavaScript

Prosty header nie potrzebuje JavaScriptu. Jeśli menu mieści się na ekranie, można zbudować je wyłącznie w HTML i CSS.

W projektach wymagających menu mobilnego można rozważyć element <details>:

<header>
  <a href=\"/\">Logo</a>

  <details>
    <summary>Menu</summary>

    <nav aria-label=\"Główna nawigacja\">
      <a href=\"/oferta\">Oferta</a>
      <a href=\"/kontakt\">Kontakt</a>
    </nav>
  </details>
</header>

Takie rozwiązanie ma wbudowaną obsługę otwierania i zamykania, ale wymaga starannego stylowania i testowania.

Walidacja kodu headera

Poprawność HTML można sprawdzić za pomocą walidatora. Warto zwrócić uwagę na:

  • prawidłowe zagnieżdżenie elementów;
  • unikalne identyfikatory;
  • zamknięcie znaczników;
  • poprawne wartości atrybutów;
  • brak elementów interaktywnych zagnieżdżonych w innych interaktywnych elementach;
  • poprawną strukturę list;
  • zgodność formularzy z etykietami.

Przykładowo nie należy umieszczać przycisku wewnątrz linku:

<a href=\"/kontakt\">
  <button type=\"button\">Kontakt</button>
</a>

Wystarczy ostylować sam link jak przycisk.

Header i progresywne ulepszanie

Podstawowe funkcje powinny działać nawet wtedy, gdy część skryptów się nie załaduje. Linki nawigacyjne powinny pozostać prawdziwymi linkami, a formularz wyszukiwania powinien móc zostać wysłany standardową metodą.

JavaScript może ulepszać doświadczenie, ale nie powinien bez potrzeby zastępować podstawowej funkcjonalności HTML.

Jak nazwać klasy CSS w headerze?

Nazewnictwo powinno być spójne z konwencją projektu.

Przykłady:

.site-header
.site-header__logo
.site-header__navigation
.site-header__actions
.site-header__toggle

Można stosować BEM, klasy użytkowe albo własny system. Najważniejsze, aby nazwy były czytelne i nie zależały wyłącznie od wyglądu.

Lepsza nazwa:

.header-actions

niż:

.right-red-box

Pierwsza opisuje funkcję, a druga aktualny wygląd i położenie, które mogą się zmienić.

Header w systemie projektowym

W większych projektach nagłówek powinien być zdefiniowany jako komponent posiadający warianty.

Możliwe warianty to:

  • standardowy;
  • transparentny;
  • sklepowy;
  • aplikacyjny;
  • uproszczony;
  • landing page;
  • proces zakupowy;
  • mobilny.

System powinien określać:

  • wysokość;
  • odstępy;
  • typografię;
  • stany linków;
  • zachowanie menu;
  • punkty przełamania;
  • rodzaje przycisków;
  • sposób prezentacji logo;
  • zasady dostępności.

Dzięki temu wszystkie widoki pozostają spójne.

Jak ocenić jakość HTML headera?

Dobry header powinien spełniać kilka warunków:

  • użytkownik od razu rozpoznaje markę;
  • najważniejsze sekcje są łatwe do znalezienia;
  • menu działa na telefonie;
  • wszystkie funkcje są dostępne z klawiatury;
  • fokus jest widoczny;
  • logo prowadzi do strony głównej;
  • linki mają zrozumiałe nazwy;
  • header nie zasłania treści;
  • kod jest semantyczny;
  • skrypty nie spowalniają strony;
  • układ pozostaje stabilny;
  • kontrast jest wystarczający;
  • elementy dotykowe są odpowiednio duże;
  • nawigacja zachowuje spójność na podstronach.

Kiedy przebudować header?

Modernizacja może być potrzebna, gdy:

  • menu nie działa na telefonach;
  • użytkownicy nie znajdują ważnych podstron;
  • nagłówek zajmuje zbyt dużo miejsca;
  • struktura rozrosła się bez planu;
  • pojawiły się nowe cele biznesowe;
  • zmieniła się identyfikacja wizualna;
  • kod jest trudny w utrzymaniu;
  • dropdowny są niedostępne;
  • strona ładuje się wolno;
  • header zachowuje się inaczej w różnych przeglądarkach.

Przebudowa nie powinna polegać wyłącznie na zmianie wyglądu. Warto wcześniej przeanalizować nawigację, statystyki, zachowanie użytkowników i najważniejsze cele strony.

HTML header jako część doświadczenia użytkownika

Header jest jednym z pierwszych elementów, które użytkownik zauważa. Wpływa na pierwsze wrażenie, orientację i ocenę wiarygodności witryny.

Dobry nagłówek odpowiada na kilka pytań:

  • gdzie jestem;
  • do kogo należy strona;
  • co mogę tutaj zrobić;
  • jak znaleźć interesującą mnie treść;
  • gdzie się zalogować;
  • jak skontaktować się z firmą;
  • jak wrócić na stronę główną.

Jeżeli użytkownik musi długo szukać odpowiedzi, header nie spełnia swojej funkcji.

HTML header jako element identyfikacji marki

Logo, kolorystyka, typografia i sposób prezentacji menu tworzą charakterystyczny obraz marki. Header może być bardzo prosty, ale powinien pozostawać spójny z pozostałymi materiałami.

Marka premium może zastosować więcej przestrzeni i spokojną typografię. Sklep dziecięcy może użyć żywszych elementów. Serwis finansowy powinien budować poczucie bezpieczeństwa i porządku.

Warstwa wizualna nie może jednak ograniczać czytelności i dostępności.

Przyszłościowe projektowanie headera

Header powinien być gotowy na rozwój strony. Warto przewidzieć:

  • dodatkową wersję językową;
  • logowanie użytkowników;
  • nową kategorię usług;
  • wyszukiwarkę;
  • rozbudowę sklepu;
  • zmianę logo;
  • wersję mobilną;
  • komunikaty systemowe;
  • personalizację;
  • nowe role użytkowników.

Nie oznacza to dodawania wszystkich funkcji od początku. Kod powinien być jednak uporządkowany, aby rozbudowa nie wymagała całkowitej przebudowy.

Znaczenie prostoty w HTML header

Najbardziej skuteczny header nie zawsze jest najbardziej rozbudowany. Jego zadaniem jest prowadzenie użytkownika, a nie prezentowanie wszystkich możliwości serwisu jednocześnie.

Warto ograniczyć menu do najważniejszych wyborów, zachować wyraźną hierarchię i umieścić jeden dominujący przycisk działania. Pozostałe informacje mogą znaleźć się w menu dodatkowym, stopce albo na odpowiednich podstronach.

HTML header powinien być semantyczny, czytelny, responsywny i dostępny. Poprawnie użyty znacznik <header> pomaga opisać strukturę dokumentu, ale o jakości całego rozwiązania decydują także nawigacja, hierarchia nagłówków, sposób działania menu, wydajność oraz dostosowanie do potrzeb użytkownika.

Najważniejsze jest rozróżnienie między <head> a <header>. Pierwszy element przechowuje informacje o dokumencie, a drugi oznacza widoczną część wprowadzającą do strony lub sekcji. Na jednym dokumencie może znajdować się więcej niż jeden header, o ile każdy z nich ma czytelny kontekst.

Dobrze zaprojektowany nagłówek nie musi być skomplikowany. Powinien szybko przedstawiać markę, prowadzić do najważniejszych treści i pozostawać wygodny niezależnie od urządzenia. To właśnie połączenie semantyki HTML, przemyślanego UX i poprawnego CSS sprawia, że header staje się funkcjonalnym fundamentem całej witryny.

Opublikuj komentarz