55 votes

Pourquoi la marge ne serait-elle pas contenue par l'élément parent?

Lorsqu'un élément avec une marge contenue à l'intérieur d'un autre élément, le parent n'est pas toujours envelopper cette marge.

Beaucoup de choses vont amener les parents à envelopper l'enfant de la marge:

  • border:solid;
  • position:absolute;
  • display:inline-block;
  • overflow:auto

(Et ce, juste de petits essais, nul doute qu'il y est plus).

Je suppose que cela a à voir avec l'effondrement des marges, mais:

  1. Le W3C spec page n'a pas de description d'un tel comportement.
  2. Il n'y a pas de chevauchement des marges de ici.
  3. Le comportement de tous les navigateurs qui semble être cohérente sur cette question.
  4. Le comportement est affecté par des déclencheurs qui ne sont pas liées à la marge

Quelle est la logique d'un élément dont la valeur par défaut overflow:auto doit contenir un matériau différent de celui où le dépassement est réglé sur auto.

Pourquoi faut-il tout mais le comportement par défaut d'un régulier div supposer que la marge est contenue par le parent - et pourquoi devrais-la régulière par défaut de ne pas inclure la marge?

EDIT: La réponse finale est que le W3C n'a vraiment préciser ce comportement, mais que

  • Les spécifications n'ont pas vraiment de sens.
  • Les spécifications mélange, sans aucun mot d'explication:
    • "libre marges (marges qui toucherait le haut ou le bas de leur parent ne sont pas contenues par le parent) et
    • "effondré marges (marges adjacentes sont autorisés à se chevauchent).

Démo:

<!doctype html>
<html>
<head>
<title>Margins overextending themselves</title>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" >
<style type="text/css">
    body{
        margin:0;
    }
    div.b{
        background-color:green;
    }
    div.ib{
        display:inline-block;
        background-color:red;
    }
    div.pa{
        background-color:yellow;
        position:absolute;
        bottom:0; right:0;
    }
    div.oa{
        background-color:magenta;
        overflow:auto;
    }
    div.brdr{
        background-color:pink;
        border:solid;
    }

    h1{margin:100px; width:250px; border:solid;}
</style>
</head>
<body>
<div class="b">
    <h1>Is the margin contained?</h1>
</div>
<div class="ib">
    <h1>Is the margin contained?</h1>
</div>
<div class="pa">
    <h1>Is the margin contained?</h1>
</div>
<div class="oa">
    <h1>Is the margin contained?</h1>
</div>
<div class="brdr">
    <h1>Is the margin contained?</h1>
</div>
</body>
</html>`

30voto

Nick Craver Points 313913

C'est de cette façon CSS fonctionne selon le W3C:

Dans cette spécification, l'expression de l'effondrement des marges signifie que les marges adjacentes (pas de non-vide de contenu, le rembourrage, la ou les zones frontalières, ou à l'autorisation de les séparer) de deux boîtes ou plus (ce qui peut être à côté l'un de l'autre ou imbriquée) se combinent pour former une seule marge.

Plus spécifique à votre cas du premier div:

Si les marges supérieure et inférieure de la boîte sont adjacentes, alors il est possible pour les marges à l'effondrement à travers elle. Dans ce cas, la position de l'élément dépend de sa relation avec les autres éléments dont les marges sont effondrés.

  • Si l'élément marges sont effondrées avec l'un de ses parents marge du haut, le bord supérieur bord de la boîte est la même que celle du parent.
  • Sinon, soit celle de l'élément parent ne participe pas à la marge de l'effondrement, ou seulement les parents de la marge du bas est en cause. La position de l'élément de la bordure supérieure de bord est la même comme elle l'aurait été si l'élément a une valeur non nulle de la bordure inférieure.

La meilleure chose que je puisse faire est le point vous sur "l'Effondrement des Marges" sur sitepoint (par Tommy Olsson et Paul O'Brien). Ils font un très explication détaillée avec des exemples vous montrant exactement les comportements que vous démontré dans la question du code d'exemple.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X