J'ai un div
( parent ) qui en contient un autre div
( enfant ). Parent est le premier élément body
sans style CSS particulier. Quand je mets
.child
{
margin-top: 10px;
}
Le résultat final est que le haut de mon enfant est toujours aligné avec le parent. Au lieu que l'enfant soit déplacé de 10 pixels vers le bas, mon parent se déplace de 10 pixels vers le bas.
Mon DOCTYPE
est réglé sur XHTML Transitional
.
Qu'est-ce que j'oublie ici?
modifier 1
Mon parent doit avoir des dimensions strictement définies car il a un arrière-plan qui doit être affiché en dessous de haut en bas (pixel parfait). Ainsi , la mise en marges verticales il est un pas aller .
edit 2
Ce comportement est le même sur FF, IE et CR.
Réponses:
Vous avez trouvé une alternative dans les éléments enfants avec des marges dans les DIV. Vous pouvez également ajouter:
ou:
Cela empêche les marges de s'effondrer . La bordure et le rembourrage font de même. Par conséquent, vous pouvez également utiliser les éléments suivants pour éviter un effondrement de la marge supérieure:
Mise à jour par demande populaire: L'intérêt de réduire les marges est de gérer le contenu textuel. Par exemple:
Étant donné que le navigateur réduit les marges, le texte apparaîtra comme prévu et les
<div>
balises wrapper n'influencent pas les marges. Chaque élément garantit un espacement autour de lui, mais l'espacement ne sera pas doublé. Les marges du<h2>
et<p>
ne s'additionnent pas, mais se glissent l'une dans l'autre (elles s'effondrent). La même chose se produit pour l' élément<p>
et<ul>
.Malheureusement, avec des designs modernes, cette idée peut vous mordre lorsque vous voulez explicitement un conteneur. C'est ce qu'on appelle un nouveau contexte de formatage de bloc dans CSS parler. L'
overflow
astuce ou la marge vous le donnera.la source
<h2>
,<p>
,<ul>
ne se étranges lacunes ou des marges « doubles » de cette façon.margin: 5px 10px;
id attendez-vous à 2 divs 5 px du haut et 20 px entre eux pas 5 px du haut et 10 px entre eux. si je voulais 10 px entre eux, je l'ai spécifiémargin: 5px 5px;
. je souhaite sincèrement qu'il y ait une règle racine que je pourrais placer qui empêcherait l'effondrement de toute marge. Je déteste devoir doubler la taille des marges sur papier pour les amener à faire ce que je veux à l'écran. et ce truc top ... quel désastreIl s'agit d'un comportement normal (au moins parmi les implémentations de navigateur). La marge n'affecte pas la position de l'enfant par rapport à son parent, sauf si le parent a un rembourrage, auquel cas la plupart des navigateurs ajouteront alors la marge de l'enfant au rembourrage du parent.
Pour obtenir le comportement que vous souhaitez, vous avez besoin de:
la source
.parent {border: solid 1px;}
Bien que toutes les réponses résolvent le problème, mais elles s'accompagnent de compromis / ajustements / compromis comme
floats
, Vous devez faire flotter les élémentsborder-top
, Cela pousse le parent au moins 1px vers le bas, qui doit ensuite être ajusté en introduisant une-1px
marge dans l'élément parent lui-même. Cela peut créer des problèmes lorsque le parent a déjàmargin-top
des unités relatives.padding-top
, même effet que l'utilisationborder-top
overflow: hidden
, Ne peut pas être utilisé lorsque le parent doit afficher un contenu débordant, comme un menu déroulantoverflow: auto
, Introduit des barres de défilement pour l'élément parent qui a (intentionnellement) du contenu débordant (comme des ombres ou un triangle de l'info-bulle)Le problème peut être résolu en utilisant les pseudo-éléments CSS3 comme suit
https://jsfiddle.net/hLgbyax5/1/
la source
margin-top: -1px
semble inutile. Mais j'aime ça.margin-top: -1px
etheight: 0
semble inutile. Testé dans Chrome. Mais la meilleure solution..parent:after...
ajouter du style
display:inline-block
à l'élément enfantla source
l'élément parent ne doit pas être vide au moins placé
avant l'élément enfant.la source
C'est ce qui a fonctionné pour moi
http://jsfiddle.net/97fzwuxh/
la source
Je découvre que, à l'intérieur de votre .css> si vous définissez la propriété d'affichage d'un élément div sur inline-block, cela résout le problème. et la marge fonctionnera comme prévu.
la source
Solution soignée CSS uniquement
Utilisez le code suivant pour ajouter un premier enfant sans contenu à la div qui se déplace involontairement:
L'avantage de cette méthode est que vous n'avez pas besoin de modifier le CSS d'un élément existant et qu'elle a donc un impact minimal sur la conception. À côté de cela, l'élément qui est ajouté est un pseudo-élément, qui n'est pas dans l'arbre DOM.
La prise en charge des pseudo-éléments est très répandue: Firefox 3+, Safari 3+, Chrome 3+, Opera 10+ et IE 8+. Cela fonctionnera dans n'importe quel navigateur moderne (soyez prudent avec le plus récent
::before
, qui n'est pas pris en charge dans IE8).Le contexte
Si le premier enfant d'un élément a un
margin-top
, le parent ajustera sa position pour réduire les marges redondantes. Pourquoi? C'est comme ça.Étant donné le problème suivant:
Vous pouvez le corriger en ajoutant un enfant avec du contenu, tel qu'un simple espace. Mais nous détestons tous ajouter des espaces pour ce qui est un problème de conception uniquement. Par conséquent, utilisez la
white-space
propriété pour simuler du contenu.Où
position: relative;
assure un positionnement correct du correctif. Etwhite-space: pre;
vous évite d'ajouter du contenu - comme un espace blanc - au correctif. Etheight: 0px;width: 0px;overflow: hidden;
s'assure que vous ne verrez jamais le correctif.Vous devrez peut-être ajouter
line-height: 0px;
oumax-height: 0px;
vous assurer que la hauteur est réellement nulle dans les anciens navigateurs IE (je ne suis pas sûr). Et éventuellement, vous pouvez l'ajouter<!--dummy-->
dans les anciens navigateurs IE, si cela ne fonctionne pas.En bref, vous pouvez faire tout cela avec seulement CSS (ce qui supprime la nécessité d'ajouter un enfant réel à l'arborescence DOM HTML):
la source
overflow: hidden;
pour le parent.Pour empêcher "Div parent", utilisez la marge de "div child":
Dans parent, utilisez ces CSS:
la source
Les
margin
éléments contenus à l'intérieur.child
s'effondrent.Dans cet exemple,
p
reçoit unmargin
des styles par défaut du navigateur. La valeur par défaut du navigateurfont-size
est généralement de 16 pixels. En ayant unmargin-top
de plus de 16px sur#child
vous commencez à remarquer son mouvement de position.la source
J'ai aussi eu ce problème mais j'ai préféré éviter les hacks de marges négatives, j'ai donc mis un
<div class="supercontainer"></div>
autour de tout ce qui a des rembourrages au lieu de marges. Bien sûr, cela signifie plus de divitis, mais c'est probablement le moyen le plus propre de le faire correctement.
la source
Fait intéressant, ma solution préférée à ce problème n'est pas encore mentionnée ici: l'utilisation de flotteurs.
html:
css:
voir ici: http://codepen.io/anon/pen/Iphol
notez que si vous avez besoin d'une hauteur dynamique sur le parent, il doit également flotter, remplacez simplement
height:100px;
parfloat:left;
la source
Une solution alternative que j'ai trouvée avant de connaître la bonne réponse était d'ajouter une bordure transparente à l'élément parent.
Votre boîte utilisera cependant des pixels supplémentaires ...
la source
Utiliser à la
top
place demargin-top
est une autre solution possible, le cas échéant.la source