Forçando o filho a obedecer as bordas curvas dos pais em CSS

135

Eu tenho uma div dentro de outra div. #outere #inner. #outerpossui bordas curvas e fundo branco. #innernão possui bordas curvas e fundo verde. #innerse estende além das bordas curvas de #outer. Há alguma maneira para parar isso?

#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>


    

Não importa como eu tente, ainda se sobrepõe. Como faço para #innerobedecer e preencher #outeras bordas?

editar

O hack a seguir serviu ao propósito por enquanto. Mas a pergunta permanece (talvez para os escritores do CSS3 e do navegador da web): Por que os elementos filhos não obedecem às bordas curvas de seus pais e existe alguma maneira de forçá-los a fazê-lo?

O truque para contornar isso para minhas necessidades por enquanto, você pode atribuir curvas a bordas individuais. Portanto, para meus propósitos, acabei de atribuir uma curva às duas primeiras do 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;
}
Daniel Bingham
fonte
Você tentou definir exatamente o mesmo raio da borda para o elemento interno?
Daniel O'Hara
1
Mas eu quero que o raio da borda do elemento interno seja direto na parte inferior. É possível definir um raio da borda apenas para um determinado canto?
Daniel Bingham
Com certeza. Você pode até atribuí-los como border-radius: TL TR BL BR.
Daniel O'Hara
29
Eu li isso como "Forçando a criança a obedecer às ordens dos pais". :)
Bennor McCarthy
Com a excepção do Safari, -moz-border-radiuse border-radiuspode ser utilizado como uma forma abreviada, com quatro valores: 10px 10px 0 0. Para o Safari, no entanto, você precisa configurá-los individualmente.
Yi Jiang

Respostas:

199

De acordo com as especificações:

Os fundos de uma caixa, mas não a imagem da borda, são cortados na curva apropriada (conforme determinado por 'clipe de fundo'). Outros efeitos que são cortados na borda ou na borda do preenchimento (como 'estouro' que não seja 'visível') também devem ser cortados na curva. O conteúdo dos elementos substituídos é sempre aparado na curva da borda do conteúdo. Além disso, a área fora da curva da borda da borda não aceita eventos de mouse em nome do elemento.

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

Isso significa que um overflow: hiddenon #outerdeve funcionar. No entanto, isso não funcionará no Firefox 3.6 e abaixo. Isso foi corrigido no Firefox 4:

Os cantos arredondados agora recortam o conteúdo e as imagens (se o excesso: visível não estiver definido).

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

Então você ainda precisará da correção, apenas reduza-a para:

#outer {
  overflow: hidden;
}

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

Veja trabalhando aqui: http://jsfiddle.net/VaTAZ/3/

Yi Jiang
fonte
1
Bingo, eu estava testando com o Firefox 3.6. Então, isso explica isso.
Daniel Bingham
1
Qualquer um que esteja chegando no final do jogo overflow: hidden;está trabalhando nas versões atuais do FF. Certifique-se de testar o quanto for necessário.
22416 BillyNair
Só quero nota que o violino tem margem, de modo que o efeito real overflow hiddenestá escondido
user10089632
E se não quisermos ocultar o conteúdo excedente? Um estouro oculto cortará coisas como pop-up de dicas de ferramentas e menus de janelas que aparecem dentro.
mae
1
Basta adicionar overflow: hidden; e fronteira-raio para DIV exterior
Nader
1

O que haveria de errado com isso?

#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; 
}
Jarrett Widman
fonte
Quero que o fundo fique afiado nas pontas. Isso levaria duas divs internas, uma com margem negativa para se sobrepor à outra.
Daniel Bingham
Hmm ... acontece que você pode definir cantos individuais. Então, acabei de definir os dois primeiros.
Daniel Bingham
1

Se você deseja bordas afiadas na parte inferior: Use estas:

raio da borda superior esquerda: 10 px;
raio na borda superior direita: 10 px; 

-moz-border-raio-topleft
-moz-border-radius-topright
tdtje
fonte
0

você já tentou fazer a posição: relativa para a div interna ???

isso é:

#inner { 
    background-color: #209400; 
    height: 10px; 
    border-top: none; 
    position: relative; 
    left: 15px; 
    top: 15px; 
}
Naveed Butt
fonte