J'essaie d'ajouter des valeurs de marge sur un div à l'intérieur d'un autre div. Tout fonctionne bien sauf la valeur supérieure, il semble être ignoré. Mais pourquoi?
Ce que j'attendais:
Ce que j'obtiens:
Code:
#outer {
width: 500px;
height: 200px;
background: #FFCCCC;
margin: 50px auto 0 auto;
display: block;
}
#inner {
background: #FFCC33;
margin: 50px 50px 50px 50px;
padding: 10px;
display: block;
}
<div id="outer">
<div id="inner">
Hello world!
</div>
</div>
W3Schools n'a aucune explication pour expliquer pourquoi la marge se comporte de cette façon.
float:left;
ça marche ... mais pourquoi est-ce nécessaire. Je ne veux pas qu'il flotte. Et pourquoi la marge pour gauche / droite fonctionne-t-elle?Réponses:
Vous voyez en fait la marge supérieure de l'
#inner
élément s'effondrer dans le bord supérieur de l'#outer
élément, ne laissant que le#outer
marge intacte (bien qu'elle ne soit pas affichée dans vos images). Les bords supérieurs des deux boîtes sont alignés l'un contre l'autre car leurs marges sont égales.Voici les points pertinents de la spécification W3C:
Vous pouvez effectuer l'une des opérations suivantes pour empêcher la marge de s'effondrer:
La raison pour laquelle les options ci-dessus empêchent la marge de s'effondrer est la suivante:
Les marges gauche et droite se comportent comme prévu car:
la source
Essayez d'utiliser
display: inline-block;
sur le div intérieur.la source
display:inline-block;
. En outre, lorsque vous utilisezdisplay:inline-block;
, vous perdez la largeur de 100% sur la div.display:inline-block
travaillé pour moi. Merci beaucoup.Ce que @BoltClock a mentionné est assez solide. Et ici, je veux juste ajouter plusieurs autres solutions à ce problème. vérifiez cette marge w3c_collapsing . Les parties vertes sont la pensée potentielle de la façon dont ce problème peut être résolu.
Solution 1
cela signifie que je peux ajouter
float:left
à l'un#outer
ou à#inner
demo1 .notez également que
float
cela invaliderait laauto
marge.Solution 2
autre que
visible
, mettonsoverflow: hidden
dans#outer
. Et cette façon semble assez simple et décente. Je l'aime.Solution 3
ou
ces deux méthodes vont rompre le flux normal de
div
Solution 4
est le même que @enderskill
Solution 5
Cela n'a pas beaucoup de travail à faire avec la question car c'est la marge qui s'effondre entre frères et sœurs. cela signifie généralement si un top-box a
margin-bottom: 30px
et un frère amargin-top: 10px
. La marge totale entre eux est30px
au lieu de40px
.Solution 6
C'est très intéressant et je peux juste ajouter une ligne de bordure supérieure
Et
<div>
est également au niveau du bloc par défaut, vous n'avez donc pas à le déclarer exprès. Désolé de ne pas pouvoir publier plus de 2 liens et images en raison de ma réputation de novice. Au moins, vous savez d'où vient le problème la prochaine fois que vous verrez quelque chose de similaire.la source
Je ne sais pas pourquoi ce que vous avez ne fonctionne pas, mais vous pouvez ajouter
overflow: auto;
à la div extérieure.
la source
Si vous ajoutez du rembourrage
#outer
, cela fonctionne.Démo
la source
Je ne sais pas exactement pourquoi, mais en changeant le CSS interne en
semble fonctionner;
la source
Ne répond pas au "pourquoi" (doit être quelque chose avec une marge qui s'effondre), mais semble que la façon la plus simple / la plus logique de faire ce que vous essayez de faire serait d' ajouter
padding-top
simplement à la div externe :http://jsfiddle.net/hpU5d/1/
Note mineure - il ne devrait pas être nécessaire de définir un div à
display:block;
moins qu'il y ait quelque chose d'autre dans votre code lui disant de ne pas être bloqué.la source
essaye ça:
http://jsfiddle.net/7AXTf/
Bonne chance
la source
Je suppose que la définition de la propriété position du div #inner sur relative peut également aider à obtenir l'effet. Mais de toute façon, j'ai essayé le code original collé dans la question sur IE9 et le dernier Google Chrome et ils donnent déjà l'effet souhaitable sans aucune modification.
la source
Utilisation
padding-top:50px
pour div externe. Quelque chose comme ça:Remarque: le rembourrage augmentera la taille de votre div. Dans ce cas, si la taille de votre div est importante, je veux dire si elle doit avoir une hauteur spécifique. diminuer la hauteur de 50 px:
la source
Avez-vous essayé! Important avant tout, cela forcera tout:
la source
Juste pour une solution rapide, essayez d'enrouler vos éléments enfants dans un
div
élément comme celui-ci -La marge de
inner
div ne s'effondrera pas en raison du remplissage1px
entreouter
etinner
div. Donc, logiquement, vous aurez1px
plus d'espace avec la marge deinner
div existante .la source