Il modo più comune di scrivere una tabella HTML con intestazioni verticali?


95

Ciao a tutti, è passato un po 'di tempo da quando ho chiesto qualcosa, questo è qualcosa che mi ha infastidito per un po', la domanda stessa è nel titolo:

Qual è il tuo modo preferito di scrivere tabelle HTML con intestazioni verticali?

Per intestazione verticale intendo che la tabella ha il <th>tag header ( ) sul lato sinistro (generalmente)

Dati dati intestazione 1 Dati dati
intestazione 2 Dati dati
intestazione 3 Dati dati

Sembrano così, finora ho trovato due opzioni

Prima opzione

   
    <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>
   

Il vantaggio principale di questo modo è che si hanno le intestazioni a destra (in realtà a sinistra) accanto ai dati che rappresenta, quello che non mi piace però è che i <thead>, <tbody>ei <tfoot>tag sono mancanti, e non c'è modo per includere senza rompere la elementi ben messi insieme, che mi portano alla seconda opzione.

Seconda opzione

   
        <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>
   

Il vantaggio principale è che si dispone di una tabella HTML completamente descrittiva, gli svantaggi sono che la rappresentazione corretta ha bisogno di un po 'di CSS per le tbodye theadtag e che la relazione tra le intestazioni ei dati non è molto chiaro, come ho avuto i miei dubbi al momento della creazione il markup.


Quindi, entrambi i modi rendono la tabella come dovrebbe, qui una trappola:

render
Con le intestazioni sul lato sinistro o destro se lo preferisci, quindi, suggerimenti, alternative, problemi con il browser?

Risposte:


45

Innanzitutto, la seconda opzione non è HTML del tutto valida, nel senso che tutte le righe (TR) in una tabella dovrebbero contenere un numero uguale di colonne (TD). La tua intestazione ha 1 mentre il corpo ne ha 3. Dovresti usare l'attributo colspan per risolverlo.

Riferimento: "Le sezioni THEAD, TFOOT e TBODY devono contenere lo stesso numero di colonne." - Ultimo paragrafo della sezione 11.2.3 .

Detto questo , la prima opzione è l'approccio migliore secondo me perché è leggibile indipendentemente dal fatto che io abbia o meno abilitato CSS. Alcuni browser (o crawler dei motori di ricerca) non eseguono CSS e in quanto tali, i dati non avranno senso poiché l'intestazione rappresenterà quindi colonne anziché righe.


È davvero necessario che risolva il primo problema che hai menzionato? Perché se aggiungi solo una cella, prende automaticamente il primo spazio e il resto viene ignorato?
LouwHopley

ciao grazie per aver evidenziato il markup non valido, lo correggerò.
Tristian

@Nideo - Ho aggiunto un riferimento dalla documentazione HTML4 nel mio post che afferma chiaramente che THEAD, TFOOT e TBODY devono contenere lo stesso numero di colonne.
Francois Deschenes

@ Triztian - Un'altra cosa. Il TFOOT dovrebbe essere direttamente sotto il THEAD (e prima dei TBODY). Di nuovo, questo è trattato nella sezione 11.2.3 delle specifiche HTML.
Francois Deschenes

1
@prodigitalson - L' scopeattributo non farebbe molta differenza in questo caso. Se leggi a cosa serve, capirai. Fondamentalmente significa che la colonna è l'intestazione della riga o della colonna che contiene. Il problema è che il suo utilizzo non ha senso a meno che non si sostituisca <th>con un file <td scope="row">.
Francois Deschenes



0

Se vuoi mostrare un elemento di controllo associato a dati (come il ripetitore asp) nella tua tabella, la prima opzione non sarà possibile. La seconda opzione può essere utilizzata come segue.

<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>

-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>


3
Aggiungi una spiegazione su come la tua risposta affronta il problema identificato nella domanda.
blurfus
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.