¿Espacio entre dos filas en una mesa?

755

¿Es esto posible a través de CSS?

Lo estoy intentando

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

en vano. Tal vez estoy haciendo algo mal?

Marin
fuente
¿Qué es el navegador y puede proporcionar un fragmento de su código (html / css)?
Patrick Desjardins
bueno, estoy usando ff3 porque sé que supuestamente es compatible con las reglas, pero por ahora estoy buscando arreglarlo en ff3. Traté de espaciado y relleno hasta ahora sin suerte. productlistingitem es la tabla principal <table class = "productListingItem" border = "0" cellpadding = "10" cellpacing = "0"> <tr> <tr> <td class = "dragItem">
Marin
1
Tal vez es porque border-spacinges un atributo relacionado con tabley no tr. Tratar table.classname {border-spacing:5em}. Note: IE8 admite la propiedad de espacio entre bordes si se especifica un! DOCTYPE.
Varun Natraaj
Uso altura de línea cuando no hay bordes.
Leah
¿Responde esto a tu pregunta? CSS: ¿cómo creo un espacio entre filas en una tabla?
alexalejandroem

Respuestas:

523

Necesitas usar relleno en tus tdelementos. Algo como esto debería hacer el truco. Por supuesto, puede obtener el mismo resultado utilizando un relleno superior en lugar de un relleno inferior.

En el código CSS a continuación, el signo mayor que significa que el relleno solo se aplica a tdelementos que son hijos directos a trelementos con la clase spaceUnder. Esto permitirá usar tablas anidadas. (Celda C y D en el código de ejemplo). No estoy muy seguro acerca de la compatibilidad del navegador para el selector secundario directo (piense en IE 6), pero no debería romper el código en ningún 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>

Esto debería ser algo así:

+---+---+
| A | B |
+---+---+
| C | D |
|   |   |
+---+---+
| E | F |
+---+---+
Jan Aagaard
fuente
1
code.google.com/p/ie7-js agrega soporte al selector secundario en ie5.5, ie6, ie7 también
Antony Hatchkins
403
Excepto que esto no resuelve el problema en absoluto cuando sus filas tienen un color de fondo y realmente desea ESPACIO EN BLANCO entre sus filas.
Simon East
66
@Simon: El espacio en blanco generalmente se refiere al espacio vacío, y no específicamente al color blanco. Si desea colorear el espacio entre las filas, puede probar con la propiedad CSS <code> border-bottom </code> en los elementos td. Eso probablemente solo se representará correctamente con un borde de 1px. Otra solución, pero no tan elegante, sería utilizar una fila vacía.
Jan Aagaard
18
@ Jan: Sí, exactamente mi punto ... Es bastante difícil poner un espacio vacío transparente entre las filas. Su solución ayuda en algunos casos, pero no resuelve ese problema. Insertar una fila de tabla vacía podría funcionar, pero es feo. Un bottom-borderconjunto de transparentes también podría funcionar, pero no estoy seguro de cuán compatible sea con varios navegadores.
Simon East
1
@ Simon: Coleman tiene una solución fea pero funcional para su problema .
eggy
388

En la tabla principal, intente configurar

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

Además de una declaración de borde, y vea si esto logra el efecto deseado. Sin embargo, tenga en cuenta que IE no admite el modelo de "bordes separados".

usuario37731
fuente
55
Sí, este método sería ideal, excepto que IE 7 no lo admite. Para soporte del navegador, vea: quirksmode.org/css/tables.html
Simon East
77
Además, controla el espaciado en todas las filas de la tabla, no puede establecer el espaciado de fila para filas individuales (que es lo que el OP podría querer lograr).
Simon East
1
Esto es inconsistente entre Chrome y Firefox. Si tiene un theady tbody, generará un doble border-spacingentre ellos, en Chrome (pero solo uno en Firefox).
Camilo Martin
9191
Esta es la respuesta real, específicamente configurada border-spacing: 0 1empara obtener su espacio entre solo filas.
igneosaur
1
@igneosaurio Intenté hacer lo que dijiste, pero aun así agregó espacio entre todas las filas y no solo las dos primeras. ¿Puedes proporcionar un jsfiddle que funcione?
usuario3281466
184

Tienes una tabla con álbumes de identificación con cualquier dato ... He omitido los trs y tds

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

En el css:

table#albums 
{
    border-collapse:separate;
    border-spacing:0 5px;
}
Pradyut Bhattacharya
fuente
15
Esto funcionó bien para mí. El primer argumento del espacio de borde es el espacio horizontal entre las celdas, y el segundo es el espacio vertical.
No siempre tiene que mediante CSS de lujo si el bueno de HTML puede hacer el trabajo :)
luator
1
El cellspacingatributo de <table> no
Константин Ван
¿es posible solicitar solo el tr dentro de "tbody"?
Jaison
129

Como tengo una imagen de fondo detrás de la mesa, fingirlo con relleno blanco no funcionaría. Opté por poner una fila vacía entre cada fila de contenido:

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

luego use css para dar a las filas espaciadoras una cierta altura y fondo transparente.

Coleman
fuente
3
Probablemente sea más flexible, creo. No siempre puede controlar cuándo necesitará espacio por adelantado (páginas generadas dinámicamente).
Stefan Kendall el
10
Esto me recuerda a los años 90, cuando la compatibilidad con CSS era casi inexistente y las tablas se usaban para la mayoría del diseño. Sin embargo, todavía le doy +1, porque las otras "respuestas" no son mejores en términos de hacer espacio entre las filas de la tabla.
laberinto
@labyrinth No ha cambiado mucho desde los años 90. Con respecto al HTML, todo se ha vuelto mucho más poderoso y mucho más desordenado.
maaartinus
73

Desde la red de desarrolladores de Mozilla :

La propiedad CSS de espacio entre bordes especifica la distancia entre los bordes de las celdas adyacentes (solo para el modelo de bordes separados). Esto es equivalente al atributo de espacio de celdas en HTML de presentación, pero se puede usar un segundo valor opcional para establecer diferentes espacios horizontales y verticales.

Esa última parte a menudo se supervisa. Ejemplo:

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

ACTUALIZAR

Ahora entiendo que el OP quiere filas separadas específicas para tener un mayor espacio. He agregado una configuración con tbodyelementos que logra eso sin arruinar la semántica. Sin embargo, no estoy seguro de si es compatible con todos los navegadores. Lo hice en Chrome.

El siguiente ejemplo es para mostrar cómo puede hacer que parezca que la tabla existe de filas separadas, dulzura completa de CSS. También le dio a la primera fila más espacio con la tbodyconfiguración. ¡Siéntase libre de usar!

Aviso de soporte: 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
fuente
Si quisiera un poco de espacio vertical entre dos filas particulares, simplemente agregué una fila espaciadora <tr> <td colspan = "2" style = "padding-bottom: 1em;"> </td> </tr>
Paul Taylor
Eso funcionaría, pero es semánticamente incorrecto (como en, su fila del separador no es una fila real con datos como las otras filas. Esto puede ser molesto para las personas que usan lectores de pantalla u otros dispositivos auxiliares, así como para fines de indexación y Me gusta. Puede que no haga una gran diferencia, pero es bueno tenerlo en mente cuando desarrolle un sitio web :)
Justus Romijn
Eso es cierto, si realmente está usando una tabla para representar una tabla. Si solo está usando una tabla como una forma de mostrar datos en forma de tabla, entonces diría que tiene más sentido insertar una fila para representar un espacio entre dos elementos en lugar de simplemente agregar espacio a cualquiera de los elementos td anteriores o debajo de la línea porque lo que el usuario quiere hacer es agregar espacio entre dos líneas, no aumentar el tamaño de los elementos dentro de una línea.
Paul Taylor
53

Puede intentar agregar una fila de separación:

html:

<tr class="separator" />

css:

table tr.separator { height: 10px; }
Denis
fuente
77
Para IE, tr sin un cuerpo no sería reconocido. agregue la etiqueta td ficticia también.
Siesta
El problema es que en HTML5, el validador W3C emitirá un error que dice "Una fila de la tabla tenía 0 columnas de ancho, que es menor que el recuento de columnas establecido por la primera fila".
David Grayson
Agradable, agregué otro <tr>, <td> y <p> y configuré la visibilidad de la etiqueta p como oculta. También funciona. :-)
Jeppe
47

No puede cambiar el margen de una celda de la tabla. Pero PUEDES cambiar el relleno. Cambie el relleno del TD, lo que agrandará la celda y alejará el texto del costado con el relleno aumentado. Sin embargo, si tiene líneas de borde, todavía no será exactamente lo que desea.

Robert C. Barth
fuente
Sí, el relleno será empujar la frontera hacia abajo, de modo border-bottomy padding-bottommanera que la frontera estará por debajo del relleno.
Dan Dascalescu
21

Eche un vistazo al borde de colapso: atributo separado (predeterminado) y la propiedad de espacio de borde .

En primer lugar, usted tiene que separar con border-collapse , a continuación, se puede definir el espacio entre columnas y filas con espaciado de borde .

Ambas propiedades CSS son realmente compatibles con todos los navegadores, consulte aquí .

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

Ok puedes hacer

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

Asegúrese de que el color de fondo esté configurado en el td en lugar de en la fila. Esto debería funcionar en la mayoría de los navegadores ... (Chrome, es decir, & ff probado)

Pablo
fuente
Esto crea problemas extraños de alineación vertical, al menos en Firefox
cjohansson
20

Tienes que poner border-collapse: separate;sobre la mesa; la mayoría de las hojas de estilo predeterminadas del navegador comienzan en border-collapse: collapse;, lo que elimina el espacio entre bordes.

Además, el espacio entre bordes: va en TD, no en TR.

Tratar:

<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
fuente
1
el espacio entre bordes también es para la tabla no td
silversky
44
Gracias. Te agradecí en la corrección de comentarios anteriormente, pero un editor entusiasta que quería cambiar mi estilo y rompió el código en el proceso también eliminó mi agradecimiento. Ahora lo estoy poniendo aquí donde no se puede editar.
John Haugeland
18

Puede usar line-height en la tabla:

<table style="width: 400px; line-height:50px;">
alansiqueira27
fuente
Estás en lo correcto, pero el texto también obtendrá la altura de la línea, lo que no es bueno, ¡creo que deberías ver el coleman! Él tiene la buena solución
Waqas Tahir
13
tr { 
    display: block;
    margin-bottom: 5px;
}
Moe
fuente
prefiero display: bloque en línea;
DS_web_developer
11

Una respuesta demasiado tarde :)

Si aplica flotante a trelementos, puede espaciar entre dos filas con marginatributo.

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

tr.classname {
margin-bottom:5px;
}
Oguzhan Ozel
fuente
12
Eso asusta. Lo que esto realmente está haciendo es establecer la displaypropiedad blockpara la fila. Esto permite que la fila tenga un margen. Margen vertical " Se aplica a: todos los elementos, excepto aquellos con tipos de visualización de tabla que no sean table-caption, table y inline-table ". Como table-rowno es ninguna de esas excepciones, entonces no lo cuenta. Probablemente podría lograr el mismo efecto haciendo tr {display:block;}Pero me preocuparía usar cualquiera de estos métodos en una tabla complicada. Probablemente no dará como resultado lo que espera.
sholsinger
Eso da miedo, pero funcionó. No en ie7, pero el espacio de celdas directamente en la tabla funciona en ie7.
Liko
las filas flotantes no son una buena solución ... especialmente si su página es más grande que 2 veces el ancho de la fila. agregar el atributo de ancho a ambas etiquetas
AndreaCi
11

Para crear una ilusión de espacio entre filas, aplique el color de fondo a la fila y luego cree un borde grueso con color blanco para que se cree un "espacio" :)

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

La forma correcta de dar espacio para las tablas es usar el relleno de celdas y el espacio de celdas, por ejemplo

<table cellpadding="4">
Usman Zaheer
fuente
55
Puede hacerlo a través de CSS, que diría que es más "correcto" (además del hecho de que es más elegante, mover el estilo de marcado a CSS ahorra ancho de banda).
Camilo Martin
2
No ahorra ancho de banda. De hecho, uso más. Suponiendo que no está agregando una hoja de estilo solo para esto, debe agregar un selector y posiblemente una identificación o nombre a esta tabla. Eso es más bytes, no menos.
majinnaibu
9

Me topé con esto mientras luchaba con un problema similar. La respuesta de Varun Natraaj me pareció bastante útil, pero en su lugar usaría un borde transparente.

td { border: 1em solid transparent; }

Los bordes transparentes aún tienen ancho.

Thoronwen
fuente
6

Funciona para la mayoría de los navegadores más recientes en 2015. Solución simple. No funciona para transparente, pero a diferencia de la respuesta de Thoronwen, no puedo obtener transparente para renderizar con cualquier tamaño.

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

Simplemente coloque divdentro tdy configure los siguientes estilos de div:

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

Me doy cuenta de que esta es una respuesta a un hilo antiguo y puede que no sea la solución solicitada, pero aunque todas las soluciones sugeridas no hicieron lo que necesitaba, esta solución funcionó para mí.

Tenía 2 celdas de tabla, una con color de fondo y la otra con un color de borde. Las soluciones anteriores eliminan el borde, por lo que la celda de la derecha parecería estar flotando en el aire. La solución que hizo el truco fue reemplazar el table, try tdcon divs y clases correspondientes: la tabla sería div id="table_replacer", tr sería div class="tr_replacer"y td sería div class="td_replacer"(obviamente, cambiar las etiquetas de cierre a divs)

Para obtener la solución para mi problema, el CSS es:

#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 esto ayude a alguien.

bolvo
fuente
En mi opinión, esta solución es equivalente a usar la tabla regular, el patrón tr, td y el estilo tr {display: block;} que probé. Problema: la tabla se ve diferente, ya que los elementos td no se representan al ancho de la tabla, sino que flotan a la izquierda dentro del tr. Significa que los elementos td de todas las filas ya no están alineados verticalmente.
Andreas Stankewitz el
0

Puede llenar los elementos <td /> con elementos <div /> y aplicar cualquier margen a los divs que desee. Para un espacio visual entre las filas, puede usar una imagen de fondo repetitiva en el elemento <tr />. (Esta fue la solución que acabo de usar hoy, y parece funcionar tanto en IE6 como en FireFox 3, aunque no lo probé más).

Además, si no desea modificar el código de su servidor para colocar <div /> s dentro de <td /> s, puede usar jQuery (o algo similar) para envolver dinámicamente el contenido de <td /> en un <div / >, permitiéndole aplicar el CSS como desee.

John Fisher
fuente
0

O simplemente agregue un espacio en blanco con la altura del margen entre las filas en las que desea agregar el espacio

John Magnolia
fuente
0

Aquí hay una solución simple y elegante, con algunas advertencias:

  • En realidad, no puede hacer que los espacios sean transparentes, debe darles un color específico.
  • No puede redondear las esquinas de los bordes encima y debajo de los espacios
  • Debe conocer el relleno y los bordes de las celdas de la tabla.

Con eso en mente, intente esto:

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

Lo que realmente está haciendo es pegar un ::beforebloque rectangular en la parte superior de todas las celdas en la fila que desea precedido por un espacio. Estos bloques sobresalen un poco de las celdas para superponer los bordes existentes, ocultándolos. Estos bloques son solo un borde superior e inferior intercalados: el borde superior forma el espacio y el borde inferior recrea la apariencia del borde superior original de las celdas.

Tenga en cuenta que si tiene un borde alrededor de la tabla en sí y de las celdas, deberá aumentar aún más el margen horizontal -ve de sus 'bloques'. Entonces, para un borde de tabla de 4px, en su lugar usaría:

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

Y si su tabla usa en border-collapse:separatelugar de border-collapse:collapse, entonces necesitará (a) usar el ancho completo del borde de la tabla:

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

... y también (b) reemplace el doble ancho del borde que ahora debe aparecer debajo del espacio:

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

La técnica se adapta fácilmente a una versión .gapafter, si lo prefiere, o para crear espacios verticales (columnas) en lugar de espacios de filas.

Aquí hay un codepen donde puedes verlo en acción: https://codepen.io/anon/pen/agqPpW

Doin
fuente
-1

Aquí esto funciona sin problemas:

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

Supongo que podría elaborar un diseño más fino especificando qué td si es necesario.

Brice Coustillas
fuente
-5

haciendo esto como se muestra arriba ...

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

elimina la alineación vertical de la columna, así que tenga cuidado de cómo lo usa

richardh
fuente
-17

Has probado:

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

Alternativamente, cada td se puede ajustar también:

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

o

 td.classname { padding-bottom:5em; }
agosto
fuente
¿Esto realmente funciona? Tengo div.el { display: table-row; margin: 10px; }, y margen no hace nada. Sé que es un poco diferente de una tabla real, pero no tiene que ser ...
bradlis7
20
Las filas / celdas de la tabla no tienen márgenes.
Espen