Grafika kluczowa - tabela i szerokość kolumn

Domyślnie szerokość kolumny w tabeli jest automatycznie dopasowywana tak, aby zmieścić umieszczoną w niej zawartość. Spójrzmy na poniższy przykład tabeli z trzema kolumnami, w której nie zdefiniowaliśmy szerokości ani tabeli, ani poszczególnych komórek.

<table border="1">
    <tr>
        <td>Tekst</td>
        <td>Długi tekst</td>
        <td>Strasznie długi tekst</td>
    </tr>
</table>
Efekt
TekstDługi tekstStrasznie długi tekst

Jak widać powyżej zarówno komórki, jak i sama tabela przyjmują taką szerokość, aby zmieścić umieszczony w komórkach tekst. Definiując szerokość całej tabeli na 100% otrzymamy szerszą tabelę, ale kolumny nadal będą miały różną szerokość w zależności od ich zawartości.

<table border="1" style="width:100%;">
    <tr>
        <td>Tekst</td>
        <td>Długi tekst</td>
        <td>Strasznie długi tekst</td>
    </tr>
</table>
Efekt
TekstDługi tekstStrasznie długi tekst

I tu dochodzimy do naszego tytułowego pytania. Co zrobić, by wszystkie kolumny miały jednakową szerokość? Można na przykład dla każdej komórki ustawić tę samą szerokość podawaną w pikselach, jeśli znamy szerokość tabeli lub w procentach jeśli tabela np. ma ustawione 100% szerokości tak jak w naszym przykładzie. Wtedy każda komórka powinna mieć 33% szerokości… ale zgubiliśmy gdzieś 1% i jeszcze są obramowania. No i będziemy mieli znów robotę, gdy zmieni się liczba kolumn. Na szczęście jest prostsze rozwiązanie.

Proste rozwiązanie na stałą szerokość kolumn.

Tak jak wspomniałem na początku, przeglądarka domyślnie dobiera szerokość kolumn w sposób automatyczny, czyli szerokość komórki zależy od jej zawartości. Możemy to automatyczne dopasowanie po prostu wyłączyć i wtedy zawartość komórek nie będzie wpływała na ich szerokość. Szerokość tabeli zostanie po równo rozdzielona między kolumny. Skorzystamy z selektora table-layout i ustawimy jego wartość na fixed, domyślnie ma auto. Spójrzmy na przykład.

<table border="1" style="width:100%;table-layout:fixed;">
    <tr>
        <td>Tekst</td>
        <td>Długi tekst</td>
        <td>Strasznie długi tekst</td>
    </tr>
</table>
Efekt
TekstDługi tekstStrasznie długi tekst

Jak widać wszystkie kolumny mają jednakową szerokość. Oczywiście nadal możemy nadawać szerokość poszczególnym komórkom, wtedy pozostała dostępna szerokość zostanie podzielona po równo pomiędzy resztę kolumn.

<table border="1" style="width:100%;table-layout:fixed;">
    <tr>
        <td style="width:50%;">Tekst</td>
        <td>Długi tekst</td>
        <td>Strasznie długi tekst</td>
    </tr>
</table>
Efekt
TekstDługi tekstStrasznie długi tekst

Kilka dodatkowych informacji

Przy niezdefiniowanym selektorze table-layout lub ustawionym na auto przeglądarka podczas renderowania tabeli najpierw oblicza minimalne i maksymalne szerokości kolumn, następnie odczytuje zawartość komórek, by ostatecznie rozplanować szerokości kolumn. Z racji, że musi się tak napracować trwa to nieco dłużej niż przy table-layout: fixed, gdzie szerokości kolumn są z góry ustalone. Warto o tym pamiętać, choć różnica w czasie przy niewielkich tabelach jest dla człowieka niezauważalna.

Szerokość konkretnej kolumny można zdefiniować korzystając z tagów <col>, ale powszechniejszym sposobem jest ustawienie szerokości komórki w danej kolumnie. Należy tylko pamiętać, że musi to być komórka w pierwszym wierszu tabeli. Jeśli ustawimy szerokość komórki w innym niż pierwszy wiersz tabeli to nie wpłynie to na szerokość kolumny. Widać to na poniższym przykładzie.

<table border="1" style="width:100%;table-layout:fixed;">
    <tr>
        <td>Tekst</td>
        <td>Długi tekst</td>
        <td>Strasznie długi tekst</td>
    </tr>
    <tr>
        <td style="width:50%;">Tekst 2</td>
        <td>Długi tekst 2</td>
        <td>Strasznie długi tekst 2</td>
    </tr>
</table>
Efekt
TekstDługi tekstStrasznie długi tekst
Tekst 2Długi tekst 2Strasznie długi tekst 2

Więcej o tagu <col> przeczytasz już wkrótce w artykule „Jak nadać styl całej kolumnie tabeli?”.