Spazio tra due file in una tabella?


755

Questo è possibile tramite CSS?

sto provando

tr.classname {
  border-spacing: 5em;
}

inutilmente. Forse sto facendo qualcosa di sbagliato?


Cos'è il browser e puoi fornire uno snippet del tuo codice (html / css)?
Patrick Desjardins l'

bene sto usando ff3 come so che cioè presumibilmente supporta le regole ma per ora sto cercando di risolvere in ff3. finora ho provato spaziatura e imbottitura senza fortuna. productlistingitem è la tabella principale <table class = "productListingItem" border = "0" cellpadding = "10" cellpacing = "0"> <tr> <tr> <td class = "dragItem">
Marin

1
Forse è perché border-spacingè un attributo correlato tablee non tr. Prova table.classname {border-spacing:5em}. Note: IE8 supporta la proprietà di spaziatura dei bordi se viene specificato un! DOCTYPE.
Varun Natraaj,

Uso l'altezza della linea quando non ci sono bordi.
Leah

Risposte:


523

Devi usare l'imbottitura sui tuoi tdelementi. Qualcosa del genere dovrebbe fare il trucco. Ovviamente puoi ottenere lo stesso risultato usando un'imbottitura superiore anziché un'imbottitura inferiore.

Nel seguente codice CSS, il segno maggiore di indica che il riempimento è applicato solo agli tdelementi che sono direttori secondari agli trelementi con la classe spaceUnder. Ciò consentirà di utilizzare le tabelle nidificate. (Cella C e D nel codice di esempio.) Non sono troppo sicuro del supporto del browser per il selettore figlio diretto (pensate a IE 6), ma non dovrebbe violare il codice in nessun browser moderno.

/* Apply padding to td elements that are direct children of the tr elements with class spaceUnder. */

tr.spaceUnder>td {
  padding-bottom: 1em;
}
<table>
  <tbody>
    <tr>
      <td>A</td>
      <td>B</td>
    </tr>
    <tr class="spaceUnder">
      <td>C</td>
      <td>D</td>
    </tr>
    <tr>
      <td>E</td>
      <td>F</td>
    </tr>
  </tbody>
</table>

Questo dovrebbe rendere un po 'come questo:

+---+---+
| A | B |
+---+---+
| C | D |
|   |   |
+---+---+
| E | F |
+---+---+

1
code.google.com/p/ie7-js aggiunge il supporto al selettore figlio in ie5.5, ie6, ie7
Antony Hatchkins,

403
Solo che questo non risolve affatto il problema quando le tue righe hanno un colore di sfondo e vuoi davvero WHITESPACE tra le tue righe.
Simon East,

6
@Simon: Whitespace di solito si riferisce allo spazio vuoto, e non specificamente al colore bianco. Se vuoi colorare lo spazio tra le righe, puoi provare con la proprietà CSS <code> border-bottom </code> sugli elementi td. Probabilmente verrà visualizzato correttamente solo con un bordo 1px. Un'altra soluzione, ma non così elegante, sarebbe quella di usare una riga vuota.
Jan Aagaard,

18
@Jan: Sì, esattamente il mio punto ... È abbastanza difficile mettere uno spazio vuoto trasparente tra le file. La tua soluzione aiuta in alcuni casi, ma non risolve questo problema. L'inserimento di una riga di tabella vuota potrebbe funzionare, ma è perfettamente funzionante. Un bottom-borderset su trasparente potrebbe anche funzionare, ma non sono sicuro di quanto sia compatibile con più browser.
Simon East,


387

Nella tabella principale, prova a impostare

border-collapse:separate; 
border-spacing:5em;

Più una dichiarazione di frontiera e vedi se questo raggiunge l'effetto desiderato. Attenzione, tuttavia, che IE non supporta il modello "bordi separati".


5
Sì, questo metodo sarebbe l' ideale, tranne per il fatto che IE 7 non lo supporta. Per il supporto del browser, consultare: quirksmode.org/css/tables.html
Simon East,

7
Inoltre, controlla la spaziatura tra tutte le righe della tabella, non è possibile impostare la spaziatura delle righe per le singole righe (che è ciò che l'OP potrebbe voler ottenere).
Simon East,

1
Ciò è incoerente tra Chrome e Firefox. Se hai un theade tbody, verrà visualizzato un doppio border-spacingtra quelli, in Chrome (ma uno solo in Firefox).
Camilo Martin,

91
Questa è la risposta effettiva, specificatamente impostata border-spacing: 0 1emper ottenere la spaziatura tra solo le righe.
igneosaur,

1
@igneosaur Ho provato a fare quello che hai detto ma ha aggiunto ancora spazio tra tutte le righe e non solo le prime due. Potete fornire un jsfiddle funzionante?
user3281466,

184

Hai una tabella con album ID con qualsiasi dato ... Ho omesso i trs e i tds

<table id="albums" cellspacing="0">       
</table>

Nel CSS:

table#albums 
{
    border-collapse:separate;
    border-spacing:0 5px;
}

15
questo ha funzionato bene per me. il primo argomento della spaziatura tra bordi è la spaziatura orizzontale tra le celle e la seconda è la spaziatura verticale.

Non sempre deve da fantasia CSS se il buon vecchio HTML può fare il lavoro :)
luator


è possibile applicare solo per il "tbody" all'interno?
Jaison,

129

dato che ho un'immagine di sfondo dietro il tavolo, falsificarla con imbottitura bianca non funzionerebbe. Ho scelto di inserire una riga vuota tra ogni riga di contenuto:

<tr class="spacer"><td></td></tr>

quindi usa CSS per dare alle righe del distanziatore una certa altezza e uno sfondo trasparente.


3
Questo è probabilmente più flessibile, penso. Non puoi sempre controllare quando in anticipo avrai bisogno di spazio (pagine generate dinamicamente).
Stefan Kendall,

10
Questo mi ricorda gli anni '90, quando il supporto CSS era quasi inesistente e le tabelle venivano utilizzate per la maggior parte del layout. Lo sto ancora dando +1, tuttavia, perché le altre "risposte" non sono affatto migliori in termini di spazio effettivo tra le righe della tabella.
labirinto,

@labyrinth Non è cambiato molto dagli anni '90. Per quanto riguarda l'HTML, tutto è diventato molto più potente e molto più disordinato.
maaartinus,

73

Dalla rete di sviluppatori Mozilla :

La proprietà CSS di spaziatura dei bordi specifica la distanza tra i bordi delle celle adiacenti (solo per il modello di bordi separati). Ciò equivale all'attributo cellpacing nell'HTML di presentazione, ma è possibile utilizzare un secondo valore opzionale per impostare una spaziatura orizzontale e verticale diversa.

Quest'ultima parte è spesso supervisionata. Esempio:

.your-table {
    border-collapse: separate; /* allow spacing between cell borders */
    border-spacing: 0 5px; /* NOTE: syntax is <horizontal value> <vertical value> */

AGGIORNARE

Ora capisco che l'OP vuole che le righe specifiche e separate abbiano una spaziatura maggiore. Ho aggiunto un setup con tbodyelementi che lo compiono senza rovinare la semantica. Tuttavia, non sono sicuro che sia supportato su tutti i browser. L'ho fatto in Chrome.

L'esempio che segue è per mostrare come puoi far sembrare che la tabella esista di file separate, dolcezza css in piena regola. Inoltre ha dato alla prima riga più spazio con l' tbodyinstallazione. Sentiti libero di usare!

Avviso di supporto: IE8 +, Chrome, Firefox, Safari, Opera 4+

.spacing-table {
  font-family: 'Helvetica', 'Arial', sans-serif;
  font-size: 15px;
  border-collapse: separate;
  table-layout: fixed;
  width: 80%;
  border-spacing: 0 5px; /* this is the ultimate fix */
}
.spacing-table th {
  text-align: left;
  padding: 5px 15px;
}
.spacing-table td {
  border-width: 3px 0;
  width: 50%;
  border-color: darkred;
  border-style: solid;
  background-color: red;
  color: white;
  padding: 5px 15px;
}
.spacing-table td:first-child {
  border-left-width: 3px;
  border-radius: 5px 0 0 5px;
}
.spacing-table td:last-child {
  border-right-width: 3px;
  border-radius: 0 5px 5px 0;
}
.spacing-table thead {
  display: table;
  table-layout: fixed;
  width: 100%;
}
.spacing-table tbody {
  display: table;
  table-layout: fixed;
  width: 100%;
  border-spacing: 0 10px;
}
<table class="spacing-table">
  <thead>
    <tr>
        <th>Lead singer</th>
        <th>Band</th>
    </tr>
  </thead>
  <tbody>
    <tr>
        <td>Bono</td>
        <td>U2</td>
    </tr>
  </tbody>
  <tbody>
    <tr>
        <td>Chris Martin</td>
        <td>Coldplay</td>
    </tr>
    <tr>
        <td>Mick Jagger</td>
        <td>Rolling Stones</td>
    </tr>
    <tr>
        <td>John Lennon</td>
        <td>The Beatles</td>
    </tr>
  </tbody>
</table>


Se volessi un po 'di spazio verticale tra due righe particolari, avrei appena aggiunto una riga spaziatore <tr> <td colspan = "2" style = "padding-bottom: 1em;"> </td> </tr>
Paul Taylor,

Funzionerebbe ma è semanticamente errato (come in, la riga del tuo separatore non è una riga effettiva con dati come le altre righe. Ciò può essere fastidioso per le persone che usano lettori di schermo o altri dispositivi di aiuto, nonché per scopi di indicizzazione e potrebbe non fare una differenza enorme, ma è bene tenerlo indietro nella testa quando si sviluppa un sito Web :)
Justus Romijn

Questo è vero, se in realtà sta usando una tabella per rappresentare una tabella. Se sta semplicemente usando una tabella come un modo per visualizzare i dati in modo tabulare, direi che ha più senso inserire una riga per rappresentare uno spazio tra due elementi piuttosto che semplicemente aggiungere spazio ai due elementi sopra o sotto la linea perché ciò che l'utente vuole fare è aggiungere spazio tra due linee, non aumentare la dimensione degli elementi all'interno di una linea.
Paul Taylor,

53

Puoi provare ad aggiungere una riga di separazione:

html:

<tr class="separator" />

css:

table tr.separator { height: 10px; }

7
Per IE, tr senza un corpo non sarebbe riconosciuto. aggiungi anche il tag dd fittizio.
Nap

Il problema è che in HTML5, il validatore W3C emetterà un errore che dice "Una riga della tabella era larga 0 colonne, che è inferiore al conteggio delle colonne stabilito dalla prima riga".
David Grayson,

Bene, avevo aggiunto un altro <tr>, <td> e <p> e impostato la visibilità del p-tag su nascosto. Funziona anche. :-)
Jeppe,

47

Non è possibile modificare il margine di una cella di tabella. Ma PUOI cambiare l'imbottitura. Cambia il padding del TD, che renderà la cella più grande e spingerà il testo lontano dal lato con il padding aumentato. Se hai delle linee di confine, tuttavia, non sarà esattamente quello che vuoi.


Sì, imbottitura spingerà il basso confine, in modo border-bottome padding-bottommezzi che il bordo sarà sotto l'imbottitura.
Dan Dascalescu,

21

Dai un'occhiata al border-collapse: attributo separato (impostazione predefinita) e proprietà border-spacing .

In primo luogo, è necessario separare loro con border-collasso , allora è possibile definire la spazio tra le colonne e righe con border-spacing .

Entrambe queste proprietà CSS sono in realtà ben supportate su tutti i browser, vedi qui .

table     {border-collapse: separate;  border-spacing: 10px 20px;}

table, 
table td,
table th  {border: 1px solid black;}
<table>
  <tr>
    <td>Some text - 1</td>
    <td>Some text - 1</td>
  </tr>
  <tr>
    <td>Some text - 2</td>
    <td>Some text - 2</td>
  </tr>
  <tr>
    <td>Some text - 3</td>
    <td>Some text - 3</td>
  </tr>
</table>


20

Ok, puoi farlo

tr.classname td {background-color:red; border-bottom: 5em solid white}

Assicurati che il colore di sfondo sia impostato su td piuttosto che sulla riga. Questo dovrebbe funzionare sulla maggior parte dei browser ... (Chrome, ie & ff testato)


Questo crea strani problemi di allineamento verticale, almeno in Firefox
cjohansson,

20

Devi metterti border-collapse: separate;sul tavolo; la maggior parte dei fogli di stile predefiniti del browser inizia da border-collapse: collapse;, che annulla la spaziatura dei bordi.

Inoltre, spaziatura dei bordi: va avanti TD, non su TR.

Provare:

<html><head><style type="text/css">
    #ex    { border-collapse: separate; }
    #ex td { border-spacing: 1em; }
</style></head><body>
    <table id="ex"><tr><td>A</td><td>B</td></tr><tr><td>C</td><td>D</td></tr></table>
</body>

1
la spaziatura dei bordi è anche per la tabella non td
silversky

4
Grazie. Ti ho ringraziato nella correzione dei commenti in precedenza, ma un editor troppo zelante che voleva cambiare il mio stile e ha rotto il codice nel processo ha rimosso anche i miei ringraziamenti grazie. Lo sto mettendo qui dove non può essere modificato.
John Haugeland,

18

Puoi usare l' altezza della linea nella tabella:

<table style="width: 400px; line-height:50px;">

Hai ragione ma il testo otterrà anche l'altezza della linea che non è buona, penso che dovresti vedere il coleman! Ha la bella soluzione
Waqas Tahir,


11

Una risposta troppo tardi :)

Se si applica il float agli trelementi, è possibile spaziare tra due righe con marginattributo.

table tr{
float: left
width: 100%;
}

tr.classname {
margin-bottom:5px;
}

12
È spaventoso. Ciò che sta effettivamente facendo è impostare la displayproprietà su blockper la riga. Ciò consente alla riga di avere un margine. Margine verticale " Si applica a: tutti gli elementi tranne quelli con tipi di visualizzazione di tabella diversi da tabella-didascalia, tabella e tabella incorporata ". Dal momento che table-rownon è una di queste eccezioni, non lo conta. Probabilmente potresti ottenere lo stesso effetto facendo tr {display:block;}Ma sarei diffidente nell'usare uno di questi metodi in una tabella complicata. Probabilmente non si tradurrà in quello che ti aspetti.
sholsinger,

È spaventoso, ma ha funzionato. Non in ie7, ma la spaziatura cellulare direttamente nella tabella funziona in ie7.
Liko,

le righe fluttuanti non sono una buona soluzione .. specialmente se la tua pagina è più grande del doppio della larghezza della riga. aggiungi l'attributo width ad entrambi i tag
AndreaCi

11

Per creare un'illusione di spaziatura tra le righe, applica il colore di sfondo alla riga e quindi crea un bordo spesso con il colore bianco in modo da creare uno "spazio" :)

tr 
{
   background-color: #FFD700;
   border: 10px solid white;
}

9

Il modo corretto di assegnare la spaziatura per le tabelle consiste nell'utilizzare il pad cellpding e il cellpacing ad es

<table cellpadding="4">

5
Puoi farlo tramite CSS, che direi che è più "corretto" (oltre al fatto che è più elegante, spostare lo stile dal markup al CSS consente di risparmiare larghezza di banda).
Camilo Martin,

2
Non risparmia larghezza di banda. In realtà ne uso di più. Supponendo che non si stia aggiungendo un foglio di stile solo per questo, è necessario aggiungere un selettore e possibilmente un ID o un nome a questa tabella. Sono più byte non meno.
majinnaibu,

9

Mi sono imbattuto in questo mentre lottavo con un problema simile. Ho trovato la risposta di Varun Natraaj molto utile, ma avrei usato un bordo trasparente.

td { border: 1em solid transparent; }

I bordi trasparenti hanno ancora larghezza.


6

Funziona con la maggior parte dei browser più recenti nel 2015. Soluzione semplice. Non funziona in modo trasparente, ma a differenza della risposta di Thoronwen, non riesco ad ottenere il rendering trasparente con qualsiasi dimensione.

    tr {
      border-bottom:5em solid white;
    }

3

In poche parole divall'interno tde impostare le seguenti stili di div:

margin-bottom: 20px;
height: 40px;
float: left;
width: 100%;

2

Mi rendo conto che questa è una risposta a un vecchio thread e potrebbe non essere la soluzione richiesta, ma mentre tutte le soluzioni suggerite non hanno fatto ciò di cui avevo bisogno, questa soluzione ha funzionato per me.

Avevo 2 celle di tabella, una con il colore di sfondo, l'altra con un colore del bordo. Le soluzioni sopra rimuovono il bordo, quindi la cella a destra sembra fluttuare a mezz'aria. La soluzione che ha fatto il trucco è stata quella di sostituire table, tre tdcon div e classi corrispondenti: tabella sarebbe div id="table_replacer", tr sarebbe div class="tr_replacer"e td sarebbe div class="td_replacer"(cambiare ovviamente anche i tag di chiusura in div)

Per ottenere la soluzione al mio problema, il CSS è:

#table_replacer{display:table;}
.tr_replacer {border: 1px solid #123456;margin-bottom: 5px;}/*DO NOT USE display:table-row! It will destroy the border and the margin*/
.td_replacer{display:table-cell;}

Spero che questo aiuti qualcuno.


Imho, questa soluzione equivale a usare la tabella normale, tr, td pattern e style tr {display: block;} che ho provato. Problema: la tabella ha un aspetto diverso, in quanto gli elementi td non sono renderizzati alla larghezza della tabella, ma fluttuano a sinistra all'interno del tr. Significa che gli elementi td di tutte le righe non sono più allineati verticalmente.
Andreas Stankewitz,

0

Puoi riempire gli elementi <td /> con elementi <div /> e applicare qualsiasi margine ai div che ti piacciono. Per uno spazio visivo tra le righe, è possibile utilizzare un'immagine di sfondo ripetuta sull'elemento <tr />. (Questa era la soluzione che ho appena usato oggi e sembra funzionare sia su IE6 che su FireFox 3, anche se non l'ho più testato.)

Inoltre, se sei contrario a modificare il codice del tuo server per inserire <div /> s all'interno di <td /> s, puoi usare jQuery (o qualcosa di simile) per avvolgere dinamicamente i contenuti <td /> in un <div / >, che consente di applicare il CSS come desiderato.


0

Oppure aggiungi semplicemente uno spazio vuoto con l'altezza del margine tra le righe in cui desideri aggiungere la spaziatura


0

Ecco una soluzione semplice ed elegante, con alcuni avvertimenti:

  • Non puoi effettivamente rendere trasparenti gli spazi vuoti, devi dare loro un colore specifico.
  • Non è possibile arrotondare gli angoli dei bordi sopra e sotto gli spazi
  • Devi conoscere l'imbottitura e i bordi delle celle della tabella

Con questo in mente, prova questo:

td {padding:5px 8px;border:2px solid blue;background:#E0E0E0}  /* lets say the cells all have this padding and border, and the gaps should be white */

tr.gapbefore td {overflow:visible}
tr.gapbefore td::before,
tr.gapbefore th::before
{
  content:"";
  display:block;
  position:relative;
  z-index:1;
  width:auto;
  height:0;
  padding:0;
  margin:-5px -10px 5px;  /* 5px = cell top padding, 10px = (cell side padding)+(cell side border width)+(table side border width) */
  border-top:16px solid white;  /* the size & color of the gap you want */
  border-bottom:2px solid blue; /* this replaces the cell's top border, so should be the same as that. DOUBLE IT if using border-collapse:separate */
}

Quello che stai effettivamente facendo è incollare un ::beforeblocco rettangolare nella parte superiore di tutte le celle nella riga che vuoi che sia preceduta da uno spazio. Questi blocchi sporgono leggermente dalle celle per sovrapporsi ai bordi esistenti, nascondendoli. Questi blocchi sono solo un bordo superiore e inferiore inserito insieme: il bordo superiore costituisce lo spazio vuoto e il bordo inferiore ricrea l'aspetto del bordo superiore originale delle celle.

Nota che se hai un bordo attorno alla tabella stessa e alle celle, dovrai aumentare ulteriormente il margine orizzontale di dei tuoi "blocchi". Quindi, per un bordo di tabella 4px, dovresti invece usare:

margin:-5px -12px 5px;     /* 14px = original 10px + 2px for 'uncollapsed' part of table border */

E se la tua tabella usa border-collapse:separateinvece di border-collapse:collapse, allora dovrai (a) usare l'intera larghezza del bordo della tabella:

margin:-5px -14px 5px;     /* 14px = original 10px + 4px full width of table border */

... e anche (b) sostituire la doppia larghezza del bordo che ora deve apparire sotto il divario:

border-bottom:4px solid blue;     /* i.e. 4px = cell top border + previous row's bottom border */

La tecnica può essere facilmente adattata a una versione .gapafter, se preferisci, o alla creazione di spazi verticali (colonna) anziché spazi vuoti di riga.

Ecco un codice in cui puoi vederlo in azione: https://codepen.io/anon/pen/agqPpW


-1

Qui funziona senza problemi:

#myOwnTable td { padding: 6px 0 6px 0;}

Suppongo che tu possa elaborare un layout più finemente dettagliato specificando quale dovrebbe essere.


-5

facendo questo mostrato sopra ...

table tr{ float: left width: 100%; }  tr.classname { margin-bottom:5px; } 

rimuove l'allineamento verticale delle colonne, quindi fai attenzione a come lo usi


-17

Hai provato:

tr.classname { margin-bottom:5em; }

In alternativa, è possibile regolare anche ogni td:

td.classname { margin-bottom:5em; }

o

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

Funziona davvero? Ho div.el { display: table-row; margin: 10px; }, e il margine non fa nulla. So che è un po 'diverso da un tavolo reale, ma non dovrebbe essere ...
Bradrad7,

20
Le righe / celle della tabella non hanno margini.
Espen,
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.