Kurs HTML

Lekcja 9.5: Artykuły i sekcje (<article>, <section>)

Strona główna > Rozdział 9: Elementy semantyczne > Artykuły i sekcje (<article>, <section>)

Strukturyzowanie głównej treści

Podczas gdy <header>, <footer>, <nav> i <main> definiują ogólną strukturę strony, znaczniki <article> i <section> służą do bardziej szczegółowego podziału i organizacji samej treści wewnątrz <main> (lub czasem wewnątrz innych elementów, jak <aside>).

Rozróżnienie między nimi jest kluczowe dla poprawnej semantyki dokumentu, choć czasem może wydawać się niejednoznaczne.

Element <article>: Samodzielna treść

Element <article> reprezentuje kompletną, samodzielną jednostkę treści, która ma sens sama w sobie i mogłaby być potencjalnie dystrybuowana lub ponownie wykorzystana niezależnie od reszty strony (np. w kanale RSS, jako osobny dokument).

Typowe przykłady użycia <article>:

Każdy element <article> powinien być identyfikowalny, zazwyczaj poprzez posiadanie własnego nagłówka (<h1>-<h6>), często umieszczonego wewnątrz elementu <header> należącego do tego <article>.

Przykład użycia <article> dla posta na blogu:

<main>
  <article class="blog-post">
    <header>
      <h2>Jak efektywnie uczyć się HTML?</h2>
      <p>Autor: Anna Nowak, Opublikowano: <time datetime="2025-04-30">30 kwietnia 2025</time></p>
    </header>
    
    <p>Nauka HTML może być przyjemna i satysfakcjonująca...</p>
    <!-- ... dalsza treść posta ... -->
    
    <footer>
      <p>Komentarze (3)</p>
    </footer>
  </article>
  
  <article class="blog-post">
    <header>
      <h2>Nowości w CSS 2025</h2>
      <p>Autor: Piotr Zieliński, Opublikowano: <time datetime="2025-04-28">28 kwietnia 2025</time></p>
    </header>
    
    <p>Najnowsze funkcje CSS, które warto znać...</p>
    <!-- ... dalsza treść posta ... -->
  </article>
</main>

Element <section>: Tematyczna grupa treści

Element <section> reprezentuje ogólną sekcję dokumentu lub aplikacji. Służy do grupowania powiązanych tematycznie treści, zazwyczaj (choć nie zawsze) posiadających własny nagłówek (<h1>-<h6>).

<section> używamy, gdy chcemy podzielić większą całość na logiczne części, które niekoniecznie są samodzielne w taki sposób jak <article>.

Typowe przykłady użycia <section>:

Ważna zasada: Nie używaj <section> jako generycznego kontenera do stylizacji - do tego służy <div>. Używaj <section> tylko wtedy, gdy grupowana treść stanowi logiczną, tematyczną całość i zazwyczaj powinna mieć swój nagłówek.

Przykład użycia <section> na stronie głównej:

<main>
  <section id="o-nas" aria-labelledby="o-nas-heading">
    <h2 id="o-nas-heading">O Nas</h2>
    <p>Jesteśmy firmą z wieloletnim doświadczeniem...</p>
  </section>
  
  <section id="uslugi" aria-labelledby="uslugi-heading">
    <h2 id="uslugi-heading">Nasze Usługi</h2>
    <ul>
      <li>Tworzenie stron WWW</li>
      <li>Optymalizacja SEO</li>
      <li>Marketing internetowy</li>
    </ul>
  </section>
  
  <section id="kontakt" aria-labelledby="kontakt-heading">
    <h2 id="kontakt-heading">Kontakt</h2>
    <p>Skontaktuj się z nami...</p>
    <!-- Formularz kontaktowy -->
  </section>
</main>

Wskazówka dotycząca dostępności: Użycie aria-labelledby wskazującego na id nagłówka sekcji pomaga czytnikom ekranu lepiej zrozumieć strukturę i powiązać nagłówek z treścią sekcji.

<article> vs <section> vs <div> - Podsumowanie

Często zdarza się, że <article> zawiera w sobie elementy <section>, lub <section> zawiera w sobie elementy <article> (np. sekcja "Najnowsze posty" zawierająca kilka skróconych artykułów).

Zagnieżdżanie

Zarówno <article>, jak i <section> mogą być w sobie zagnieżdżane. Na przykład, komentarze do posta na blogu mogą być elementami <article> zagnieżdżonymi wewnątrz głównego <article> reprezentującego post.

<article> <!-- Post na blogu -->
  <h2>Tytuł Posta</h2>
  <p>Treść posta...</p>
  
  <section id="comments">
    <h3>Komentarze</h3>
    
    <article class="comment"> <!-- Pierwszy komentarz -->
      <header>
        <p>Autor: Użytkownik1</p>
      </header>
      <p>Treść komentarza...</p>
      
      <article class="comment-reply"> <!-- Odpowiedź na komentarz -->
        <header>
          <p>Autor: Użytkownik2</p>
        </header>
        <p>Treść odpowiedzi...</p>
      </article>
      
    </article>
    
    <article class="comment"> <!-- Drugi komentarz -->
      <!-- ... -->
    </article>
    
  </section>
</article>

Zadanie praktyczne (z rozwiązaniem)

Zadanie: Stwórz strukturę HTML dla strony z przepisem kulinarnym. Użyj <article> dla całego przepisu. Wewnątrz <article> użyj <section> do oddzielenia listy składników od instrukcji przygotowania. Upewnij się, że każda sekcja i artykuł mają odpowiednie nagłówki.

Rozwiązanie:

<!DOCTYPE html>
<html lang="pl">
<head>
    <meta charset="UTF-8">
    <title>Przepis na Szarlotkę</title>
    <style>
        body { font-family: sans-serif; }
        article { border: 1px solid #ccc; padding: 15px; margin: 20px; }
        article header h2 { margin-top: 0; }
        section { margin-top: 20px; padding-top: 10px; border-top: 1px dashed #eee; }
        section h3 { margin-top: 0; }
    </style>
</head>
<body>

<main>
    <article>
        <header>
            <h2>Przepis na Domową Szarlotkę</h2>
            <p>Klasyczny przepis na pyszną szarlotkę.</p>
        </header>
        
        <section id="skladniki" aria-labelledby="skladniki-heading">
            <h3 id="skladniki-heading">Składniki</h3>
            <ul>
                <li>1.5 kg jabłek (najlepiej szara reneta)</li>
                <li>3 szklanki mąki pszennej</li>
                <li>1 kostka masła (200g)</li>
                <li>3/4 szklanki cukru</li>
                <li>2 jajka</li>
                <li>1 łyżeczka proszku do pieczenia</li>
                <li>Cynamon do smaku</li>
            </ul>
        </section>
        
        <section id="przygotowanie" aria-labelledby="przygotowanie-heading">
            <h3 id="przygotowanie-heading">Przygotowanie</h3>
            <ol>
                <li>Mąkę przesiać z proszkiem do pieczenia.</li>
                <li>Dodać zimne masło, posiekać nożem.</li>
                <li>Dodać cukier, jajka i szybko zagnieść ciasto.</li>
                <li>Podzielić ciasto na dwie części (większą i mniejszą), owinąć folią i włożyć do lodówki na ok. 30 minut.</li>
                <li>Jabłka obrać, usunąć gniazda nasienne i zetrzeć na tarce o grubych oczkach lub pokroić.</li>
                <li>Podsmażyć jabłka z cynamonem (można dodać trochę cukru, jeśli są kwaśne).</li>
                <li>Większą częścią ciasta wylepić dno formy.</li>
                <li>Wyłożyć jabłka.</li>
                <li>Mniejszą część ciasta zetrzeć na tarce na wierzch lub zrobić kratkę.</li>
                <li>Piec w temperaturze 180°C przez około 45-50 minut, do uzyskania złotego koloru.</li>
            </ol>
        </section>
        
        <footer>
            <p>Smacznego!</p>
        </footer>
    </article>
</main>

</body>
</html>

Dodatkowe zadania do samodzielnego wykonania:

  1. Dodaj sekcję "Wskazówki" (<section>) do przepisu.
  2. Stwórz stronę z listą kilku przepisów. Każdy przepis na liście powinien być w elemencie <article>. Całą listę umieść w <main>.
  3. Zastanów się, czy sekcja komentarzy pod przepisem powinna być <section> czy może zawierać wiele elementów <article> (dla każdego komentarza).

Najczęściej zadawane pytania

Do czego służy znacznik <article>?

Do oznaczania kompletnej, samodzielnej jednostki treści, która mogłaby istnieć niezależnie, np. post na blogu, artykuł newsowy, komentarz, opis produktu.

Do czego służy znacznik <section>?

Do grupowania powiązanych tematycznie treści w ramach większej całości. Reprezentuje logiczną sekcję dokumentu, zazwyczaj z własnym nagłówkiem.

Jaka jest główna różnica między <article> a <section>?

<article> jest dla treści samodzielnej i redystrybuowalnej. <section> jest dla tematycznego podziału większej całości i niekoniecznie ma sens w oderwaniu od kontekstu.

Kiedy zamiast <section> użyć <div>?

Użyj <div>, gdy potrzebujesz kontenera tylko do celów stylizacji lub grupowania elementów, a treść nie tworzy spójnej, logicznej sekcji tematycznej, która zasługiwałaby na własny wpis w strukturze dokumentu.

Czy <article> i <section> mogą być zagnieżdżane?

Tak, oba elementy mogą być w sobie zagnieżdżane. <article> może zawierać <section>, <section> może zawierać <article>, a także mogą zawierać inne elementy tego samego typu.