W tabelach HTML łatwo zgubić czytelność, gdy jedna komórka ma opisywać kilka kolejnych wierszy. Właśnie do tego służy atrybut rowspan: porządkuje układ, ogranicza powtórzenia i pozwala zbudować tabelę, którą da się naprawdę odczytać bez zgadywania. Pokażę, kiedy go używać, jak zapisać poprawny kod i które błędy najczęściej psują cały efekt.
Co trzeba wiedzieć, zanim połączysz komórki w pionie
- To mechanizm do scalania komórki na kilka wierszy w tabeli HTML, najczęściej w danych, harmonogramach i zestawieniach.
- Działa tylko w komórkach nagłówkowych i danych tabeli, a nie jako trik do układania strony.
- Najbezpieczniej używać go tam, gdzie te same informacje rzeczywiście dotyczą kilku kolejnych rekordów.
- Specyfikacja dopuszcza wartość
0, która oznacza objęcie wszystkich pozostałych wierszy w danej grupie. - Źle użyty potrafi rozjechać strukturę tabeli, więc ważne są kolejność komórek, liczba wierszy i brak nakładania się pól.

Jak działa łączenie komórek w pionie
W praktyce chodzi o prostą rzecz: jedna komórka ma zająć miejsce większej niż pojedynczy wiersz. Jeśli w kolumnie pojawia się powtarzająca się wartość, zamiast kopiować ją w każdej linii, możesz sprawić, że jedna komórka obejmie kilka kolejnych rekordów. Taki układ jest szczególnie użyteczny w tabelach z harmonogramem, raportem lub cennikiem, gdzie logiczna grupa danych jest ważniejsza niż sztywne powtarzanie tych samych etykiet.
Godzina
Przedmiot
08:00
Matematyka
Informatyka
W tym przykładzie jedna komórka z godziną obejmuje dwa wiersze, więc nie trzeba jej wpisywać ponownie. To drobiazg, ale właśnie takie drobiazgi robią różnicę między tabelą, którą da się szybko przeskanować wzrokiem, a tabelą męczącą już po pierwszych kilku sekundach. Warto też pamiętać, że ten mechanizm działa w obrębie konkretnej sekcji tabeli, czyli nie „przeskakuje” swobodnie między nagłówkiem, ciałem i stopką.
Kiedy taki układ naprawdę ułatwia życie
Najlepiej sprawdza się tam, gdzie dane są pogrupowane naturalnie. Jeśli projektujesz tabelę z planem zajęć, zestawieniem zamówień, listą usług albo raportem finansowym, pionowe łączenie komórek pomaga zachować porządek bez sztucznego powielania tych samych informacji. W takich sytuacjach tabela staje się lżejsza wizualnie i szybciej pokazuje relacje między wierszami.
Ja traktuję ten mechanizm jako narzędzie do redukcji szumu, a nie ozdobę. Ma sens wtedy, gdy czytelnik zyskuje coś konkretnego: szybciej widzi grupy danych, łatwiej porównuje rekordy albo od razu rozumie, że kilka pozycji należy do jednego bloku. Jeśli jednak tabela ma być tylko „ładniejsza”, zwykle lepiej zostawić układ prosty. Tabele powinny wspierać analizę, a nie udawać elementy layoutu.
- Harmonogramy - jedna data, kilka wydarzeń pod spodem.
- Raporty sprzedaży - ten sam sprzedawca lub oddział dla kilku pozycji.
- Cenniki - wspólna kategoria dla wielu wariantów.
- Zestawienia administracyjne - grupowanie rekordów według działu, statusu lub miesiąca.
Gdy już wiesz, gdzie to ma sens, pozostaje najważniejsze pytanie: jak zapisać to tak, żeby tabela nadal działała poprawnie w każdej przeglądarce i w czytniku ekranu.
Jak zapisać poprawny kod bez pułapek
Najpierw określ, ile wierszy naprawdę ma objąć komórka. Potem ustaw odpowiednią wartość liczbową i dopasuj resztę tabeli tak, aby w kolejnych wierszach nie próbować wstawiać komórki w zajęte już miejsce. To ważne, bo przeglądarka nie „zgaduje” intencji autora - ona po prostu buduje siatkę tabeli zgodnie z regułami HTML.
Specyfikacja HTML dopuszcza wartości całkowite dodatnie, a także 0, które oznacza objęcie wszystkich pozostałych wierszy w danej grupie. Z kolei zbyt duże wartości są ograniczane do maksymalnego dozwolonego pułapu. W praktyce najlepiej trzymać się małych, czytelnych liczb, bo wtedy tabela pozostaje przewidywalna także przy późniejszych zmianach danych.
| Wartość | Co oznacza | Kiedy ma sens |
|---|---|---|
| 1 | Komórka zajmuje jeden wiersz, czyli standardowe zachowanie. | Gdy nie chcesz nic scalać. |
| 2, 3, 4... | Komórka rozciąga się na wskazaną liczbę kolejnych wierszy. | Przy grupach danych, które naturalnie się powtarzają. |
| 0 | Komórka obejmuje wszystkie pozostałe wiersze w swojej grupie. | Gdy liczba wierszy może się zmieniać, ale grupa ma jeden wspólny początek. |
Warto też rozróżnić samą komórkę danych od komórki nagłówkowej. Obie mogą korzystać z takiego scalania, ale nagłówki w rozbudowanych tabelach wymagają większej dyscypliny: jeśli struktura robi się złożona, dobrze opisane nagłówki są ważniejsze niż sam efekt wizualny. W JavaScript możesz to później odczytywać lub zmieniać przez właściwość rowSpan, ale to już detal techniczny, nie zastępstwo dla poprawnie zbudowanej tabeli.
Skoro kod da się już zapisać poprawnie, trzeba jeszcze wiedzieć, gdzie najłatwiej popełnić błąd - i właśnie tam najczęściej pojawiają się problemy.
Najczęstsze błędy, które psują tabelę
Najbardziej typowy błąd to próba „upychania” dodatkowych komórek w wierszach, które już zostały zajęte przez komórkę obejmującą kilka linii. Wtedy układ zaczyna się rozjeżdżać: jedna kolumna wygląda poprawnie w pierwszym wierszu, ale dalej wszystko przesuwa się o jedno miejsce. Jeśli po wprowadzeniu zmian tabela nagle przestaje się zgadzać, to zwykle właśnie tam szukałbym przyczyny.
- Za duża liczba komórek w kolejnych wierszach - przeglądarka nie wie, gdzie wstawić dane, więc przesuwa je dalej.
- Mieszanie wielu scalonych pól naraz - szczególnie przy łączeniu pionowym i poziomym w tej samej tabeli.
- Brak konsekwencji w strukturze - jeden wiersz ma inną liczbę komórek niż pozostałe bez wyraźnego powodu.
- Używanie tabeli do układu strony - wygląda to jak szybkie rozwiązanie, ale później bardzo utrudnia utrzymanie kodu.
- Ignorowanie danych dynamicznych - jeśli tabela powstaje z CMS-a lub backendu, scalanie trzeba uwzględnić już na etapie generowania HTML.
W praktyce najwięcej błędów wynika nie z samego atrybutu, ale z braku planu. Jeżeli tabela ma być tworzona dynamicznie, dobrze jest najpierw rozpisać logikę grupowania danych, a dopiero potem generować kod. To oszczędza godzin debugowania, zwłaszcza wtedy, gdy źródło danych zmienia się częściej niż sam szablon.
Dostępność i czytelność dla użytkownika
Przy tabelach złożonych wizualny porządek to za mało. Jeśli komórki obejmują kilka wierszy, czytnik ekranu i tak musi jednoznacznie zrozumieć strukturę tabeli. Dlatego przy bardziej rozbudowanych zestawieniach warto zadbać o nagłówki w odpowiednich komórkach oraz o atrybuty, które pomagają powiązać dane z właściwymi opisami. Najprostsza zasada brzmi: im bardziej złożona tabela, tym mniej miejsca na domysły.
W native HTML zwykle lepiej trzymać się zwykłych komórek tabeli niż zastępować wszystko własnymi rozwiązaniami opartymi na ARIA. Jeśli budujesz prawdziwą tabelę danych, przeglądarki i technologie wspomagające radzą sobie z nią najlepiej wtedy, gdy struktura jest po prostu poprawna. ARIA przydaje się głównie wtedy, gdy nie masz klasycznej tabeli, tylko bardziej złożoną siatkę lub komponent interfejsu. To ważne rozróżnienie, bo w praktyce wiele problemów z dostępnością bierze się właśnie z nadmiernego kombinowania.
Przy dobrze zaprojektowanej tabeli użytkownik nie musi liczyć wierszy ani zgadywać, do której grupy należy dana wartość. I właśnie do tego powinno prowadzić całe to rozwiązanie: do czytelności, a nie do dekoracji.
Co zapamiętać przy pracy z tabelami
Najkrócej mówiąc, pionowe scalanie komórek działa najlepiej wtedy, gdy dane naprawdę tworzą grupę. Jeśli używasz go oszczędnie, tabela staje się prostsza, bardziej logiczna i mniej nużąca w odbiorze. Jeśli nadużywasz go jako skrótu wizualnego, szybko pojawiają się błędy w układzie, trudności z utrzymaniem i słabsza dostępność.
- Używaj scalania tylko tam, gdzie relacja między wierszami jest naturalna.
- Planuj strukturę tabeli zanim zaczniesz pisać kod.
- Dbaj o spójność liczby komórek w kolejnych wierszach.
- Traktuj czytelność i dostępność jako część projektu, nie jako dodatek.
Jeśli tabela ma być później rozwijana, dobrze jest od razu przewidzieć, czy dane nie zmienią się na tyle, że lepiej będzie zastosować prostszy układ. W wielu projektach to właśnie prostota daje najlepszy efekt - i najrzadziej wymaga późniejszych poprawek.