2011-06-10 11 views
42

Considere un div con el border-radius, border y background-color atributos CSS aplicados:la frontera de radio + background-color == recortadas frontera

<div style="background-color:#EEEEEE; border-radius:10px; border: 1px black solid;"> 
 
    Blah 
 
</div>

enter image description here

Ahora consideremos una diseño similar pero con el background-color especificado en un inner-div:

<div style="border-radius:10px; border: 1px black solid;"> 
 
    <div style="background-color:#EEEEEE;"> 
 
    Blah 
 
    </div> 
 
</div>

enter image description here

estoy consternado por el hecho de que el background-color del interior <div> oscurece la frontera exterior de la <div>.

Esto es una muestra simplificada del problema. En realidad, estoy usando un <table> como elemento interno con colores de filas alternados. Y estoy usando un <div> como elemento externo ya que border-radius no parece funcionar en el elemento <table>. Here's a jsfiddle de una muestra de este problema.

¿Alguien tiene alguna sugerencia para una solución?

Respuesta

73

Trate overflow:hidden en el exterior div:

<div style="border-radius:10px; border: 1px black solid; overflow: hidden"> 
 
    <div style="background-color:#EEEEEE;"> 
 
    Blah 
 
    </div> 
 
</div>

+4

Esta es la mejor respuesta. –

0

Añadir un poco de relleno, o hacer el color de fondo en el elemento exterior

+1

no puedo agregar relleno por razones de diseño. Y como mencioné, el color de fondo en mi aplicación real es de * alternando * colores de fila, lo que sería imposible de definir en el elemento externo. –

0

¿Sería aceptable dar el div un poco de relleno? De esa forma, los colores de fondo no entrarán en conflicto.

+0

No, es importante para mí que el color de fondo esté alineado con el borde. (es decir, no quiero [esto] (http://jsfiddle.net/jpNy7/10/)) –

8

Añadir estas reglas CSS:

tr:first-of-type td:first-child { 
    border-top-left-radius: 5px;  
} 

tr:first-of-type td:last-child { 
    border-top-right-radius: 5px;  
} 

tr:last-of-type td:first-child { 
    border-bottom-left-radius: 5px;  
} 

tr:last-of-type td:last-child { 
    border-bottom-right-radius: 5px;  
} 

ver firmware fiddle.

+0

Esto es muy bueno. Preferiría una versión que funcionó en IE8 pero tomaré esto si es lo mejor que se puede hacer. –

2

¿Se debe usar una tabla? Aquí hay un ejemplo usando DIV: http://jsfiddle.net/6KwGy/1/

HTML:

<div id="container"> 
    <div class="row"> 
     <div class="leftHalf"> 
      <p>data 1</p> 
     </div> 
     <div class="rightHalf"> 
      <p>data 2</p> 
     </div> 
    </div> 
    <div class="row"> 
     <div class="leftHalf"> 
      <p>data 1</p> 
     </div> 
     <div class="rightHalf"> 
      <p>data 2</p> 
     </div> 
    </div> 
    <div class="row"> 
     <div class="leftHalf"> 
      <p>data 1</p> 
     </div> 
     <div class="rightHalf"> 
      <p>data 2</p> 
     </div> 
    </div> 
</div> 

CSS:

.container { 
    width: 100%; 
} 

.leftHalf { 
    float:left; 
    width:50%; 
} 

.rightHalf { 
    float:left; 
    width:50%; 
} 
.row { 
    float: left; 
    width: 100%; 
} 

#container .row:nth-child(odd) { 
    background-color: #EEEEEE; 
} 
#container .row:first-child { 
    border-top: 1px solid black; 
    border-top-left-radius: 5px; 
    border-top-right-radius: 5px; 
    -moz-border-radius-topleft: 5px; 
    -moz-border-radius-topright: 5px; 
    -webkit-border-radius-topleft: 5px; 
    -webkit-border-radius-topright: 5px; 
} 
#container .row:last-child { 
    border-bottom: 1px solid black; 
    border-bottom-left-radius: 5px; 
    border-bottom-right-radius: 5px; 
    -moz-border-radius-bottomleft: 5px; 
    -moz-border-radius-bottomright: 5px; 
    -webkit-border-radius-bottomleft: 5px; 
    -webkit-border-radius-bottomright: 5px; 
} 
#container .row { 
    border-left: 1px solid black; 
    border-right: 1px solid black; 
} 
+0

+1 para explorar otras opciones. Pero dado que esto utiliza 'last-child' tampoco funcionará en IE8, así que creo que es mejor que use la solución de melhosseiny. (es más corto) –

+0

Veo que siempre se puede crear una clase única para la primera y la última fila que contenga el estilo del radio del borde. – ngen

3

Puede solucionar este problema mediante la aplicación de overflow: hidden; al elemento con la frontera. Una manera mucho más limpia, creo.

0

Se podría añadir la frontera de radio al elemento hijo también.

<div style="border-radius:10px; border: 1px black solid;"> 
 
    <div style="background-color:#EEEEEE; border-radius:10px;"> 
 
    Blah 
 
    </div> 
 
</div>

Cuestiones relacionadas