Forcer l'enfant à obéir aux bordures courbes du parent en CSS


135

J'ai un div à l'intérieur d'un autre div. #outeret #inner. #outera des bordures courbes et un fond blanc. #innern'a pas de bordures courbes et un fond vert. #inners'étend au-delà des frontières courbes de #outer. Y a-t-il un moyen d'arrêter cela?

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


    

Peu importe comment j'essaye, cela se chevauche toujours. Comment puis-je faire #innerobéir et remplir #outerles frontières de?

Éditer

Le hack suivant a servi le but pour le moment. Mais la question se pose (peut-être aux rédacteurs de CSS3 et du navigateur Web): pourquoi les éléments enfants n'obéissent-ils pas aux bordures courbes de leurs parents et y a-t-il de toute façon pour les forcer?

Le hack pour contourner cela pour mes besoins pour l'instant, vous pouvez attribuer des courbes à des bordures individuelles. Donc, pour mes besoins, je viens d'attribuer une courbe aux deux premiers de l'élément intérieur.

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

Avez-vous essayé de définir exactement le même rayon de bordure pour l'élément interne?
Daniel O'Hara

1
Mais je veux que le rayon de la bordure de l'élément interne soit droit en bas. Est-il possible de définir un rayon de bordure uniquement pour un certain coin?
Daniel Bingham

Pour sûr. Vous pouvez même les attribuer comme border-radius: TL TR BL BR.
Daniel O'Hara

29
J'ai lu ceci comme "Forcer l'enfant à obéir aux ordres de ses parents". :)
Bennor McCarthy

À l'exception de Safari, -moz-border-radiuset border-radiuspeut être utilisé comme un raccourci avec quatre valeurs: 10px 10px 0 0. Cependant, pour Safari, vous devez les définir individuellement.
Yi Jiang

Réponses:


199

Selon les spécifications:

Les arrière-plans d'une boîte, mais pas sa bordure-image, sont coupés à la courbe appropriée (comme déterminé par 'background-clip'). Les autres effets qui se coupent sur la bordure ou le bord de remplissage (comme «débordement» autre que «visible») doivent également être coupés sur la courbe. Le contenu des éléments remplacés est toujours ajusté à la courbe du bord du contenu. En outre, la zone à l'extérieur de la courbe du bord de la bordure n'accepte pas les événements de souris au nom de l'élément.

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

Cela signifie qu'un overflow: hiddensur #outerdevrait fonctionner. Cependant, cela ne fonctionnera pas pour Firefox 3.6 et les versions antérieures. Ceci est corrigé dans Firefox 4:

Les coins arrondis coupent désormais le contenu et les images (si le dépassement: visible n'est pas défini).

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

Vous aurez donc toujours besoin du correctif, raccourcissez-le simplement à:

#outer {
  overflow: hidden;
}

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

Regardez-le fonctionner ici: http://jsfiddle.net/VaTAZ/3/


1
Bingo, je testais avec Firefox 3.6. Donc cela explique cela.
Daniel Bingham

1
Quiconque arrive aussi tard dans le jeu overflow: hidden;travaille sur les versions actuelles de FF. Assurez-vous de tester en fonction de vos besoins.
BillyNair

Je veux juste noter que le violon a une marge, donc l'effet réel de overflow hiddenest caché
user10089632

Et si nous ne voulons pas que le contenu de débordement soit masqué? Un débordement caché coupera des éléments tels que les fenêtres contextuelles et les menus de fenêtre qui apparaissent à l'intérieur.
mae

1
Ajoutez simplement le débordement: caché; et border-radius à la DIV externe
Nader

1

Quel serait le problème avec cela?

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

Je veux que le fond soit coincé. Cela prendrait deux div internes, l'un étant donné une marge négative pour chevaucher l'autre.
Daniel Bingham

Hmm ... il s'avère que vous pouvez définir des coins individuels. Je viens donc de définir les deux premiers.
Daniel Bingham

1

Si vous voulez des arêtes vives sur le fond: Utilisez ces éléments:

bord-haut-gauche-rayon: 10px;
border-top-right-radius: 10px; 

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

0

avez-vous essayé de faire la position: relative pour la div interne ???

C'est:

#inner { 
    background-color: #209400; 
    height: 10px; 
    border-top: none; 
    position: relative; 
    left: 15px; 
    top: 15px; 
}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.