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.
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 elborder-radius
yborder-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
yborder-bottom
para las celdas de su tabla (td
yth
) - Dar las celdas en el primera fila a
border-top
- Dar las celdas en el primera columna a
border-left
- Utilizando el
first-child
ylast-child
selectores, redondee las esquinas apropiadas para las celdas de la tabla en las cuatro esquinas.
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}
???
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:hidden
las 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
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
¿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