Podstawy HTML i CSS: jak powstaje strona internetowa?

0
311
2.5/5 - (4 votes)

Nawigacja:

Od pliku do strony: jak faktycznie powstaje strona internetowa

Strona internetowa nie jest niczym magicznym. To po prostu kilka plików tekstowych, które przeglądarka potrafi odczytać i wyświetlić w atrakcyjnej formie. Fundamentem są dwa języki: HTML (szkielet i treść) oraz CSS (wygląd i układ). Zrozumienie ich podstaw wystarcza, aby samodzielnie stworzyć prostą, ale w pełni działającą stronę WWW.

Najprostsza możliwa strona to jeden plik: index.html. Można go utworzyć w zwykłym edytorze tekstu, zapisując plik w odpowiednim formacie. Gdy taki plik otworzy się w przeglądarce, ta zaczyna czytać kod od góry do dołu, rozpoznaje znaczniki HTML i na tej podstawie rysuje to, co widzimy na ekranie.

CSS wchodzi do gry, kiedy trzeba nadać stronie konkretny wygląd: ustawić kolory, wyrównać elementy, dostosować układ do telefonu i monitora, uporządkować marginesy i odstępy. HTML bez CSS przypomina dokument w Wordzie bez formatowania: treść jest, ale całość wygląda bardzo surowo. Połączenie obu technologii pozwala przejść od surowego „szkicu” do kompletnego projektu.

Proces tworzenia strony internetowej zwykle wygląda podobnie: najpierw powstaje szkic struktury w HTML, potem dołączane są style CSS, później ewentualnie dochodzi JavaScript. Sam HTML i CSS wystarczą, by stworzyć wizytówkę firmy, blog, prosty landing page czy stronę informacyjną – czyli zdecydowaną większość tego, co codziennie oglądają użytkownicy.

Struktura dokumentu HTML: szkielet każdej strony WWW

Minimalny dokument HTML krok po kroku

Każda poprawna strona w HTML zaczyna się od konkretnego szkieletu. Przeglądarka oczekuje pewnych elementów w określonej kolejności. Najprostszy szablon nowoczesnej strony HTML5 wygląda tak:

<!DOCTYPE html>
<html lang="pl">
  <head>
    <meta charset="UTF-8">
    <title>Tytuł strony</title>
  </head>
  <body>
    <p>Witaj w świecie HTML i CSS!</p>
  </body>
</html>

Każda linijka ma swoje zadanie:

  • <!DOCTYPE html> – informacja dla przeglądarki, że dokument używa standardu HTML5. Dzięki temu przeglądarka nie przełącza się w „tryb zgodności” ze starymi stronami.
  • <html lang=”pl”> – główny element otaczający całą stronę, z atrybutem lang określającym język treści. To pomaga m.in. czytnikom ekranowym i wyszukiwarkom.
  • <head> – sekcja nagłówkowa dokumentu. Zawiera informacje o stronie, ale nie jej właściwą treść widoczną dla użytkownika.
  • <meta charset=”UTF-8″> – ustawienie kodowania znaków. UTF-8 pozwala bez problemu używać polskich liter i większości alfabetów.
  • <title> – tytuł strony wyświetlany na karcie przeglądarki i w wynikach wyszukiwania.
  • <body> – główna treść strony: nagłówki, akapity, listy, obrazy, formularze i wszystko, co użytkownik zobaczy w oknie przeglądarki.

Przy tworzeniu pierwszej strony najlepiej przygotować taki „szablon bazowy” i kopiować go dla kolejnych plików HTML, stopniowo rozbudowując zawartość body i sekcję head.

Rola sekcji <head> w działaniu strony

Sekcja head nie jest efektowna wizualnie, bo użytkownik jej nie widzi, ale ma duży wpływ na działanie, wydajność i widoczność strony. To tutaj umieszcza się dane techniczne, informacje dla wyszukiwarek, ikony czy odwołania do plików CSS i skryptów.

Typowe elementy w <head> to między innymi:

  • <meta charset=”UTF-8″> – kodowanie znaków, omawiane wcześniej.
  • <meta name=”viewport” content=”width=device-width, initial-scale=1.0″> – kluczowy element dla stron responsywnych. Informuje przeglądarkę mobilną, że układ strony ma dopasować się do szerokości ekranu urządzenia.
  • <meta name=”description” content=”Krótki opis strony”> – opis używany często jako fragment w wynikach wyszukiwania.
  • <link rel=”stylesheet” href=”style.css”> – dołączenie zewnętrznego pliku CSS.
  • <link rel=”icon” href=”favicon.ico”> – ikonka strony w karcie przeglądarki.

Przykładowa, nieco bardziej rozbudowana sekcja head może wyglądać następująco:

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Podstawy HTML i CSS</title>
  <meta name="description" content="Naucz się, jak powstaje strona internetowa na bazie HTML i CSS.">
  <link rel="stylesheet" href="style.css">
</head>

Dzięki tym kilku liniom strona nie tylko poprawnie wyświetli polskie znaki, ale również będzie wygodna w obsłudze na smartfonach i czytelnie opisana w wyszukiwarce.

Elementy blokowe i liniowe: zrozumienie układu HTML

HTML składa się z elementów, które można podzielić na dwie podstawowe grupy: blokowe i liniowe. To rozróżnienie jest kluczowe dla układu strony i współpracy z CSS.

Elementy blokowe (np. <div>, <p>, <h1>–<h6>, <ul>, <section>) zajmują całą dostępna szerokość rodzica i zaczynają się od nowej linii. Zachowują się jak „klocki”, które układa się jeden pod drugim. Nadają strukturę, dzielą treść na bloki.

Elementy liniowe (np. <span>, <a>, <strong>, <em>, <img>) w naturalny sposób układają się w linii tekstu, nie rozpoczynają nowego wiersza. Służą do wyróżniania lub umieszczania drobnych elementów wewnątrz akapitów i nagłówków.

Przykład pokazujący różnicę:

<p>To jest akapit z <strong>ważnym</strong> słowem.</p>
<p>Drugi akapit.</p>

<p> jest elementem blokowym – każdy tworzy nową linię. <strong> jest liniowy – wyróżnia tekst, ale nie przerywa linii. Zrozumienie tego podziału bardzo ułatwia późniejsze pozycjonowanie elementów za pomocą CSS.

Najważniejsze znaczniki HTML do budowy treści

Nagłówki, akapity i semantyczna struktura tekstu

Podstawą czytelnej treści są nagłówki i akapity. HTML udostępnia sześć poziomów nagłówków: od <h1> (najważniejszy) do <h6> (najmniej ważny). W typowej stronie używa się zwykle poziomów <h1>–<h3>, rzadziej niższych.

Przykładowa struktura nagłówków w artykule może wyglądać tak:

<h1>Tytuł główny strony</h1>
<h2>Sekcja pierwsza</h2>
<p>Treść sekcji pierwszej...</p>
<h3>Podsekcja</h3>
<p>Treść podsekcji...</p>
<h2>Sekcja druga</h2>
<p>Treść sekcji drugiej...</p>

Element <h1> powinien być w dokumencie unikalny i reprezentować główny tytuł strony. Niższe poziomy nagłówków porządkują treść, ułatwiają użytkownikom „skanowanie” strony, a wyszukiwarkom – zrozumienie hierarchii informacji.

Do zwykłych akapitów tekstu służy <p>. Nie ma sensu nadużywać innego znacznika w roli akapitu. Z kolei <br> stosuje się wyłącznie do pojedynczego złamania linii, np. w wierszu lub adresie, a nie do tworzenia przerw między blokami tekstu.

Sprawdź też ten artykuł:  RODO dla nastolatka: jakie dane udostępniasz w aplikacjach i co z tego wynika

Listy, cytaty i wyróżnienia w tekście

Gdy trzeba wyliczyć kilka punktów, używa się list. HTML dostarcza dwa podstawowe typy:

  • <ul> – lista nieuporządkowana (zwykle wypunktowana kropkami lub myślnikami),
  • <ol> – lista uporządkowana (numerowana).

Każdy element listy zapisuje się jako <li>:

<h2>Najprostsze elementy HTML</h2>
<ul>
  <li>Nagłówki (<h1>–<h6>)</li>
  <li>Akapity (<p>)</li>
  <li>Listy (<ul>, <ol>, <li>)</li>
</ul>

Do cytowania większych fragmentów tekstu używa się <blockquote>, zwykle razem z akapitem w środku. Mniejsze wyróżnienia w tekście realizuje się za pomocą:

  • <strong> – znaczące wyróżnienie (najczęściej pogrubienie, ale ważny jest sens – informuje, że treść ma większe znaczenie),
  • <em> – wyróżnienie poprzez emfatyczne zaakcentowanie (zwykle kursywa),
  • <code> – krótki fragment kodu komputerowego.

Dzięki tym kilku znacznikom tekst staje się bardziej czytelny, logicznie uporządkowany i lepiej odbierany zarówno przez człowieka, jak i przez wyszukiwarki.

Obrazy i atrybut alt: treść wizualna a dostępność

Grafika to ważny element większości stron WWW. Do osadzania obrazów używa się znacznika <img>. Jest to element pusty (nie ma znacznika zamykającego) i korzysta z atrybutów:

  • src – ścieżka do pliku graficznego,
  • alt – alternatywny tekst wyświetlany, gdy obraz się nie załaduje lub odczytywany przez czytniki ekranowe,
  • width, height – wymiary obrazka (opcjonalne, ale przydatne).

Przykład poprawnego użycia:

<img src="logo.png" alt="Logo firmy XYZ" width="200" height="80">

Atrybut alt jest często pomijany, a ma ogromne znaczenie dla dostępności. Jeśli obraz niesie konkretną treść (np. infografika, wykres, zdjęcie produktu), alt powinien ją oddawać w skrócie. Jeśli grafika jest czysto dekoracyjna, a sama strona jest projektowana z myślą o dostępności, alt można zostawić pusty (<img src=”…” alt=””>), aby nie wprowadzać szumu dla czytników ekranowych.

Umieszczanie sensownych opisów alt pomaga także wyszukiwarkom zrozumieć zawartość graficzną i może poprawić widoczność w wyszukiwarce obrazów.

Linki i nawigacja po stronach

Strona internetowa żyje dzięki linkom. Podstawowym znacznikiem do tworzenia odnośników jest <a>. Najważniejszy atrybut to href, wskazujący na adres docelowy:

<a href="https://example.com">Przejdź do strony</a>

Linki dzielą się na:

  • zewnętrzne – prowadzące do innych domen, np. <a href=”https://example.com”>Zewnętrzna strona</a>,
  • wewnętrzne – prowadzące do innych podstron w obrębie tej samej witryny, np. <a href=”kontakt.html”>Kontakt</a>.

Można też tworzyć kotwice, czyli linki prowadzące do konkretnego miejsca na tej samej stronie. Wystarczy nadać elementowi atrybut id i odwołać się do niego za pomocą #:

<h2 id="sekcja-html">HTML</h2>
...
<a href="#sekcja-html">Przejdź do sekcji o HTML</a>

Ostrożnie trzeba podchodzić do atrybutu target=”_blank”, który otwiera link w nowej karcie. Warto używać go jedynie tam, gdzie użytkownik rzeczywiście powinien pozostać na obecnej stronie (np. podczas wypełniania formularza).

Osoba programująca na laptopie z widocznym kodem HTML
Źródło: Pexels | Autor: Lukas Blazek

Semantyczny HTML: zrozumiała struktura strony

Nowe znaczniki HTML5: header, nav, main, footer

HTML5 wprowadził zestaw znaczników semantycznych, które opisują funkcję poszczególnych fragmentów strony. Zamiast używać wszędzie <div> i nadawać mu klasy, można sięgnąć po gotowe elementy:

  • <header> – nagłówek strony lub sekcji (np. logo, menu, tytuł),
  • <nav> – główna nawigacja, zbiory linków prowadzące po stronie lub witrynie,
  • section, article, aside: logiczne dzielenie treści

    Poza podstawowymi blokami jak <header> czy <footer>, HTML5 udostępnia też znaczniki przeznaczone do porządkowania właściwej treści strony. Zamiast układać wszystko w kolejnych <div>, można posłużyć się elementami opisującymi znaczenie fragmentu:

    • <section> – logiczna sekcja strony, zwykle z własnym nagłówkiem,
    • <article> – samodzielna jednostka treści (np. wpis na blogu, news, karta produktu),
    • <aside> – treść poboczna, dodatkowa (np. panel boczny, przypisy, linki pokrewne).

    Układ prostego bloga może wyglądać tak:

    <main>
      <article>
        <header>
          <h1>Tytuł wpisu</h1>
          <p>Data publikacji, autor</p>
        </header>
    
        <section>
          <h2>Wprowadzenie</h2>
          <p>Krótki wstęp do tematu...</p>
        </section>
    
        <section>
          <h2>Główna część</h2>
          <p>Szczegółowy opis zagadnienia...</p>
        </section>
    
        <footer>
          <p>Tagi, link do komentarzy</p>
        </footer>
      </article>
    
      <aside>
        <h2>Najnowsze wpisy</h2>
        <ul>
          <li><a href="#">Tytuł 1</a></li>
          <li><a href="#">Tytuł 2</a></li>
        </ul>
      </aside>
    </main>
    

    Taka struktura pomaga czytnikom ekranowym, wyszukiwarkom i wszelkim narzędziom analizującym stronę zrozumieć, która treść jest główna, a która tylko ją uzupełnia.

    role i aria-label: dodatkowe wsparcie dla dostępności

    Semantyczne znaczniki często wystarczą, ale w bardziej złożonych interfejsach przydają się atrybuty z rodziny ARIA. Służą do doprecyzowania ról i nazw elementów interfejsu, szczególnie gdy tworzy się zaawansowane komponenty (np. rozwijane menu, zakładki).

    Prosty przykład nawigacji z dodatkowym opisem:

    <nav aria-label="Główne menu">
      <ul>
        <li><a href="index.html">Strona główna</a></li>
        <li><a href="oferta.html">Oferta</a></li>
        <li><a href="kontakt.html">Kontakt</a></li>
      </ul>
    </nav>
    

    Dzięki aria-label urządzenia asystujące komunikują użytkownikowi, że to „Główne menu”, a nie dowolna lista linków. W podobny sposób można opisywać przyciski ikonowe, które nie zawierają tekstu:

    <button type="button" aria-label="Otwórz wyszukiwarkę">
      <img src="icon-search.svg" alt="">
    </button>
    

    Warunek jest jeden: ARIA powinna uzupełniać istniejącą semantykę, a nie ją zastępować. Zaczyna się od poprawnego HTML, a dopiero potem korzysta z dodatkowych atrybutów.

    Wprowadzenie do CSS: jak nadać styl stronie

    Trzy sposoby dodawania CSS do dokumentu

    Kod HTML opisuje strukturę i znaczenie, natomiast CSS odpowiada za wygląd. Style można podłączyć na kilka sposobów, z których każdy ma swoje miejsce:

    • zewnętrzny arkusz – osobny plik .css, dołączany przez <link> w <head>,
    • style w <style> – blok CSS zapisany bezpośrednio w dokumencie HTML,
    • style inline – pojedynczy atrybut style w konkretnym znaczniku.

    Najczęściej stosuje się pierwszą opcję, bo ułatwia to utrzymanie kodu i ponowne użycie styli na wielu stronach.

    <!-- Zewnętrzny arkusz -->
    <head>
      <link rel="stylesheet" href="style.css">
    </head>
    
    <!-- Blok <style> w dokumencie -->
    <head>
      <style>
        body {
          font-family: system-ui, sans-serif;
        }
      </style>
    </head>
    
    <!-- Style inline (stosować oszczędnie) -->
    <p style="color: red;">Ważny komunikat</p>
    

    Style inline trudno nadpisywać i wyszukiwać w projekcie. Sprawdzają się jedynie w pojedynczych, wyjątkowych sytuacjach (np. test A/B, jednorazowa zmiana).

    Selektory, właściwości i wartości: składnia CSS w praktyce

    Podstawowy blok CSS składa się z selektora i listy par właściwość–wartość ujętej w nawiasy klamrowe:

    selektor {
      właściwość: wartość;
      inna-właściwość: inna wartość;
    }
    

    Kilka prostych przykładów:

    body {
      font-family: Arial, sans-serif;
      background-color: #f5f5f5;
    }
    
    h1 {
      font-size: 2rem;
      color: #222;
    }
    
    p {
      line-height: 1.6;
    }
    

    Selektor określa, do jakich elementów odnosi się dany fragment CSS (np. wszystkie <p>, wszystkie elementy z klasą .btn). Właściwości to konkretne cechy wyglądu, takie jak kolor tekstu (color), rozmiar czcionki (font-size), marginesy (margin), obramowanie (border).

    Selektory typu, klas i identyfikatorów

    W codziennej pracy używa się przede wszystkim trzech podstawowych rodzajów selektorów. Różnią się one zakresem działania i siłą nadpisywania styli.

    • Selektor typu – wskazuje na znacznik HTML, np. body, p, h1.
    • Selektor klasy – zaczyna się od kropki, można go nadać wielu elementom.
    • Selektor identyfikatora – zaczyna się od #, w założeniu unikalny w dokumencie.

    Przykład użycia klas i identyfikatora w HTML:

    <h1 id="glowny-tytul">Podstawy HTML i CSS</h1>
    <p class="lead">Krótki opis artykułu.</p>
    <p>Dalsza treść...</p>
    <a href="kontakt.html" class="btn">Skontaktuj się</a>
    

    Oraz odpowiadający im CSS:

    #glowny-tytul {
      text-align: center;
    }
    
    .lead {
      font-size: 1.1rem;
      color: #555;
    }
    
    .btn {
      display: inline-block;
      padding: 0.5rem 1rem;
      background-color: #0077ff;
      color: #fff;
      text-decoration: none;
      border-radius: 4px;
    }
    

    Klasy są wygodnym sposobem na grupowanie elementów o podobnym wyglądzie. Można ich używać wielokrotnie i łączyć ze sobą, np. <button class=”btn btn-primary”>.

    Dziedziczenie i specyficzność: dlaczego styl działa (lub nie)

    Gdy projekt staje się większy, te same elementy mogą być opisane wieloma regułami CSS. O tym, który styl „wygra”, decydują trzy główne mechanizmy: kolejność, dziedziczenie i specyficzność.

    • Kolejność – jeśli dwa identyczne selektory ustawiają tę samą właściwość, obowiązuje ten zapisany później w arkuszu.
    • Dziedziczenie – część właściwości (np. color, font-family) przechodzi z elementu rodzica na potomków, inne (np. margin, padding) już nie.
    • Specyficzność – im „dokładniejszy” selektor, tym większa ma pierwszeństwo.

    Porównanie kilku selektorów (od najsłabszego do najsilniejszego):

    1. p { color: blue; }
    2. .info { color: green; }
    3. #komunikat { color: red; }

    Dla elementu zapisanego jako <p id=”komunikat” class=”info”>…</p> zwycięży kolor czerwony, bo selektor z identyfikatorem (#komunikat) jest najbardziej szczegółowy.

    Przydatna zasada z praktyki: unika się niepotrzebnie skomplikowanych selektorów (np. header nav ul li a.btn), bo w dłuższej perspektywie utrudniają nadpisywanie styli i refaktoryzację.

    Układ strony z użyciem CSS

    Box model: marginesy, obramowanie i wypełnienie

    Każdy element w HTML traktowany jest przez CSS jak prostokąt, który składa się z kilku warstw. To tak zwany box model:

    • content – właściwa treść (tekst, obrazek),
    • padding – odstęp między treścią a obramowaniem,
    • border – ramka dookoła,
    • margin – zewnętrzny odstęp od innych elementów.

    Prosty przykład z komentarzami:

    .kafelek {
      width: 300px;            /* szerokość treści */
      padding: 16px;           /* odstęp wewnątrz */
      border: 1px solid #ddd;  /* cienka ramka */
      margin: 16px;            /* odstęp od innych elementów */
    }
    

    Domyślnie przeglądarka liczy szerokość i wysokość bez paddingu i borderu. Często wygodniej jest zmienić ten model na bardziej intuicyjny, dodając na początku arkusza:

    *,
    *::before,
    *::after {
      box-sizing: border-box;
    }
    

    Dzięki temu width obejmuje już padding i border, a planowanie układu staje się prostsze.

    Flexbox: nowoczesne układanie elementów w rzędach i kolumnach

    Do układania elementów obok siebie przez lata używano floatów i tabelek, ale dzisiaj najwygodniejszym narzędziem jest Flexbox. Pozwala tworzyć elastyczne wiersze i kolumny, które dobrze zachowują się na różnych szerokościach ekranu.

    Aby włączyć Flexbox dla kontenera, wystarczy ustawić display: flex:

    .kontener {
      display: flex;
      gap: 16px;
    }
    
    .kolumna {
      background-color: #fff;
      padding: 16px;
      border-radius: 8px;
    }
    

    W HTML taki układ wygląda wtedy tak:

    <div class="kontener">
      <div class="kolumna">Kolumna 1</div>
      <div class="kolumna">Kolumna 2</div>
      <div class="kolumna">Kolumna 3</div>
    </div>
    

    Najczęściej używane właściwości Flexboxa to:

    • flex-direction – ustawienie kierunku (row, column),
    • justify-content – wyrównanie w osi głównej (np. space-between, center),
    • align-items – wyrównanie w osi poprzecznej (np. stretch, center),
    • flex – sposób „rozciągania się” elementu względem rodzeństwa.

    Dla prostego układu trzech kolumn o równych szerokościach wystarczy:

    .kontener {
      display: flex;
      gap: 16px;
    }
    
    .kolumna {
      flex: 1;
    }
    

    Responsywność: media queries i elastyczne jednostki

    Użytkownicy wchodzą na strony z telefonów, tabletów, laptopów i dużych monitorów. Żeby układ był czytelny na każdym z tych urządzeń, stosuje się podejście responsywne. Trzonem są media queries – warunki, przy których CSS zmienia zachowanie.

    Typowy przykład przełączania układu z trzech kolumn na jeden stosowany pionowo:

    .kontener {
      display: flex;
      gap: 16px;
    }
    
    .kolumna {
      flex: 1;
    }
    
    /* Na węższych ekranach (np. telefony) ustawiamy elementy jeden pod drugim */
    @media (max-width: 768px) {
      .kontener {
        flex-direction: column;
      }
    }
    

    Drugim filarem responsywności są elastyczne jednostki (%, rem, vw). Zamiast sztywnego font-size: 18px, często stosuje się np.:

    html {
      font-size: 16px;
    }
    
    body {
      font-size: 1rem;    /* 1 × 16px */
    }
    
    h1 {
      font-size: 2rem;    /* 2 × 16px */
    }
    

    Zmiana bazowej wielkości czcionki w jednym miejscu (na elemencie html) automatycznie skaluje cały tekst. Przy projektowaniu nagłówków, odstępów i bloków treści wyraźnie ułatwia to późniejsze korekty.

    Łączenie HTML i CSS w prosty projekt

    Mały przykład: wizytówka jednej strony (one-page)

    Dla uporządkowania wszystkich elementów przydaje się krótki przykład kompletnej struktury. Poniższy szkic pokazuje, jak można połączyć semantyczny HTML z podstawowym CSS, tworząc prostą stronę-wizytówkę.

    Struktura przykładowej strony: HTML krok po kroku

    Poniżej kompletna, uproszczona struktura jednego pliku HTML z sekcjami typowymi dla małej strony-wizytówki:

    <!DOCTYPE html>
    <html lang="pl">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1">
      <title>Moja strona wizytówka</title>
      <link rel="stylesheet" href="style.css">
    </head>
    <body>
      <header class="site-header">
        <nav class="nav">
          <a href="#start" class="nav__logo">Logo</a>
          <ul class="nav__list">
            <li><a href="#o-mnie">O mnie</a></li>
            <li><a href="#oferta">Oferta</a></li>
            <li><a href="#kontakt">Kontakt</a></li>
          </ul>
        </nav>
        <section id="start" class="hero">
          <h1>Jan Kowalski – projektant stron</h1>
          <p class="hero__lead">Tworzę przejrzyste i szybkie witryny dla małych firm.</p>
          <a href="#kontakt" class="btn btn--primary">Umów konsultację</a>
        </section>
      </header>
    
      <main>
        <section id="o-mnie" class="section section--light">
          <div class="container">
            <h2>O mnie</h2>
            <p>Kilka zdań o doświadczeniu, podejściu do pracy i specjalizacji.</p>
          </div>
        </section>
    
        <section id="oferta" class="section">
          <div class="container">
            <h2>Oferta</h2>
            <div class="kontener uslugi">
              <article class="kafelek usluga">
                <h3>Strony firmowe</h3>
                <p>Proste, czytelne witryny z nastawieniem na kontakt od klienta.</p>
              </article>
    
              <article class="kafelek usluga">
                <h3>Sklepy internetowe</h3>
                <p>Integracja z popularnymi systemami płatności i dostaw.</p>
              </article>
    
              <article class="kafelek usluga">
                <h3>Audyt UX</h3>
                <p>Analiza użyteczności istniejącej strony oraz lista usprawnień.</p>
              </article>
            </div>
          </div>
        </section>
    
        <section id="kontakt" class="section section--light">
          <div class="container">
            <h2>Kontakt</h2>
            <p>Napisz kilka zdań o swoim projekcie, a odpowiem najpóźniej następnego dnia roboczego.</p>
            <form class="form">
              <label class="form__field">
                <span>Imię i nazwisko</span>
                <input type="text" name="name" required>
              </label>
    
              <label class="form__field">
                <span>Adres e-mail</span>
                <input type="email" name="email" required>
              </label>
    
              <label class="form__field">
                <span>Wiadomość</span>
                <textarea name="message" rows="4" required></textarea>
              </label>
    
              <button type="submit" class="btn btn--primary">Wyślij</button>
            </form>
          </div>
        </section>
      </main>
    
      <footer class="site-footer">
        <div class="container">
          <p>&copy; <span id="year">2024</span> Jan Kowalski</p>
        </div>
      </footer>
    </body>
    </html>
    

    Podstawowe style dla mini-projektu

    Do takiej struktury dochodzi plik CSS, który ustawia ogólny wygląd, typografię i kilka prostych komponentów. Jeden z możliwych wariantów:

    /* Reset / normalizacja w podstawowej formie */
    *,
    *::before,
    *::after {
      box-sizing: border-box;
    }
    
    body {
      margin: 0;
      font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
      line-height: 1.6;
      color: #222;
      background-color: #f5f5f5;
    }
    
    /* Pomocniczy kontener ograniczający szerokość treści */
    .container {
      max-width: 960px;
      margin: 0 auto;
      padding: 0 16px;
    }
    
    /* Nagłówek i nawigacja */
    .site-header {
      background-color: #ffffff;
      border-bottom: 1px solid #e0e0e0;
    }
    
    .nav {
      display: flex;
      align-items: center;
      justify-content: space-between;
      padding: 12px 16px;
      max-width: 960px;
      margin: 0 auto;
    }
    
    .nav__logo {
      font-weight: 700;
      text-decoration: none;
      color: #0077ff;
    }
    
    .nav__list {
      list-style: none;
      display: flex;
      gap: 16px;
      margin: 0;
      padding: 0;
    }
    
    .nav__list a {
      text-decoration: none;
      color: #333;
      font-size: 0.95rem;
    }
    
    .nav__list a:hover {
      color: #0077ff;
    }
    
    /* Sekcja startowa (hero) */
    .hero {
      padding: 64px 16px 48px;
      text-align: center;
      background: linear-gradient(135deg, #0077ff, #00aaff);
      color: #ffffff;
    }
    
    .hero__lead {
      max-width: 520px;
      margin: 16px auto 24px;
      font-size: 1.1rem;
    }
    
    /* Ogólne sekcje */
    .section {
      padding: 56px 0;
      background-color: #f5f5f5;
    }
    
    .section--light {
      background-color: #ffffff;
    }
    
    .section h2 {
      margin-top: 0;
      margin-bottom: 24px;
      font-size: 1.8rem;
    }
    
    /* Przyciski */
    .btn {
      display: inline-block;
      padding: 0.6rem 1.4rem;
      border-radius: 999px;
      border: 1px solid transparent;
      font-size: 0.95rem;
      text-decoration: none;
      cursor: pointer;
      text-align: center;
    }
    
    .btn--primary {
      background-color: #ffffff;
      color: #0077ff;
      border-color: #ffffff;
      font-weight: 600;
    }
    
    .btn--primary:hover {
      background-color: #e6f1ff;
      border-color: #d0e4ff;
    }
    
    /* Kafelki z usługami */
    .uslugi {
      display: flex;
      gap: 16px;
      flex-wrap: wrap;
    }
    
    .usluga {
      flex: 1 1 260px;
      background-color: #ffffff;
      border-radius: 8px;
      border: 1px solid #e0e0e0;
      padding: 20px;
      box-shadow: 0 2px 4px rgba(0, 0, 0, 0.04);
    }
    
    .usluga h3 {
      margin-top: 0;
      margin-bottom: 8px;
      font-size: 1.2rem;
    }
    
    /* Formularz kontaktowy */
    .form {
      max-width: 520px;
    }
    
    .form__field {
      display: flex;
      flex-direction: column;
      margin-bottom: 16px;
      font-size: 0.9rem;
    }
    
    .form__field span {
      margin-bottom: 4px;
    }
    
    .form input,
    .form textarea {
      font: inherit;
      padding: 8px 10px;
      border-radius: 4px;
      border: 1px solid #cbd5e1;
      resize: vertical;
    }
    
    .form input:focus,
    .form textarea:focus {
      outline: none;
      border-color: #0077ff;
      box-shadow: 0 0 0 1px #0077ff33;
    }
    
    /* Stopka */
    .site-footer {
      border-top: 1px solid #e0e0e0;
      background-color: #ffffff;
      padding: 16px 0;
      font-size: 0.9rem;
    }
    
    .site-footer p {
      margin: 0;
      text-align: center;
      color: #555;
    }
    
    /* Responsywność */
    @media (max-width: 768px) {
      .nav {
        flex-direction: column;
        align-items: flex-start;
        gap: 8px;
      }
    
      .hero {
        padding-top: 48px;
        padding-bottom: 40px;
      }
    
      .uslugi {
        flex-direction: column;
      }
    }
    

    Semantyka a dostępność: kilka dobrych nawyków

    HTML to nie tylko wygląd, ale również struktura wykorzystywana przez czytniki ekranu, wyszukiwarki i różne urządzenia. Kilka prostych decyzji na etapie pisania znaczników mocno ułatwia życie osobom korzystającym z technologii asystujących.

    • Użycie jednego logicznego łańcucha nagłówków: <h1> na tytuł strony, niżej <h2>, <h3> itd. bez przeskakiwania po poziomach.
    • Stosowanie znaczników <nav>, <main>, <header>, <footer>, <section>, <article> zamiast samych <div>.
    • Dodawanie atrybutu alt do obrazów z opisem treściowym, np. <img src=”portret.jpg” alt=”Jan Kowalski przy biurku”>.
    • Kontrast tekstu do tła na poziomie czytelnym także na słabszych ekranach (ciemny tekst na jasnym tle lub odwrotnie).
    • Logiczna kolejność w HTML zgodna z kolejnością odczytu – układ CSS nie powinien jej „łamac” tylko po to, by było efektowniej.

    Przykład fragmentu HTML spełniającego te zasady przy prostym bloku z informacją:

    <section aria-labelledby="sekcja-info">
      <div class="container">
        <h2 id="sekcja-info">Dla kogo są te usługi</h2>
        <p>Najczęściej pracuję z małymi firmami, freelancerami i organizacjami pozarządowymi.</p>
      </div>
    </section>
    

    Przyjazne klasy: prosty system nazewnictwa