Najpopularniejszy sposób pisania tabeli HTML z pionowymi nagłówkami?

97

Cześć, minęło trochę czasu odkąd o coś zapytałem, to jest coś, co mnie od jakiegoś czasu niepokoi, samo pytanie jest w tytule:

Jaki jest Twój preferowany sposób pisania tabel HTML z pionowymi nagłówkami?

Przez nagłówek pionowy rozumiem, że tabela ma nagłówek (<th> tag ) po lewej stronie (ogólnie)

Nagłówek 1 Dane Dane Dane
nagłówka 2 Dane Dane Dane
nagłówka 3 Dane Dane Dane

Wyglądają tak, do tej pory wymyśliłem dwie opcje

Pierwsza opcja

   
    <table id="vertical-1">
            <caption>First Way</caption>
            <tr>
                <th>Header 1</th>
                <td>data</td><td>data</td><td>data</td>
            </tr>
            <tr>
                <th>Header 2</th>
                <td>data</td><td>data</td><td>data</td>
            </tr>
            <tr>
                <th>Header 2</th>
                <td>data</td><td>data</td><td>data</td>
            </tr>
        </table>
   

Główną zaletą tego sposobu jest to, że masz prawo nagłówki (faktycznie lewej) obok danych, które reprezentuje, co mi się nie podoba, że jednak jest <thead>,<tbody> i <tfoot>znaczniki brakuje, i nie ma sposobu, aby włączyć je bez zerwania ładnie ułożone razem elementy, które doprowadziły mnie do drugiej opcji.

Druga opcja

   
        <style type="text/css">
            #vertical-2 thead,#vertical-2 tbody{
                display:inline-block;
            }

        </style>
        <table id="vertical-2">
            <caption>Second Way</caption>
            <thead>
                <tr>
                    <th colspan="3">Header 1</th>
                </tr>
                <tr>
                    <th colspan="3">Header 2</th>
                </tr>
                <tr>
                    <th colspan="3">Header 3</th>
                </tr>
            </thead>
            <tbody>
                <tr>
                    <td>row 1</td>
                    <td>row 1</td>
                    <td>row 1</td>
                </tr>
                <tr>
                    <td>data</td>
                    <td>data</td>
                    <td>data</td>
                </tr>
                <tr>
                    <td>data</td>
                    <td>data</td>
                    <td>data</td>
                </tr>
            </tbody>
            <tfoot>
                <tr>
                    <td colspan="4">Footer</td>
                </tr>
            </tfoot>
        </table>
   

Główną zaletą jest to, że masz w pełni opisowego tabeli html, wady są, że właściwa reprezentacja potrzebuje trochę CSS dla tbodyi theadznaczników i że relacja między nagłówkami i danych nie jest jasne, jak miałem wątpliwości przy tworzeniu znaczniki.


Tak więc oba sposoby renderują tabelę tak, jak powinna, tutaj kwestia:

renderowanie
Z nagłówkami po lewej lub prawej stronie, jeśli wolisz, więc masz jakieś sugestie, alternatywy, problemy z przeglądarką?

Tristian
źródło

Odpowiedzi:

47

Po pierwsze, druga opcja nie jest do końca poprawnym kodem HTML w tym sensie, że wszystkie wiersze (TR) w tabeli powinny zawierać równą liczbę kolumn (TD). Twój nagłówek ma 1, podczas gdy treść ma 3. Powinieneś użyć atrybutu colspan, aby to naprawić.

Odniesienie: „Sekcje THEAD, TFOOT i TBODY muszą zawierać taką samą liczbę kolumn”. - Ostatni akapit sekcji 11.2.3 .

Mając to na uwadze , pierwsza opcja jest moim zdaniem lepszym podejściem, ponieważ jest czytelna niezależnie od tego, czy mam włączony CSS, czy nie. Niektóre przeglądarki (lub roboty wyszukiwarek) nie wykonują CSS i jako takie sprawią, że Twoje dane nie będą miały sensu, ponieważ nagłówek będzie wtedy reprezentował kolumny zamiast wierszy.

Francois Deschenes
źródło
Czy naprawdę konieczne jest, aby naprawił ten pierwszy problem, o którym wspomniałeś? Ponieważ jeśli dodasz tylko jedną komórkę, automatycznie zajmie ona pierwszą spację, a reszta zostanie zignorowana?
LouwHopley,
cześć dzięki za wyróżnienie nieprawidłowego znacznika, poprawię to.
Tristian
@Nideo - dodałem odniesienie z dokumentacji HTML4 w moim poście, które jasno stwierdza, że ​​THEAD, TFOOT i TBODY muszą zawierać tę samą liczbę kolumn.
Francois Deschenes
@Triztian - Jeszcze jedno. TFOOT powinna znajdować się bezpośrednio pod THEAD (i przed TBODY). Ponownie, jest to omówione w sekcji 11.2.3 specyfikacji HTML.
Francois Deschenes
1
@prodigitalson - scopeatrybut nie miałby w tym przypadku większego znaczenia. Jeśli przeczytasz, do czego to służy, zrozumiesz. Zasadniczo oznacza to, że ta kolumna jest nagłówkiem wiersza lub kolumny, którą zawiera. Problemem jest jego stosowanie nie ma sensu, chyba że jeśli było wymienić <th>z <td scope="row">.
Francois Deschenes
5

Pierwsza opcja ... myślę, że jest to lepsze i prostsze podejście.

Philemon philip Kunjumon
źródło
0

Jeśli chcesz pokazać element sterujący powiązany z danymi (jak repeater ASP) w tabeli, pierwsza opcja nie będzie możliwa. Drugiej opcji można użyć w następujący sposób.

<asp:Repeater ID="hours" runat="server">
    <HeaderTemplate>
    <table id="vertical-table">
        <thead>
            <tr><th colspan="0">hours:</th></tr>
            <tr><th colspan="1">Monday</th></tr>
            <tr><th colspan="1">Tuesday</th></tr>
            <tr><th colspan="1">Wednesday</th></tr>
            <tr><th colspan="1">Thursday</th></tr>
            <tr><th colspan="1">Friday</th></tr>
            <tr><th colspan="1">Saturday</th></tr>
            <tr><th colspan="1">Sunday</th></tr>
        </thead>
        <tbody>
    </HeaderTemplate>
    <ItemTemplate>
            <tr><td><%# Container.DataItem %></td></tr>
    </ItemTemplate>
    <FooterTemplate>
        </tbody>
    </table>
    </FooterTemplate>
</asp:Repeater>
Baz Guvenkaya
źródło
-3

div.vertical {
  margin-left: -85px;
  position: absolute;
  width: 215px;
  transform: rotate(-90deg);
  -webkit-transform: rotate(-90deg);
  /* Safari/Chrome */
  -moz-transform: rotate(-90deg);
  /* Firefox */
  -o-transform: rotate(-90deg);
  /* Opera */
  -ms-transform: rotate(-90deg);
  /* IE 9 */
}

th.vertical {
  height: 220px;
  line-height: 14px;
  padding-bottom: 20px;
  text-align: left;
}
<table>
  <thead>
    <tr>
      <th class="vertical">
        <div class="vertical">Really long and complex title 1</div>
      </th>
      <th class="vertical">
        <div class="vertical">Really long and complex title 2</div>
      </th>
      <th class="vertical">
        <div class="vertical">Really long and complex title 3</div>
      </th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Example</td>
      <td>a, b, c</td>
      <td>1, 2, 3</td>
    </tr>
  </tbody>
</table>

Deenathaiyalan Shanmugam
źródło
3
Dodaj wyjaśnienie, w jaki sposób Twoja odpowiedź rozwiązuje problem wskazany w pytaniu.
blurfus