Obligar al niño a obedecer los bordes curvos de los padres en CSS


135

Tengo un div dentro de otro div. #outery #inner. #outerTiene bordes curvos y un fondo blanco. #innerno tiene bordes curvos y un fondo verde. #innerse extiende más allá de los bordes curvos de #outer. ¿Hay alguna manera de parar esto?

#outer { 
        display: block; float: right; margin: 0; width: 200px;
        background-color: white; overflow: hidden;
        -moz-border-radius: 10px; 
        -khtml-border-radius: 10px; 
        -webkit-border-radius: 10px; 
        border-radius: 10px; 
    }
    #inner { background-color: #209400; height: 10px; border-top: none; }
 <div id="outer">
        <div id="inner"></div>
        <!-- other stuff needs a white background -->
        <!-- bottom corners needs a white background -->
    </div>


    

No importa cómo lo intente, todavía se superpone. ¿Cómo puedo hacer #innerobedecer y llenar #outerlas fronteras?

editar

El siguiente truco sirvió para el propósito por ahora. Pero la pregunta sigue (tal vez para los escritores CSS3 y webbrowser): ¿por qué los elementos secundarios no obedecen los bordes curvos de sus padres y hay alguna forma de obligarlos a hacerlo?

El truco para solucionar esto para mis necesidades por ahora, puede asignar curvas a bordes individuales. Entonces, para mis propósitos, acabo de asignar una curva a los dos primeros del elemento interno.

#inner {
    border-top-right-radius: 10px; -moz-border-radius-topright: 10px; -webkit-border-top-right-radius: 10px;
    border-top-left-radius: 10px; -moz-border-radius-topleft: 10px; -webkit-border-top-left-radius: 10px;
}

¿Has intentado establecer exactamente el mismo radio de borde en el elemento interno?
— Daniel O'Hara

1
Pero quiero que el radio del borde del elemento interno sea recto en la parte inferior. ¿Es posible establecer un radio de borde solo para una esquina determinada?
— Daniel Bingham

Sin lugar a duda. Incluso puedes asignarlos como border-radius: TL TR BL BR.
— Daniel O'Hara

29
Leí esto como "Obligar al niño a obedecer las órdenes de los padres". :)
— Bennor McCarthy

Con la excepción de Safari, -moz-border-radiusy border-radiusse puede utilizar como una taquigrafía con cuatro valores: 10px 10px 0 0. Sin embargo, para Safari debe configurarlos individualmente.
— Yi Jiang

Respuestas:


199

De acuerdo con las especificaciones:

Los fondos de un cuadro, pero no su imagen de borde, se recortan a la curva apropiada (según lo determinado por 'clip de fondo'). Otros efectos que se recortan en el borde o el borde del relleno (como 'desbordamiento' que no sea 'visible') también deben recortarse en la curva. El contenido de los elementos reemplazados siempre se recorta a la curva de borde de contenido. Además, el área fuera de la curva del borde del borde no acepta eventos del mouse en nombre del elemento.

http://www.w3.org/TR/css3-background/#the-border-radius

Esto significa que un overflow: hiddenencendido #outerdebería funcionar. Sin embargo, esto no funcionará para Firefox 3.6 y versiones inferiores. Esto se soluciona en Firefox 4:

Las esquinas redondeadas ahora recortan el contenido y las imágenes (si el desbordamiento: visible no está configurado).

https://developer.mozilla.org/en/CSS/-moz-border-radius

Así que aún necesitará la solución, solo acorte a:

#outer {
  overflow: hidden;
}

#inner {
  -moz-border-radius: 10px 10px 0 0;
}

Véalo trabajando aquí: http://jsfiddle.net/VaTAZ/3/


1
Bingo, estaba probando con Firefox 3.6. Entonces esto lo explica.
— Daniel Bingham

1
Cualquiera que llegue tan tarde en el juego, overflow: hidden;está trabajando en las versiones actuales de FF. Asegúrese de volver a realizar la prueba en la medida en que lo requieran sus requisitos.
— BillyNair

Solo quiero notar que el violín tiene margen, por lo que el efecto real de overflow hiddenestá oculto
— user10089632

¿Qué pasa si no queremos que se oculte el contenido de desbordamiento? Un desbordamiento oculto cortará cosas como ventanas emergentes de información sobre herramientas y menús de ventanas que aparecen dentro.
— mae

1
Simplemente agregue desbordamiento: oculto; y radio del borde al DIV externo
— Nader

1

¿Qué estaría mal con esto?

#outer { 
    display: block; float: right; margin: 0; width: 200px;
    background-color: white; overflow: hidden;
}
#inner { background-color: #209400; height: 10px; border-top: none; }

#outer, #inner{
    -moz-border-radius: 10px; 
    -khtml-border-radius: 10px; 
    -webkit-border-radius: 10px; 
    border-radius: 10px; 
}

Quiero que el fondo esté acorralado. Esto requeriría dos divisiones internas, una dada un margen negativo para superponerse a la otra.
— Daniel Bingham

Hmm ... resulta que puedes establecer esquinas individuales. Así que acabo de configurar los dos primeros.
— Daniel Bingham

1

Si desea bordes afilados en la parte inferior: use estos:

radio de borde superior izquierdo: 10px;
radio de borde superior derecho: 10px; 

-moz-border-radius-topleft
-moz-border-radius-topright

0

¿Has intentado hacer la posición: relativa para el div interno?

es decir:

#inner { 
    background-color: #209400; 
    height: 10px; 
    border-top: none; 
    position: relative; 
    left: 15px; 
    top: 15px; 
}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.