CSS: come si crea uno spazio tra le righe in una tabella?


94

Significa rendere la tabella risultante meno simile a questa:

[=== ROW ===]
[=== ROW ===]
[=== ROW ===]
[=== ROW ===]

... e altri come questo:

[=== ROW ===]

[=== ROW ===]

[=== ROW ===]

[=== ROW ===]

Ho provato ad aggiungere

margin-bottom:1em;

sia a td che a tr ma non ha ottenuto nulla. Qualche idea?


2
Perché non il cellpacing e il cellpadding?
adatapost

1
La spaziatura delle celle darà anche la spaziatura tra le colonne.
rahul

4
Cellspacing e cellpadding non sono HTML (X) validi. Non dovresti usarli.
freiksenet

8
@freiksenet: ti sbagli. Sono HTML4 rigorosamente validi ( w3.org/TR/html401/struct/tables.html#h-11.2.1 ), XHTML1 ( w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd ) e persino XHTML1 .1 ( w3.org/MarkUp/DTD/xhtml-table-1.mod ).
mercator

Risposte:


214

Tutto ciò di cui hai bisogno:

table {
    border-collapse: separate;
    border-spacing: 0 1em;
}

Ciò presuppone che tu voglia un gap verticale di 1em e nessun gap orizzontale. Se lo stai facendo, probabilmente dovresti anche controllare l'altezza della tua linea.

Un po 'strano che alcune delle risposte fornite dalle persone riguardino il collasso del confine: collasso, il cui effetto è l'esatto opposto di ciò che la domanda chiedeva.


oh giusto, stavo cercando di ottenere una colonna specifica per avere una spaziatura più ampia, quindi non ho pensato di applicarla al tavolo
Jonathan.

4
Questa soluzione non consente di applicare selettivamente la spaziatura a determinate righe.
Flimm

15
La domanda non lo richiedeva.
John Haugeland

Questa è una buona idea, ma per colmare il divario superiore della prima fila ho dovuto trovare una soluzione alternativa che non è standard immagino ma funzioni. Dando il thead, tbody {position: relative; top: -{border-spacing-value} }.
Farzad YZ

3
posso dire che ti amo? Oh mio Dio. mi hai appena salvato un $$
NikosKeyz

93
table {
    border-collapse: collapse;
}

td {
    padding-top: .5em;
    padding-bottom: .5em;
}

Le celle non reagiranno a nulla a meno che non imposti prima il collasso del bordo. Puoi anche aggiungere bordi agli elementi TR una volta impostato (tra le altre cose).

Se questo è per il layout, passerei all'utilizzo di DIV e tecniche di layout più aggiornate, ma se si tratta di dati tabulari, buttati fuori. Faccio ancora un uso massiccio di tabelle nelle mie applicazioni web per i dati.


L'hai testato? Sembra che i td possano avere imbottitura con o senza collasso. I bordi funzionano con il collasso, ma non su IE.
Kobi

Questo ha funzionato. Fastidioso che i margini non funzionino, ma in questo caso non importa. Grazie.
MGOwen

30
Questo è davvero un pessimo approccio. Stai modificando la scatola delle celle per posizionare le celle, piuttosto che posizionare semplicemente le celle, fondendo le celle insieme perché vuoi che siano separate. Nel momento in cui le cellule hanno bisogno di sfondi, sei fregato. L'approccio corretto è il confine separato, non il collasso del confine, usando la separazione del confine per definire, sai, la separazione del confine.
John Haugeland,

1
È quasi il primo pezzo di CSS2 che è stato implementato, perché i browser avevano già implementati spazi tra le tabelle per la versione HTML che tutti usavano per un layout accurato ai pixel. Sì, ne sono certo. :)
John Haugeland

1
È uno di quegli strani angoli del CSS di cui solo le persone che hanno letto le specifiche conoscono. (Ce ne sono un numero sorprendentemente elevato. Allo stesso modo il galleggiante non dovrebbe praticamente mai essere usato nel modo in cui è usato nella pratica.)
John Haugeland

7

Se nessuna delle altre risposte è soddisfacente, puoi sempre creare una riga vuota e modellarla con CSS in modo appropriato per essere trasparente.


Perché il voto negativo? Le altre risposte sono problematiche: la risposta di rpflo richiede di utilizzare il border-collapse e di espandere il riempimento delle celle, facendo apparire le celle più grandi piuttosto che creare una spaziatura tra di loro. La risposta di John Haugeland non ti consente di applicare selettivamente la spaziatura a determinate righe. Potrei andare avanti, ma questa risposta è un'opzione che ha funzionato per il mio caso d'uso quando nessuna delle altre risposte ha funzionato.
Flimm

2
L'approccio downvoted dell'utente anonimo di specificare l'altezza delle singole righe con CSS è di gran lunga superiore all'aggiunta di contenuto fittizio alla tabella, nella possibilità che sia necessario controllare le singole righe, che non è l'oggetto di questa domanda.
John Haugeland

Le righe false confondono anche gli strumenti che si aspettano che le righe della tabella siano righe della tabella (come importanti strumenti di accessibilità per i disabili e plugin comuni per l'esportazione / ordinamento / riformattazione / ecc.). Ci sono molte ragioni per usare gli stili per controllare lo stile, piuttosto che inserire cose false, come regola generale. Leggi il markup semantico per maggiori informazioni.
MGOwen

@MGOwen Potresti nominare gli strumenti di accessibilità che fallirebbero in questo scenario e come fallirebbero? Ora sono scettico sui consigli sull'accessibilità che non menzionano le specifiche, ci sono molti cattivi consigli sull'accessibilità che in realtà non aiutano nessuno (ad esempio, i consigli sulla struttura del documento per HTML 5 erano tutti sbagliati , gli strumenti di accessibilità no lavorare nel modo in cui le persone dicono di lavorare).
Flimm

4

Se non hai bordi o hai bordi e vuoi la spaziatura all'interno delle celle, puoi usare padding, o line-height. Per quanto ne so, il margine non ha alcun effetto su celle e righe.
Una proprietà CSS per la spaziatura delle celle è border-spacing, ma non funziona su IE6 / 7 (quindi puoi usarla a seconda della tua folla).

Se tutto il resto fallisce, puoi usare il vecchio cellspacingattributo nel tuo markup, ma questo ti darà anche la spaziatura tra le colonne. Alcuni reset CSS suggeriscono di impostarlo comunque per ottenere il supporto cross-browser:

/ * le tabelle devono ancora essere cellspacing="0"inserite nel markup * /


2

Questo è il modo (stavo pensando che è impossibile):

Per prima cosa assegna alla tabella solo la spaziatura del bordo verticale (ad esempio 5px) e imposta la spaziatura del bordo orizzontale su 0. Quindi dovresti dare i bordi appropriati a ciascuna cella della riga. Ad esempio, la cella più a destra di ogni riga dovrebbe avere un bordo in alto, in basso e a destra. Le celle più a sinistra dovrebbero avere un bordo in alto, in basso e a sinistra. E le altre celle tra queste 2 dovrebbero avere solo un bordo in alto e in basso. Come questo esempio:

<table style="border-spacing:0 5px; color:black">
    <tr>
        <td style="border-bottom:thin black solid; border-top:thin black solid; border-left:thin black solid;">left-most cell</td>
        <td style="border-bottom:thin black solid; border-top:thin black solid;">other cell</td>
        <td style="border-bottom:thin black solid; border-top:thin black solid;">other cell</td>
        <td style="border-bottom:thin black solid; border-top:thin black solid;">other cell</td>
        <td style="border-bottom:thin black solid; border-top:thin black solid; border-right:thin black solid;">right-most cell</td>
    </tr>
    <tr>
        <td style="border-bottom:thin black solid; border-top:thin black solid; border-left:thin black solid;">left-most cell</td>
        <td style="border-bottom:thin black solid; border-top:thin black solid;">other cell</td>
        <td style="border-bottom:thin black solid; border-top:thin black solid;">other cell</td>
        <td style="border-bottom:thin black solid; border-top:thin black solid;">other cell</td>
        <td style="border-bottom:thin black solid; border-top:thin black solid; border-right:thin black solid;">right-most cell</td>
    </tr>
    <tr>
        <td style="border-bottom:thin black solid; border-top:thin black solid; border-left:thin black solid;">left-most cell</td>
        <td style="border-bottom:thin black solid; border-top:thin black solid;">other cell</td>
        <td style="border-bottom:thin black solid; border-top:thin black solid;">other cell</td>
        <td style="border-bottom:thin black solid; border-top:thin black solid;">other cell</td>
        <td style="border-bottom:thin black solid; border-top:thin black solid; border-right:thin black solid;">right-most cell</td>
    </tr>
</table>

1

A mio parere, il modo più semplice per farlo è aggiungere il riempimento al tuo tag.

td {
 padding: 10px 0
}

Spero che questo ti possa aiutare! Cheer!


Questo crea spazio extra all'interno della riga della tabella. Se le righe della tabella hanno colori che non avranno un bell'aspetto.
Kokodoko

1

Semplicemente puoi usare padding-tope padding-bottomsu un tdelemento.

L'unità può qualsiasi cosa da questo elenco:

inserisci qui la descrizione dell'immagine

Codice demo:

td
{
  padding-top: 10px;
  padding-bottom: 10px;
}
<table>
  <tr>
    <th>Firstname</th>
    <th>Lastname</th>
  </tr>
  <tr>
    <td>Peter</td>
    <td>Griffin</td>
  </tr>
  <tr>
    <td>Lois</td>
    <td>Griffin</td>
  </tr>
</table>


0

il riempimento nel TD funziona se si desidera che lo spazio abbia lo stesso colore di sfondo del td

nel mio caso, il requisito era lo spazio bianco tra la riga di intestazione e qualunque cosa fosse al di sopra

applicando questo stile a una singola cella, sono stato in grado di ottenere la separazione desiderata. Non era necessario aggiungerlo a tutte le celle ... Probabilmente non il PIÙ elegante, ma forse più elegante delle righe di separazione.

<td colspan="10"> 
    <div class="HeaderRow" 
         style="margin-top:10px;">
            <%# Eval("VendorName")%>
     </div>
</td>  

-1

Se ti attieni al design utilizzando le tabelle, l'idea migliore sarà quella di fornire una riga vuota senza contenuto e con un'altezza specificata tra ogni riga della tabella.

Puoi usare div per evitare questa complessità. Dai un margine a ogni div.


1
Ci sono ancora buoni motivi per utilizzare le tabelle (come i dati tabulari). Hai ragione, le righe vuote è sicuramente una strada stupida: P Ma c'è una soluzione, il crollo del confine.
Ryan Florence

-1

Puoi anche modificare l'altezza di ogni riga usando CSS.

<head>
 <style>
 tr {
   height:40px;
 }
</style>
</head>

<body>
<table>

<tr> <td>One</td> <td>Two</td> </tr>
<tr> <td>Three</td> <td>Four</td> </tr>
<tr> <td>Five</td> <td>Six</td> </tr>

</table>
</body>

Puoi anche modificare l'altezza <td>dell'elemento, dovrebbe darti lo stesso risultato.


-1

Creane un altro <tr>appena sotto e aggiungi un po 'di spazio o altezza al contenuto di<td>

inserisci qui la descrizione dell'immagine

Guarda il violino per esempio

https://jsfiddle.net/jd_dev777/wx63norf/9/


Questa è considerata una cattiva pratica. Uno dei motivi è che gli strumenti (come i lettori per utenti disabili) si aspettano che le righe della tabella siano righe della tabella, ed esporteranno / leggeranno / interpreteranno le tue righe "false" mischiate a quelle reali. Vedi la prima volta che questa stessa risposta è stata data nel 2014, sopra.
MGOwen il

1
@ MGOwen grazie per il tuo suggerimento. totalmente d'accordo
Jaydeep Chauhan

-4

Aggiungi la seguente regola a tr e dovrebbe funzionare

float: left

Esempio (aprilo in IE9 offcourse :)): http://jsfiddle.net/zshmN/

EDIT: questa non è una soluzione legale o corretta come sottolineato da molti, ma se non hai alcuna opzione e hai bisogno di qualcosa, questo funzionerà in IE9.

Quindi tutti coloro che stanno dando voti, per favore fateci sapere anche la soluzione corretta


3
Questo approccio impedisce il rivestimento automatico delle colonne quando le celle contengono dati con dimensioni diverse: il markup della tabella è essenzialmente inutile. Funziona abbastanza bene negli esempi forniti, ma non è una tecnica consigliabile. Modifica il testo di una cella per vedere cosa intendo.
verismo

Ehi @verismo, scusa ma non ho capito il tuo punto. Puoi spiegarlo un po 'di più? O se puoi fornire un violino in cui questo metodo fallisce poiché ho utilizzato ampiamente questo metodo e vorrei occuparmi degli scenari in cui fallisce.
Sandeep Choudhary

Non c'è una chiara delimitazione delle colonne; il che significa che i dati tabulari perdono la loro struttura visiva e diventano più difficili da leggere. jsfiddle.net/verism/zshmN/5
verismo

@verism ya questo è un problema, ma possiamo definire colonne di larghezza fissa. So che questa non è una buona soluzione, ma non ho trovato nessun'altra soluzione che funzioni su IE9
Sandeep Choudhary

1
Le righe della tabella mobile non sono legali secondo la specifica CSS. La sezione 17 dei CSS2 richiede che gli elementi display: table-row siano all'interno di display: table-row-group, -header-group o -footer-group. Tuttavia, l'algoritmo flottante secondo la sezione 9 inietta un blocco padre anonimo. Ciò significa che la riga della tabella non ha più un layout genitore legale e il browser sta indovinando cosa fare. Questo è decisamente sbagliato.
John Haugeland,
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.