Elegant Themes dodało do Divi natywny moduł Table of Contents. W pierwszym wpisie pokazałem, do czego służy ten moduł i jak wdrożyć go w Theme Builderze dla szablonu wpisów.

Tym razem sprawdzimy coś ważniejszego z technicznego punktu widzenia: jaki kod HTML generuje nowy moduł i czy jest on poprawny semantycznie.

Spis treści to nie tylko lista linków. To element nawigacyjny w obrębie dokumentu, który powinien być zrozumiały dla użytkowników, czytników ekranowych, wyszukiwarek i narzędzi analizujących strukturę strony.

Dlaczego semantyka spisu treści ma znaczenie?

Spis treści pełni funkcję nawigacji wewnętrznej artykułu. Pozwala szybko przejść do konkretnej sekcji i sprawia, że struktura wpisu staje się bardziej czytelna.

Dobrze przygotowany spis treści powinien:

  • używać elementu nawigacyjnego,
  • zawierać prawdziwe linki do sekcji,
  • korzystać z listy ol lub ul,
  • zachowywać hierarchię nagłówków,
  • mieć czytelną etykietę dla technologii asystujących,
  • nie dublować informacji odczytywanych przez czytniki ekranowe.

Postanowiłem zajrzeć do kodu generowanego przez nowy moduł Divi.

Struktura HTML modułu

Po dodaniu modułu Table of Contents Divi generuje strukturę zbliżoną do poniższej:

html
<div class="et_pb_table_of_contents et_pb_module">
  <h2 class="et_pb_table_of_contents__title">Spis treści</h2>

  <nav class="et_pb_table_of_contents__nav" aria-label="Table of Contents">
    <div class="et_pb_table_of_contents__empty" hidden aria-hidden="true">
      Brak nagłówków w tym dokumencie
    </div>

    <ol class="et_pb_table_of_contents__list et_pb_table_of_contents__list--root et_pb_table_of_contents__list--ordered">
      <li class="et_pb_table_of_contents__item et_pb_table_of_contents__list--level-2">
        <a class="et_pb_table_of_contents__link" href="#" data-et-toc-link="skad-pomysl">
          <span aria-hidden="true" class="et_pb_table_of_contents__marker">1.</span>
          <span class="et_pb_table_of_contents__link-text">Skąd pomysł</span>
        </a>
      </li>
    </ol>
  </nav>
</div>

Dobra wiadomość: Divi nie generuje przypadkowego zestawu divów. Moduł używa elementu nav, listy ol, elementów li i linków — to solidna baza semantyczna.

nav — spis treści jako nawigacja

Największy plus to użycie elementu <nav>. Spis treści jest formą nawigacji wewnątrz dokumentu, więc nav jest tutaj właściwym wyborem — przeglądarka, czytniki ekranowe i inne narzędzia mogą rozpoznać tę sekcję jako blok nawigacyjny.

W kodzie pojawia się też:

html
aria-label="Table of Contents"

To dobry kierunek, bo etykieta informuje technologie asystujące, czym jest ta nawigacja. Jest jednak jeden problem: domyślna etykieta jest po angielsku. Na polskiej stronie powinno być:

html
aria-label="Spis treści"

W ustawieniach zaawansowanych modułu można dodać własny atrybut aria-label, co pozwala ręcznie poprawić opis. Warto jednak zauważyć, że wewnętrzny element nav może nadal korzystać z angielskiej etykiety „Table of Contents". To drobiazg, ale dobrze byłoby, gdyby Elegant Themes dopracowało tę kwestię w kolejnych aktualizacjach.

Lista uporządkowana ol

Divi generuje spis treści jako listę uporządkowaną:

html
<ol>
  <li>...</li>
</ol>

To dobry wybór, szczególnie gdy włączona jest numeracja. Spis treści z natury ma strukturę porządkową: 1, 1.1, 1.1.1 itd.

Warto zauważyć, że numeracja widoczna przy linkach jest ukryta przed czytnikami ekranowymi:

html
<span aria-hidden="true">1.</span>

To poprawne rozwiązanie — sama lista ol już przekazuje informację o kolejności. Gdyby czytnik ekranowy dodatkowo odczytywał ręcznie dodany numer, dochodziłoby do niepotrzebnego dublowania.

Linki i aktywna sekcja

Każdy element spisu treści jest linkiem prowadzącym do odpowiedniej sekcji wpisu:

html
<a href="#" data-et-toc-link="skad-pomysl" aria-current="location">
  <span class="et_pb_table_of_contents__link-text">Skąd pomysł</span>
</a>

Na plus wypada atrybut aria-current="location", który wskazuje aktualnie aktywną sekcję dokumentu — przydatny detal dostępnościowy, szczególnie gdy moduł podświetla bieżący punkt podczas przewijania strony.

Mniej elegancko wygląda natomiast href="#". Klasyczna postać:

html
href="#skad-pomysl"

byłaby lepsza. Divi przechowuje docelową kotwicę w atrybucie data-et-toc-link i obsługuje przewijanie przez JavaScript — funkcjonalnie działa to poprawnie, ale klasyczny href="#id-sekcji" byłby czystszym rozwiązaniem.

Tytuł modułu i opcja „Include Module Title"

Moduł generuje tytuł jako:

html
<h2 class="et_pb_table_of_contents__title">Spis treści</h2>

To nie jest błąd, ale taki nagłówek staje się częścią struktury dokumentu. Jeśli moduł znajduje się na początku wpisu lub w bocznej kolumnie, może to wpłynąć na hierarchię nagłówków strony.

Divi oferuje opcję Include Module Title, która decyduje o tym, czy tytuł modułu ma zostać uwzględniony w wygenerowanej tabeli. Dzięki temu można ustawić „Spis treści" jako widoczny nagłówek modułu, ale nie włączać go do listy linków.

Komunikat pustego stanu

Gdy moduł nie znajdzie nagłówków, domyślnie wyświetla:

No headings found in this post.

Na polskiej stronie brzmi to źle, ale Divi pozwala zmienić ten tekst w polu Empty State Message. Można więc ustawić np.:

Brak nagłówków w tym dokumencie.

To mały, ale ważny detal — moduł nie jest całkowicie zamknięty na lokalizację.

Największa wątpliwość: zagnieżdżenie nagłówków

Najważniejszy punkt techniczny dotyczy struktury wielopoziomowego spisu treści.

Wizualnie moduł potrafi pokazać hierarchię:

1. Sekcja H2
   1.1. Sekcja H3
        1.1.1. Sekcja H4

W kodzie widać jednak klasy w stylu et_pb_table_of_contents__list--level-2, co sugeruje, że Divi generuje jedną płaską listę i różnicuje poziomy nagłówków wyłącznie klasami CSS.

Semantycznie poprawna struktura wyglądałaby tak:

html
<ol>
  <li>
    Sekcja H2
    <ol>
      <li>
        Sekcja H3
        <ol>
          <li>Sekcja H4</li>
        </ol>
      </li>
    </ol>
  </li>
</ol>

Taki kod lepiej oddaje relacje między sekcjami i podsekcjami. Płaska lista stylowana klasami nie jest katastrofą — wizualnie wszystko działa i użytkownik rozumie strukturę — ale prawdziwie zagnieżdżona lista byłaby lepszym rozwiązaniem semantycznym.

Ocena semantyki

Nowy moduł Table of Contents oceniam bardzo pozytywnie.

Plusy:

  • element nav,
  • lista ol z elementami li,
  • prawdziwe linki do sekcji,
  • atrybut aria-current="location",
  • ukrycie wizualnej numeracji przez aria-hidden="true",
  • możliwość zmiany komunikatu pustego stanu,
  • opcja wykluczenia tytułu modułu ze spisu,
  • możliwość dodania własnego aria-label.

Do poprawy:

  • domyślna etykieta aria-label jest po angielsku,
  • wewnętrzny nav powinien lepiej respektować lokalizację strony,
  • href="#" jest mniej semantyczne niż klasyczne href="#sekcja",
  • wielopoziomowa struktura wygląda na płaską listę stylowaną klasami zamiast prawdziwie zagnieżdżonych list.

Moja ocena: 8,5/10. Jak na natywny moduł buildera wizualnego — naprawdę dobry wynik.

Podsumowanie

Nowy moduł Table of Contents w Divi to nie tylko wygodny dodatek dla blogerów. To również całkiem dobrze przemyślany element od strony semantyki HTML i dostępności.

Nie jest idealny. Chciałbym zobaczyć lepszą lokalizację domyślnych etykiet, klasyczne kotwice w href oraz prawdziwie zagnieżdżone listy dla struktur H2/H3/H4. Najważniejsze podstawy są jednak zrobione dobrze: nav, ol, li, linki i sensowne atrybuty dostępności.

W porównaniu z ręcznym budowaniem spisu treści, zewnętrznymi wtyczkami czy własnymi generatorami to duży krok naprzód. Dla blogów opartych na Divi, szczególnie tych zbudowanych na szablonach w Theme Builderze, nowy moduł może szybko stać się jednym z podstawowych elementów dobrze zaprojektowanego wpisu.

 

Spis treści

NLWeb — opis narzędzia

NLWeb — opis narzędzia

Czym jest NLWeb NLWeb to otwarty standard Microsoftu który pozwala stronie internetowej odpowiadać na pytania w języku naturalnym — zarówno od ludzi jak i od agentów AI. Bez NLWeb: agent otwiera stronę, scrape’uje HTML, próbuje zrozumieć strukturę, szuka...

Warstwa IoT: gdy agenty wychodzą z przeglądarki

Warstwa IoT: gdy agenty wychodzą z przeglądarki

Wpis piąty z serii Budujemy Agentic Web. Poprzednie: Warstwa Web, Warstwa Commerce, Warstwa Enterprise, Warstwa Cybersec. Przez cztery poprzednie wpisy agent AI żył w przeglądarce albo w API. Czytał strony, wykonywał transakcje, przeglądał dokumenty, odpowiadał na...

WebMCP — opis narzędzia

WebMCP — opis narzędzia

Czym jest WebMCP WebMCP (Web Model Context Protocol) to propozycja standardu przeglądarkowego która pozwala stronie internetowej wystawić agentowi AI gotowy zestaw akcji do wykonania — zamiast zmuszać agenta do zgadywania struktury interfejsu i udawania myszki. Bez...

ChatGPT Atlas — opis narzędzia

ChatGPT Atlas — opis narzędzia

Czym jest ChatGPT Atlas ChatGPT Atlas to dedykowana przeglądarka internetowa od OpenAI z ChatGPT wbudowanym w każdą kartę. Uruchomiona w październiku 2025, dostępna na macOS. W odróżnieniu od rozszerzeń przeglądarkowych — Atlas to osobna aplikacja przeglądarkowa gdzie...

Claude in Chrome — opis narzędzia

Claude in Chrome — opis narzędzia

Czym jest Claude in Chrome Claude in Chrome to rozszerzenie do przeglądarki Google Chrome które zamienia Clauda w agenta przeglądarkowego. Zamiast opisywać Claudowi co widzisz na ekranie — Claude sam otwiera strony, czyta ich zawartość, klika elementy i wykonuje...