Espaço entre duas linhas em uma tabela?

755

Isso é possível via CSS?

estou tentando

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

para nenhum proveito. Talvez eu esteja fazendo algo errado?

Marin
fonte
O que é o navegador e você pode fornecer um trecho do seu código (html / css)?
Patrick Desjardins
bem, eu estou usando ff3, como eu sei que, ou seja, supostamente suporta regras, mas por enquanto eu estou olhando para corrigir em ff3. Eu tentei espaçamento e preenchimento até agora sem sorte. productlistingitem é a tabela principal <table class = fronteira "productListingItem" = "0" cellpadding = "10" cellspacing = "0"> <tr> <tr> <td class = "dragItem">
Marin
1
Talvez seja porque border-spacingé um atributo relacionado tablee não tr. Tente table.classname {border-spacing:5em}. Note: IE8 suporta a propriedade espaçamento entre bordas se um! DOCTYPE for especificado.
Varun Natraaj 14/02
Uso altura da linha quando não há bordas.
Leah
Isso responde sua pergunta? CSS: como faço para criar uma lacuna entre linhas em uma tabela?
alexalejandroem 24/01

Respostas:

523

Você precisa usar preenchimento em seus tdelementos. Algo assim deve fazer o truque. Obviamente, você pode obter o mesmo resultado usando um preenchimento superior em vez de um preenchimento inferior.

No código CSS abaixo, o sinal de maior que significa que o preenchimento é aplicado apenas a tdelementos que são filhos diretos para trelementos da classe spaceUnder. Isso tornará possível usar tabelas aninhadas. (Células C e D no código de exemplo.) Não tenho muita certeza sobre o suporte ao navegador para o seletor filho direto (pense no IE 6), mas não deve quebrar o código em nenhum navegador 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>

Isso deve render algo como isto:

+---+---+
| A | B |
+---+---+
| C | D |
|   |   |
+---+---+
| E | F |
+---+---+
Jan Aagaard
fonte
1
code.google.com/p/ie7-js adiciona suporte ao seletor filho em ie5.5, ie6, ie7 também
Antony Hatchkins
403
Exceto que isso não resolve o problema quando suas linhas têm uma cor de fundo e você realmente deseja WHITESPACE entre suas linhas.
Simon East
6
@ Simon: Espaço em branco geralmente se refere ao espaço vazio, e não especificamente à cor branca. Se você deseja colorir o espaço entre as linhas, pode tentar com a propriedade CSS <code> border-bottom </code> nos elementos td. Isso provavelmente só será renderizado corretamente com uma borda de 1px. Outra solução, mas não tão elegante, seria usar uma linha vazia.
Jan Aagaard
18
@ Jan: Sim, exatamente o que quero dizer ... É muito difícil colocar um espaço vazio transparente entre as linhas. Sua solução ajuda em alguns casos, mas não resolve esse problema. Inserir uma linha vazia da tabela pode funcionar, mas é fácil. Um bottom-borderconjunto para transparente também pode funcionar, mas não tenho certeza de como é compatível com vários navegadores.
Simon East
1
@ Simon: Coleman tem uma solução feia e funcional para o seu problema .
quer
387

Na tabela pai, tente definir

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

Além de uma declaração de fronteira, e veja se isso alcança o efeito desejado. Cuidado, porém, que o IE não suporta o modelo de "bordas separadas".

user37731
fonte
5
Sim, esse método seria ideal, exceto que o IE 7 não suporta. Para suporte ao navegador, consulte: quirksmode.org/css/tables.html
Simon East
7
Além disso, ele controla o espaçamento entre todas as linhas da tabela; você não pode definir o espaçamento entre linhas para linhas individuais (que é o que o OP pode estar desejando obter).
Simon East
1
Isso é inconsistente entre o Chrome e o Firefox. Se você tiver um theade tbody, ele renderizará um duplo border-spacingentre eles, no Chrome (mas um único no Firefox).
Camilo Martin
91
Essa é a resposta real, definida especificamente border-spacing: 0 1empara obter o espaçamento entre apenas as linhas.
igneosaur
1
@igneosaur Eu tentei fazer o que você disse, mas ainda adicionou espaçamento entre todas as linhas e não apenas as duas primeiras. Você pode fornecer um jsfiddle funcionando?
user3281466
184

Você tem tabela com álbuns de identificação com quaisquer dados ... Eu omiti os trs e tds

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

No css:

table#albums 
{
    border-collapse:separate;
    border-spacing:0 5px;
}
Pradyut Bhattacharya
fonte
15
Isto funcionou bem para mim. o primeiro argumento do espaçamento entre bordas é o espaçamento horizontal entre as células e o segundo é o espaçamento vertical.
Nem sempre tem que por fantasia CSS se boa HTML idade pode fazer o trabalho :)
luator
1
O cellspacingatributo de <table> não
Константин Ван
é possível aplicar apenas para o tr dentro "tbody"?
Jaison
129

Como tenho uma imagem de fundo atrás da mesa, fingir com estofamento branco não funcionaria. Optei por colocar uma linha vazia entre cada linha de conteúdo:

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

use css para dar às linhas espaçadoras uma certa altura e fundo transparente.

Coleman
fonte
3
Provavelmente é mais flexível, eu acho. Você nem sempre pode controlar quando antecipadamente precisará de espaço (páginas geradas dinamicamente).
Stefan Kendall
10
Isso me lembra os anos 90, quando o suporte ao CSS era quase inexistente e as tabelas eram usadas para a maioria dos layouts. Ainda estou dando +1, no entanto, porque as outras "respostas" não são melhores em termos de espaço na verdade entre as linhas da tabela.
labirinto
@ labyrinth Não mudou muita coisa desde os anos 90. Em relação ao HTML, tudo se tornou muito mais poderoso e muito mais confuso.
Maaartinus
73

Na Rede de Desenvolvedores Mozilla :

A propriedade CSS de espaçamento entre bordas especifica a distância entre as bordas das células adjacentes (apenas para o modelo de bordas separadas). Isso é equivalente ao atributo cellpacing no HTML de apresentação, mas um segundo valor opcional pode ser usado para definir o espaçamento horizontal e vertical diferente.

Essa última parte é frequentemente supervisionada. Exemplo:

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

ATUALIZAR

Agora entendo que o OP deseja que linhas específicas e separadas tenham espaçamento aumentado. Adicionei uma configuração com tbodyelementos que fazem isso sem arruinar a semântica. No entanto, não tenho certeza se ele é compatível com todos os navegadores. Eu fiz isso no Chrome.

O exemplo abaixo é para mostrar como você pode fazer parecer que a tabela existe de linhas separadas, doçura total do CSS. Também deu à primeira linha mais espaçamento com a tbodyconfiguração. Sinta-se livre para usar!

Aviso de suporte: 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>

Justus Romijn
fonte
Se eu quisesse um espaço vertical entre duas linhas em particular, adicionei uma linha espaçadora <tr> <td colspan = "2" style = "padding-bottom: 1em;"> </td> </tr>
Paul Taylor
Isso funcionaria, mas é semanticamente incorreto (como em sua linha de separador não é uma linha real com dados como as outras linhas. Isso pode ser irritante para pessoas que usam leitores de tela ou outros dispositivos assistentes, bem como para fins de indexação e . gosta pode não fazer uma diferença enorme, mas é bom para mantê-lo de volta em sua cabeça quando desenvolvimento de um website :)
Justus Romijn
Isso é verdade, se ele estiver realmente usando uma tabela para representar uma tabela. Se ele está apenas usando uma tabela como uma maneira de exibir dados de maneira tabular, eu diria que faz mais sentido inserir uma linha para representar uma lacuna entre dois itens, em vez de apenas adicionar espaçamento aos elementos td acima ou abaixo da linha, porque o que o usuário deseja fazer é adicionar espaço entre duas linhas, não aumentar o tamanho dos elementos dentro de uma linha.
Paul Taylor
53

Você pode tentar adicionar a linha separadora:

html:

<tr class="separator" />

css:

table tr.separator { height: 10px; }
Denis
fonte
7
Para o IE, tr sem um corpo não seria reconhecido. adicione tag td fictício também.
Nap
O problema é que, no HTML5, o validador W3C emitirá um erro dizendo "Uma linha da tabela possui 0 colunas de largura, que é menor que a contagem de colunas estabelecida pela primeira linha".
David Grayson
Bom, eu adicionei outro <tr>, <td> e <p> e defini a visibilidade da tag p como oculta. Funciona também. :-)
Jeppe
47

Você não pode alterar a margem de uma célula da tabela. Mas você pode alterar o preenchimento. Altere o preenchimento do TD, que aumentará a célula e empurre o texto para o lado com o aumento do preenchimento. Se você tiver linhas de borda, no entanto, ainda não será exatamente o que deseja.

Robert C. Barth
fonte
Sim, estofamento vai empurrar para baixo a borda, de modo border-bottome padding-bottommeios que a borda irá estar abaixo do enchimento.
Dan Dascalescu 17/01
21

Dê uma olhada no atributo border-collapse: separado (padrão) e na propriedade espaçamento da borda .

Primeiro, você deve separá- los com o recolhimento de borda e , em seguida, definir o espaço entre colunas e linhas com espaçamento de borda .

Ambas as propriedades CSS são realmente bem suportadas em todos os navegadores, veja aqui .

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>

Syno
fonte
20

Ok, você pode fazer

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

Verifique se a cor do plano de fundo está definida no td em vez da linha. Isso deve funcionar na maioria dos navegadores ... (Chrome, ou seja, teste testado)

Paulo
fonte
Isso cria problemas vertical-alinhamento estranhas, pelo menos no Firefox
cjohansson
20

Você precisa colocar border-collapse: separate;na mesa; a maioria das folhas de estilo padrão do navegador começa em border-collapse: collapse;, o que diminui o espaçamento das bordas.

Além disso, o espaçamento entre bordas: continua no TD, não no TR.

Tentar:

<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>
John Haugeland
fonte
1
fronteira-espaçamento é também para a tabela não td
Silversky
4
Obrigado. Agradeci a você na correção de comentários anteriormente, mas um editor muito zeloso que queria mudar meu estilo e quebrou o código no processo também removeu meus agradecimentos. Agora estou colocando aqui onde não pode ser editado.
precisa
18

Você pode usar a altura da linha na tabela:

<table style="width: 400px; line-height:50px;">
alansiqueira27
fonte
Você está correto, mas o texto também terá a altura da linha que não é boa, acho que você deve ver o coleman! Ele tem a solução agradável
Waqas Tahir
13
tr { 
    display: block;
    margin-bottom: 5px;
}
Moe
fonte
prefiro exibir: bloco em linha;
DS_web_developer
11

Uma resposta tarde demais :)

Se você aplicar float a trelementos, poderá espaçar entre duas linhas com marginatributo.

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

tr.classname {
margin-bottom:5px;
}
Oguzhan Ozel
fonte
12
Isso é assustador. O que isso realmente está fazendo é definir a displaypropriedade blockpara a linha. Isso permite que a linha tenha uma margem. Margem vertical " Aplica-se a: todos os elementos, exceto aqueles com tipos de exibição de tabela diferentes de legenda, tabela e tabela embutida ". Como table-rownão há nenhuma dessas exceções, não conta. Provavelmente, você poderia obter o mesmo efeito. tr {display:block;}Mas eu seria cauteloso ao usar qualquer um desses métodos em uma tabela complicada. Provavelmente não resultará no que você espera.
sholsinger
Isso é assustador, mas funcionou. Não no ie7, mas o espaçamento entre células diretamente na tabela funciona no ie7.
Liko 11/01
linhas flutuantes não é uma boa solução. especialmente se sua página for maior que o dobro da largura da linha. adicionar o atributo largura para ambas as marcas
AndreaCi
11

Para criar uma ilusão de espaçamento entre linhas, aplique a cor de fundo na linha e, em seguida, crie uma borda grossa com a cor branca para criar um "espaço" :)

tr 
{
   background-color: #FFD700;
   border: 10px solid white;
}
Varun Natraaj
fonte
9

A maneira correta de fornecer espaçamento para as tabelas é usar o preenchimento e espaçamento entre células, por exemplo

<table cellpadding="4">
Usman Zaheer
fonte
5
Você pode fazer isso via CSS, o que eu diria que é mais "correto" (além do fato de ser mais elegante, mover o estilo da marcação para o CSS economiza largura de banda).
Camilo Martin
2
Não economiza largura de banda. Na verdade, eu uso mais. Supondo que você não esteja adicionando uma folha de estilo apenas para isso, adicione um seletor e possivelmente um ID ou nome a esta tabela. Isso é mais bytes, não menos.
Majinnaibu 29/05
9

Eu me deparei com isso enquanto lutava com um problema semelhante. Eu achei a resposta de Varun Natraaj bastante útil, mas eu usaria uma borda transparente.

td { border: 1em solid transparent; }

Bordas transparentes ainda têm largura.

Thoronwen
fonte
6

Funciona para a maioria dos navegadores mais recentes em 2015. Solução simples. Não funciona para transparência, mas, diferentemente da resposta de Thoronwen, não posso ser transparente para renderizar com qualquer tamanho.

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

Basta colocar divdentro tde definir os seguintes estilos de div:

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

Sei que essa é uma resposta para um thread antigo e pode não ser a solução solicitada, mas, embora todas as soluções sugeridas não tenham feito o que eu precisava, essa solução funcionou para mim.

Eu tinha 2 células de tabela, uma com cor de fundo e outra com cor de borda. As soluções acima removem a borda, de modo que a célula à direita parece estar flutuando no ar. A solução que fez o truque era para substituir o table, tre tdcom divs e classes correspondentes: Tabela seria div id="table_replacer", tr seria div class="tr_replacer"e td seria div class="td_replacer"(mudança fechando tags para divs bem, obviamente)

Para obter a solução para o meu problema, o 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;}

Espero que isso ajude alguém.

Volvo
fonte
Imho, esta solução é equivalente a usar a tabela regular, tr, td padrão e estilo tr {display: block;} que eu tentei. Problema: a tabela parece diferente, pois os elementos td não são renderizados na largura da tabela, mas flutuam para a esquerda dentro do tr. Significa que os elementos td de todas as linhas não estão mais alinhados verticalmente.
Andreas Stankewitz 23/03/19
0

Você pode preencher os elementos <td /> com elementos <div /> e aplicar qualquer margem às divs que desejar. Para um espaço visual entre as linhas, você pode usar uma imagem de plano de fundo repetida no elemento <tr />. (Essa foi a solução que acabei de usar hoje e parece funcionar no IE6 e no FireFox 3, embora não tenha testado mais.)

Além disso, se você é avesso a modificar o código do servidor para colocar <div /> s dentro dos <td /> s, pode usar o jQuery (ou algo semelhante) para agrupar dinamicamente o conteúdo <td /> em um <div / >, permitindo aplicar o CSS conforme desejado.

John Fisher
fonte
0

Ou simplesmente adicione um espaço em branco com a altura da margem entre as linhas que você deseja adicionar o espaçamento

John Magnolia
fonte
0

Aqui está uma solução simples e elegante, com algumas ressalvas:

  • Na verdade, você não pode tornar as lacunas transparentes; precisa dar uma cor específica.
  • Você não pode arredondar os cantos das bordas acima e abaixo das lacunas
  • Você precisa conhecer o preenchimento e as bordas das células da tabela

Com isso em mente, tente o seguinte:

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 */
}

Na verdade, o que você está fazendo é colocar um ::beforebloco retangular na parte superior de todas as células da linha que você deseja preceder por uma lacuna. Esses blocos se destacam um pouco das células para sobrepor as bordas existentes, ocultando-as. Esses blocos são apenas uma borda superior e inferior agrupadas: a borda superior forma a lacuna e a borda inferior recria a aparência da borda superior original das células.

Observe que, se você tiver uma borda ao redor da própria tabela e das células, precisará aumentar ainda mais a margem horizontal dos seus 'blocos'. Portanto, para uma borda de tabela de 4 px, você deve usar:

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

E se sua tabela usar em border-collapse:separatevez de border-collapse:collapse, será necessário (a) usar a largura completa da borda da tabela:

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

... e também (b) substitua a largura dupla da borda que agora precisa aparecer abaixo da lacuna:

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

A técnica é facilmente adaptada a uma versão .gapafter, se você preferir, ou à criação de intervalos verticais (coluna) em vez de intervalos de linhas.

Aqui está um código de código em que você pode vê-lo em ação: https://codepen.io/anon/pen/agqPpW

Doin
fonte
-1

Aqui isso funciona sem problemas:

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

Suponho que você possa elaborar um layout mais refinado especificando qual td, se necessário.

Brice Coustillas
fonte
-5

fazendo isso mostrado acima ...

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

remove o alinhamento vertical da coluna, portanto, tenha cuidado ao usá-lo

richardh
fonte
-17

Você tentou:

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

Como alternativa, cada td também pode ser ajustado:

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

ou

 td.classname { padding-bottom:5em; }
agosto
fonte
Isso realmente funciona? Eu tenho div.el { display: table-row; margin: 10px; }, e margem não faz nada. Eu sei que é um pouco diferente do que uma tabela real, mas não deve ser ...
bradlis7
20
As linhas / células da tabela não têm margens.
Espen