La propiedad border-radius y border-collapse:collapse no se mezclan. ¿Cómo puedo usar border-radius para crear una tabla colapsada con esquinas redondeadas?

10 minutos de lectura

Estoy tratando de hacer una mesa con esquinas redondeadas usando CSS border-radius propiedad. Los estilos de tabla que estoy usando se ven así:

table {
    -moz-border-radius:10px;
    -webkit-border-radius:10px;
    border-radius:10px
}

Aquí está el problema. También quiero configurar el border-collapse:collapse propiedad, y cuando se establece border-radius ya no funciona ¿Hay alguna forma basada en CSS en la que pueda obtener el mismo efecto que border-collapse:collapse sin usarlo realmente?

Parece que gran parte del problema es que poner la mesa para que tenga las esquinas redondeadas no afecta a las esquinas de la esquina td elementos. Si la mesa fuera de un solo color, esto no sería un problema ya que solo podría hacer la parte superior e inferior td esquinas redondeadas para la primera y última fila respectivamente. Sin embargo, estoy usando diferentes colores de fondo para la tabla para diferenciar los encabezados y para las franjas, por lo que el interior td los elementos también mostrarían sus esquinas redondeadas.

Rodear la mesa con otro elemento con esquinas redondeadas no funciona porque las esquinas cuadradas de la mesa “se traspasan”.

Especificar el ancho del borde en 0 no colapsa la tabla.

Fondo td las esquinas siguen siendo cuadradas después de establecer el espaciado de celdas en cero.

Las tablas se generan en PHP, por lo que podría aplicar una clase diferente a cada uno de los th/tds externos y diseñar cada esquina por separado. Preferiría no hacer esto, ya que no es muy elegante y es un poco complicado aplicarlo a varias tablas, así que sigan llegando sugerencias.

Me gustaría hacer esto sin JavaScript.

  • ¿No podría envolver la tabla en un div, establecer border-radius y “overflow: hidden” en el div? Acabo de probar y funciona bien, a menos que necesite desplazarse/expandirse en un div que tiene un ancho/alto fijo o sus padres que lo tienen.

    – Ian

    13 de agosto de 2012 a las 18:05

Me lo imaginé. Solo tienes que usar unos selectores especiales.

El problema de redondear las esquinas de la mesa era que el td los elementos tampoco se redondearon. Puedes resolver eso haciendo algo como esto:

table tr:last-child td:first-child {
    border: 2px solid orange;
    border-bottom-left-radius: 10px;
}
    
table tr:last-child td:last-child {
    border: 2px solid green;
    border-bottom-right-radius: 10px;
}
<table>
  <tbody>
    <tr>
      <td>1</td>
      <td>2</td>
    </tr>
    <tr>
      <td>3</td>
      <td>4</td>
    </tr>
  </tbody>
</table>

Ahora todo se redondea correctamente, excepto que todavía queda la cuestión de border-collapse: collapse rompiendo todo.

Una solución es agregar border-spacing: 0 y dejar el valor predeterminado border-collapse: separate en la mesa.

  • En lugar de jugar con el HTML, ¿por qué no agregar border-spacing: 0; como un estilo de borde?

    – Ramón Tayag

    8 de marzo de 2011 a las 3:43

  • Estaba teniendo problemas para configurar el color de fondo de la etiqueta TR en lugar de la etiqueta TD. Si está rayando su mesa, asegúrese de configurar el color de fondo del TD y no del TR.

    – Afeitadora Will

    22 de agosto de 2011 a las 21:08

  • Bueno, ¿qué pasa si Ud. tengo que usar color de fondo en el TR? ¿Es posible en absoluto?

    – Mohoch

    9 oct 2011 a las 15:21

  • solo agregando border-spacing: 0; como recomienda Ramon me lo arregló. Asegúrate de agregar el border-radius y border-spacing estilos a la <th> o <td> elementos, no <thead> o <tbody>.

    – Gavin

    3 oct 2013 a las 18:36


  • Estoy usando bootstrap y encontré la solución siguiendo los consejos de Ramón, así: border-spacing: 0; border-collapse: separate;

    – Caner SAYGIN

    13 de abril de 2019 a las 15:41


El siguiente método funciona (probado en Chrome) usando un box-shadow con una difusión de 1px en lugar de un borde “real”.

    table {
        border-collapse: collapse;
        border-radius: 30px;
        border-style: hidden; /* hide standard table (collapsed) border */
        box-shadow: 0 0 0 1px #666; /* this draws the table border  */ 
    }

    td {
        border: 1px solid #ccc;
    }
<table>
  <thead>
    <tr>
      <th>Foo</th>
      <th>Bar</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Baz</td>
      <td>Qux</td>
    </tr>
    <tr>
      <td>Life is short</td>
      <td rowspan="3">and</td>
    </tr>
    <tr>
      <td>Love</td>
    </tr>
    <tr>
      <td>is always over</td>
    </tr>
    <tr>
      <td>In the</td>
      <td>Morning</td>
    </tr>
  </tbody>
</table>

  • Esto es lo único que me ha funcionado. Sin embargo, es difícil obtener el color correcto en el borde de la mesa.

    – Tomas Ahle

    18 de marzo de 2011 a las 23:40

  • no es utilizable si su mesa tiene un color de fondo diferente al del área circundante.

    – g.pickardou

    29 de octubre de 2013 a las 9:49

  • @ g.pickardou, ese problema se puede manejar agregando ‘desbordamiento: oculto’ en el elemento de la tabla.

    – Vale

    4 de agosto de 2016 a las 6:56

  • box-shadow hace que la mesa sea más grande y ahora los lados se cortan.

    – rayo

    4 mayo 2020 a las 16:20

Si desea una solución solo de CSS (no es necesario configurar cellspacing=0 en el HTML) que permite bordes de 1px (que no se puede hacer con el border-spacing: 0 solución), prefiero hacer lo siguiente:

  • Establecer un border-right y border-bottom para las celdas de su tabla (td y th)
  • Dar las celdas en el primera fila a border-top
  • Dar las celdas en el primera columna a border-left
  • Utilizando el first-child y last-child selectores, redondee las esquinas apropiadas para las celdas de la tabla en las cuatro esquinas.

Vea una demostración aquí.

Dado el siguiente HTML:

VER ejemplo a continuación:

   
table {
  border-collapse: separate;
  border-spacing: 0;
  min-width: 350px;
}
table tr th,
table tr td {
  border-right: 1px solid #bbb;
  border-bottom: 1px solid #bbb;
  padding: 5px;
}

table tr th:first-child,
table tr td:first-child {
  border-left: 1px solid #bbb;
}
table tr th:first-child,
table tr td:first-child {
  border-left: 1px solid #bbb;
}
table tr th {
  background: #eee;
  text-align: left;
  border-top: solid 1px #bbb;
}

/* top-left border-radius */
table tr:first-child th:first-child {
  border-top-left-radius: 6px;
}

/* top-right border-radius */
table tr:first-child th:last-child {
  border-top-right-radius: 6px;
}

/* bottom-left border-radius */
table tr:last-child td:first-child {
  border-bottom-left-radius: 6px;
}

/* bottom-right border-radius */
table tr:last-child td:last-child {
  border-bottom-right-radius: 6px;
}
<div>
    <table>
        <tr>
            <th>item1</th>
            <th>item2</th>
        </tr>
        <tr>
            <td>item1</td>
            <td>item2</td>
        </tr>
        <tr>
            <td>item1</td>
            <td>item2</td>
        </tr>
        <tr>
            <td>item1</td>
            <td>item2</td>
        </tr>
    </table>
</div>

  • Escriba respuestas que incluyan código (permanente). Si hay mucho código en la respuesta, simplemente publique los bits relevantes y una explicación de por qué son relevantes.

    –Samuel Harmer

    20 de enero de 2012 a las 16:12

  • Esta es una gran solución, pero fue un poco difícil de leer. Reescribí algunas de las reglas de estilo y agregué una explicación del código, así que espero que eso ayude.

    – Michael Martin-Smucker

    16/10/2012 a las 15:13

  • aplica un radio a la mesa también, o se ve raro cuando aplicas un fondo a la mesa misma.

    – cabra

    19 de junio de 2013 a las 3:29

  • Lo que hace el table.Info clase tiene que ver con algo?

    – Pylinux

    22 de diciembre de 2016 a las 6:43

¿Has probado a usar table{border-spacing: 0} en lugar de table{border-collapse: collapse} ???

avatar de usuario de user59200
usuario59200

Probablemente tendrá que colocar otro elemento alrededor de la mesa y diseñarlo con un borde redondeado.

Él borrador de trabajo especifica que border-radius no se aplica a los elementos de la tabla cuando el valor de border-collapse es collapse.

  • Eso fue algo que también consideré, pero si creo un div para rodear la mesa y lo configuro para que tenga esquinas redondeadas, las esquinas cuadradas de la mesa aún se traslucen. Vea el ejemplo recién publicado.

    – vamin

    9 de marzo de 2009 a las 23:21

  • El mejor compromiso que pude encontrar fue agregar un bloque THEAD a la mesa y aplicarle el fondo gris (con #eee en la mesa misma). Las celdas de encabezado se desbordaron detrás del borde de la TABLA en lugar de frente a ella. Luego aumenté el borde de la tabla a 3px para ocultar el desbordamiento.

    – usuario59200

    10 de marzo de 2009 a las 1:25

  • @vamin “desangrar” – no si usas overflow:hidden;

    – Brian McCutchon

    21 de mayo de 2013 a las 0:19


  • Entonces, en esta situación, todos pueden usar mi solución desde la parte inferior de esta página b2n.ir/tabla-radio

    – AmerllicA

    24 de octubre de 2017 a las 11:48

Como dijo Ian, la solución es anidar la tabla dentro de un div y configurarlo así:

.table_wrapper {
  border-radius: 5px;
  overflow: hidden;
}

Con overflow:hiddenlas esquinas cuadradas no traspasarán el div.

  • Eso fue algo que también consideré, pero si creo un div para rodear la mesa y lo configuro para que tenga esquinas redondeadas, las esquinas cuadradas de la mesa aún se traslucen. Vea el ejemplo recién publicado.

    – vamin

    9 de marzo de 2009 a las 23:21

  • El mejor compromiso que pude encontrar fue agregar un bloque THEAD a la mesa y aplicarle el fondo gris (con #eee en la mesa misma). Las celdas de encabezado se desbordaron detrás del borde de la TABLA en lugar de frente a ella. Luego aumenté el borde de la tabla a 3px para ocultar el desbordamiento.

    – usuario59200

    10 de marzo de 2009 a las 1:25

  • @vamin “desangrar” – no si usas overflow:hidden;

    – Brian McCutchon

    21 de mayo de 2013 a las 0:19


  • Entonces, en esta situación, todos pueden usar mi solución desde la parte inferior de esta página b2n.ir/tabla-radio

    – AmerllicA

    24 de octubre de 2017 a las 11:48

Avatar de usuario de Igor Ivancha
Igor Ivancha

Que yo sepa, la única forma en que podría hacerlo sería modificar todas las celdas de la siguiente manera:

table td {
  border-right-width: 0px;
  border-bottom-width: 0px;
}

Y luego para obtener el borde en la parte inferior y hacia atrás

table tr td:last-child {
  border-right-width: 1px;
}
table tr:last-child td {
  border-bottom-width: 1px;
}

:last-child no es válido en ie6, pero si está utilizando border-radius Supongo que no te importa.

EDITAR:

Después de mirar su página de ejemplo, parece que puede solucionar esto con el espacio entre celdas y el relleno.

Los bordes grises gruesos que está viendo son en realidad el fondo de la tabla (puede verlo claramente si cambia el color del borde a rojo). Si establece el espaciado de celdas en cero (o de manera equivalente: td, th { margin:0; }) los “bordes” grises desaparecerán.

EDITAR 2:

No puedo encontrar una manera de hacer esto con una sola tabla. Si cambia su fila de encabezado a una tabla anidada, posiblemente pueda obtener el efecto que desea, pero será más trabajo y no dinámico.

  • Agregué un ejemplo con cellpacing=0, y está mucho más cerca. Los bordes no deseados desaparecen, pero las esquinas inferiores aún se desangran.

    – vamin

    9 de marzo de 2009 a las 23:38

  • De nuevo, gracias por tu ayuda. Las tablas se generan en php, por lo que estoy pensando que si no se propone una solución elegante, simplemente asignaré una clase a cada esquina th/td y las diseñaré por separado.

    – vamin

    10 de marzo de 2009 a las 0:07

¿Ha sido útil esta solución?