Come inserire la spaziatura tra gli elementi TBODY


95

Ho un tavolo come questo:

<table>
    <tfoot>
        <tr><td>footer</td></tr>
    </tfoot>
    <tbody>
        <tr><td>Body 1</td></tr>
        <tr><td>Body 1</td></tr>
        <tr><td>Body 1</td></tr>
    </tbody>
    <tbody>
        <tr><td>Body 2</td></tr>
        <tr><td>Body 2</td></tr>
        <tr><td>Body 2</td></tr>
    </tbody>
    <tbody>
        <tr><td>Body 3</td></tr>
        <tr><td>Body 3</td></tr>
        <tr><td>Body 3</td></tr>
    </tbody>
</table>

Vorrei inserire un po 'di spaziatura tra ogni elemento tbody, ma padding e margin non hanno effetto. Qualche idea?


È giusto ripetere i tag "tbody"? Quello che ho visto sempre è che tutti i "<tr> .. </tr>" sono all'interno di un singolo tag "tbody".
Saneef,

23
Sì, questo è valido. La specifica dice: <! ELEMENT TABLE - - (CAPTION ?, (COL * | COLGROUP *), THEAD ?, TFOOT ?, TBODY +)> significa che devono esserci uno o più tbodies. w3.org/TR/html4/struct/tables.html#h-11.2.1
nickf

Risposte:


56

Prova questo, se non ti dispiace non avere confini.

<style>
table {
  border-collapse: collapse;
}

table tbody {
  border-top: 15px solid white;
}
</style>

<table>
    <tfoot>
        <tr><td>footer</td></tr>
    </tfoot>
    <tbody>
        <tr><td>Body 1</td></tr>
        <tr><td>Body 1</td></tr>
        <tr><td>Body 1</td></tr>
    </tbody>
    <tbody>
        <tr><td>Body 2</td></tr>
        <tr><td>Body 2</td></tr>
        <tr><td>Body 2</td></tr>
    </tbody>
    <tbody>
        <tr><td>Body 3</td></tr>
        <tr><td>Body 3</td></tr>
        <tr><td>Body 3</td></tr>
    </tbody>
</table>

7
Prova con bordo superiore: 15px trasparente solido;
Steve Almond,

3
Volevo sottolineare questo. Usa transparentcome colore del bordo. Cosa ha detto @SteveAlmond.
iheartcsharp

se la tabella / tbody / tr / td ha un colore di sfondo, l'impostazione del colore del bordo su transparentdarà il colore di sfondo dell'elemento, essenzialmente indistinguibile dal corpo dell'elemento. Dovresti colorare esplicitamente il bordo del colore con cui vuoi che appaia (per renderlo apparentemente invisibile)
Guy Passy

81

Qualcosa di simile funzionerà, a seconda dei requisiti di supporto del browser:

tbody::before
{
  content: '';
  display: block;
  height: 15px;

}

1
Questa è l'unica soluzione che funziona quando le tue celle hanno uno sfondo che lo spazio non dovrebbe avere.
Laradda,

Questo ha funzionato bene per me. Ci sono inconvenienti? Inoltre, perché due due punti?
nh2

Ottima soluzione. Mantiene tutto accessibile!
Jason T Featheringham

1
@ nh2: i due punti doppi sono per lo pseudo-contenuto e i due punti singoli sono per gli pseudo-selettori. È un aggiornamento della sintassi CSS. Tutto usato per usare solo i due punti singoli. I browser meno recenti non supportano i due punti doppi (come, IE <= 8).
dbmikus

3
Non è più sicuro da usare display: table-row;?
Rachel

20

Le persone avranno sempre opinioni controverse sull'utilizzo di elementi di tabella vuoti per il layout di una pagina (come evidenziato dal voto negativo di questa risposta). Lo riconosco, ma a volte è più facile usarli in questo modo quando si lavora in modo " veloce e sporco ".

Ho usato righe vuote in progetti precedenti per spaziare gruppi di righe di tabella. Ho assegnato alle righe spaziatore una classe CSS propria e ho definito un'altezza per quella classe che fungeva da margine superiore e inferiore per quel gruppo di righe della tabella.

    .separator{
             height: 50px;
    }

   <table>
           <tr><td>Cell 1</td><td>Cell 2</td></tr>
           <tr><td>Cell 1</td><td>Cell 2</td></tr>
           <tr><td>Cell 1</td><td>Cell 2</td></tr>

           <tr class="separator" colspan="2"></tr>

           <tr><td>Cell 1</td><td>Cell 2</td></tr>
           <tr><td>Cell 1</td><td>Cell 2</td></tr>
           <tr><td>Cell 1</td><td>Cell 2</td></tr>

           <tr class="separator" colspan="2"></tr>

           tr><td>Cell 1</td><td>Cell 2</td></tr>
           <tr><td>Cell 1</td><td>Cell 2</td></tr>
           <tr><td>Cell 1</td><td>Cell 2</td></tr>
   </table>

Se non hai bordi sulle celle della tabella, puoi anche definire un'altezza per la tua cella o riga tipica nel tuo foglio di stile che spazia uniformemente su tutte le righe della tabella.

tr{
   height: 40px;
}

beh, se hai intenzione di aggiungere un markup extra, perché non mettere semplicemente una classe sulla prima riga di ogni corpo?
nickf

Bene, ciò potrebbe essere dovuto al fatto che le righe sono codice generato e l'aggiunta di una riga separata nel markup potrebbe essere più gestibile rispetto alla creazione di un caso speciale per la prima riga di contenuto generato.
Rolf Rander

12
Downvote tutto quello che vuoi, ma questa è l'unica soluzione senza inconvenienti - e anche se viola la separazione, una riga vuota non è un grosso problema IMO.
Xkeeper

11
Senza inconvenienti, il mio culo! Prova a utilizzare uno screen reader su questo e nota il conteggio delle righe errato. Meglio ancora, prova a copiare e incollare la tabella in un foglio di calcolo. Ti riformatterai per ore se hai molti contenuti. Le tabelle hanno lo scopo di visualizzare i dati (ed essere estremamente accessibili), non di shim la presentazione tra le sezioni.
Jason T Featheringham

È solo visivo. Tieni presente che anche html sono documenti che possono essere elaborati, quindi il contenuto al loro interno dovrebbe essere ben formattato. Come accennato in precedenza, la tabella copia-incolla o l'utilizzo dello screen reader fallirà. Tale progettazione non dovrebbe essere incoraggiata. :: content solution è migliore perché non rovina il markup.
pawel-kuznik

12

Avevo avuto problemi a spaziare correttamente i multipli <tbody>con ::beforepseudo, in presenza di <tr>contenere <td>con rowspan in un paio di browser.

Fondamentalmente, se hai una <tbody>struttura come questa:

<tbody>
    <tr>
        <td>td 1</td>
        <td rowspan"2">td 2</td>
        <td>td 3</td>
        <td>td 4</td>
    </tr>
    <tr>
        <td>td 1</td>
        <td>td 2</td>
        <td>td 4</td>
    </tr>
</tbody>

E segui chi consiglia di scrivere css su ::beforepseudo elemento come questo:

tbody::before
{
    content: '';
    display: block;
    height: 10px;
}

Questo influenzerà il rowspan, facendo in modo che la tabella "perda" entro la seconda <tr>quanti <td>-rowspan sono presenti nella prima.

Quindi, se qualcuno incontra quel tipo di problema, la soluzione è di stile ::beforepseudo in questo modo:

tbody::before
{
    content: '';
    display: table-row;
    height: 10px;
}

Ecco un violino


6

Ecco un'altra possibilità che si basa su: first-child che non è disponibile in tutti i browser:

<style>
table {
  border-collapse: collapse;
}

td {
  border: 1px solid black;
}

tbody tr:first-child td {
  padding-top: 15px;
}

</style>

<table>
    <tfoot>
        <tr><td>footer</td></tr>
    </tfoot>
    <tbody>
        <tr><td>Body 1</td></tr>
        <tr><td>Body 1</td></tr>
        <tr><td>Body 1</td></tr>
    </tbody>
    <tbody>
        <tr><td>Body 2</td></tr>
        <tr><td>Body 2</td></tr>
        <tr><td>Body 2</td></tr>
    </tbody>
    <tbody>
        <tr><td>Body 3</td></tr>
        <tr><td>Body 3</td></tr>
        <tr><td>Body 3</td></tr>
    </tbody>
</table>

3
Questo non funzionerà molto bene se hai qualcosa che fa affidamento sulla posizione del contenuto rispetto alla dimensione della cella, come l'ombra del riquadro, le immagini di sfondo o praticamente qualsiasi altra cosa.
Xkeeper

1
Giusto per chiarire agli altri che trovano questa risposta su Google, presumo che poiché è stata scritta nel 2008, questa risposta ora (2015) ha il pieno supporto su tutti i principali browser? Almeno il controllo su caniuse.com first-child sembra ben supportato?
redfox05

6

Basta impostare displaycome blocke funzionerà.

table tbody{
    display:block;
    margin-bottom:10px;
    border-radius: 5px;
}

1
questa risposta dovrebbe essere la risposta accettata perché è l'unica che permette di usare un tbody delimitato con colonne "no-border".
robsonrosa

13
display:blockinterrompe l'allineamento delle colonne tra gli elementi tbody. Non ottieni più il vantaggio del motore di layout del tavolo
M Conrad

4

Di tutte le risposte fornite sopra, solo quelle di djenson47 mantengono la separazione tra presentazione e contenuto . Lo svantaggio del metodo del modello del bordo compresso è che non è più possibile utilizzare gli attributi del bordo o dello spazio tra le celle della tabella per separare le singole celle. Potresti sostenere che questa è una buona cosa e che ci sono alcune soluzioni alternative, ma può essere un problema. Quindi penso che il metodo del primo figlio sia il più elegante.

In alternativa, puoi anche impostare la proprietà di overflow della tua classe TBODY su qualcosa di diverso da "visibile". Questo metodo consente di mantenere anche un modello di bordi separati:

<style>
tbody {
    overflow: auto;
    border-top: 1px solid transparent;
}
</style>
<table>
    <tfoot>
        <tr><td>footer</td></tr>
    </tfoot>
    <tbody>
        <tr><td>Body 1</td></tr>
        <tr><td>Body 1</td></tr>
        <tr><td>Body 1</td></tr>
    </tbody>
    <tbody>
        <tr><td>Body 2</td></tr>
        <tr><td>Body 2</td></tr>
        <tr><td>Body 2</td></tr>
    </tbody>
    <tbody>
        <tr><td>Body 3</td></tr>
        <tr><td>Body 3</td></tr>
        <tr><td>Body 3</td></tr>
    </tbody>
</table>

Stavo cercando di fare qualcosa di simile, questo è perfetto per me
Eruant

4

Poiché il padding può essere applicato ai TD, puoi fare un trucco con il segno +. Quindi sarà possibile dare un top padding ai TD del primo TR di un corpo:

// The first row will have a top padding
table tbody + tbody tr td {
    padding-top: 20px;
}

// The rest of the rows should not have a padding
table tbody + tbody tr + tr td {
    padding-top: 0px;
}

Ho aggiunto "tbody + tbody" così il primo tbody non avrà un'imbottitura superiore. Tuttavia, non è richiesto.

Per quanto ne so non ci sono inconvenienti :), sebbene non abbia testato i browser più vecchi.


2

È possibile utilizzare border-spacingin una tabella con gruppi di righe di tabella per aggiungere uno spazio tra questi gruppi. Tuttavia, non credo che ci sia un modo per specificare quali gruppi sono distanziati e quali no.

<table>
  <thead>
    ...
  </head>
  <tbody>
    ...
  </tbody>
  <tbody>
    ...
  </tbody>
  <tfoot>
    ...
  </tfoot>
</table>

CSS

table {
  border-spacing: 0px 10px; /* h-spacing v-spacing */
}

0

NUOVA RISPOSTA

Puoi utilizzare tutti i <tbody>tag che desideri. Fino ad ora non avevo realizzato che andasse bene per W3C. Per non dire che la mia soluzione di seguito non funziona (funziona), ma per fare quello che stai cercando di fare, assegna le <tbody>classi dei tag e quindi fai riferimento ai loro <td>tag individuali tramite CSS in questo modo:

table tbody.yourClass td {
    padding: 10px;
}

e il tuo HTML così:

<table> 
<tbody>
<tr><td>Text</td></tr>
<tr><td>Text</td></tr>
<tr><td>Text</td></tr>
</tbody>
<tbody class="yourClass">    
<tr><td>Text</td></tr>
<tr><td>Text</td></tr>
<tr><td>Text</td></tr>
</tbody>
<tbody>
<tr><td>Text</td></tr>
<tr><td>Text</td></tr>
<tr><td>Text</td></tr>
</tbody>
</table>

Prova quel ragazzo :)

VECCHIA RISPOSTA

qualunque cosa tu faccia, NON inserire righe vuote ...

non dovresti avere più di 1 elemento tbody nella tua tabella. quello che puoi fare è impostare l'attributo class o id nei tuoi <tr>elementi e dare il <td>riempimento dei tag corrispondenti :

table {
    border-collapse: collapse;
}

tr.yourClass td {
    padding: 10px;
}

Puoi anche assegnare la parte superiore e inferiore <tr>di una classe aggiuntiva in modo che eseguano solo il riempimento superiore o inferiore, rispettivamente:

tr.yourClass.topClass td {
    padding: 10px 0 0 0;
}

tr.yourClass.bottomClass td {
    padding: 0 0 10px 0;
}

e nel tuo codice HTML, il <tr>tag sarebbe simile a questo:

<table> 
<tbody>
<tr><td>Text</td></tr>
<tr><td>Text</td></tr>
<tr><td>Text</td></tr>
<tr class="yourClass topClass"><td>Text</td></tr>
<tr class="yourClass"><td>Text</td></tr>
<tr class="yourClass bottomClass"><td>Text</td></tr>
<tr><td>Text</td></tr>
<tr><td>Text</td></tr>
<tr><td>Text</td></tr>
</tbody>
</table>

Spero che questo ti aiuti!


0

La risposta di djensen47 funziona alla grande per i browser più recenti, tuttavia, come è stato sottolineato, IE7 non funziona in.

La mia soluzione alternativa per questo problema per supportare i browser meno recenti era di avvolgere il contenuto di ogni cella all'interno di un div. Quindi aggiungi un margine superiore al div.

<table class="tbl">
<tr></tr>
<tr></tr>
<tr></tr>
<tr><td><div></div></td></tr>
</table>

CSS

.tbl tr td div {
    height:30px;
    margin-top:20px;
}

L'impostazione dell'altezza mantiene le celle alte almeno 30px per evitare che la colorazione delle celle utilizzata all'interno del div collassi attorno al testo. Il margine superiore crea lo spazio desiderato rendendo l'intera riga più alta.


0

Mi sono imbattuto in questo mentre cercavo di risolverlo da solo. Ho avuto successo mettendo un <br>tag subito prima del </tbody>tag di chiusura . È una correzione puramente visiva, ma sembra funzionare sulla maggior parte dei browser che ho testato.

<table>
    <tbody>
        <tr>
            <td></td>
        </tr>
        <br>
    </tbody>
    <tbody>
        <tr>
            <td></td>
        </tr>
    </tbody>
</table>

Dovrebbe essere anche accessibile.

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.