J'ai un div d'en-tête comme premier élément de mon div wrapper, mais lorsque j'ajoute une marge supérieure à un h1 à l'intérieur du div d'en-tête, il pousse le div d'en-tête entier vers le bas. Je me rends compte que cela se produit chaque fois que j'applique une marge supérieure au premier élément visible d'une page.
Voici un exemple d'extrait de code. Merci!
div#header{
width: 100%;
background-color: #eee;
position: relative;
}
div#header h1{
text-align: center;
width: 375px;
height: 50px;
margin: 50px auto;
font-size: 220%;
background: url('../../images/name_logo.png') no-repeat;
}
<div id="header">
<h1>Title</h1>
<ul id="navbar"></ul>
</div>
overflow:hidden
est mieux dans 90% des cas.overflow: hidden
ouoverflow: auto
peuvent provoquer des effets secondaires indésirables, dont certains peuvent ne pas être observés à première vue. J'ai trouvé que changermargin
pourpadding
faire l'affaire, comme le suggère la réponse ci-dessous. Je ne comprends toujours pas pourquoi tout le problème se produit, cependant.Je n'ai pas d'explication solide sur pourquoi cela se produit, mais j'ai corrigé ce problème en changeant le
top-margin
entop-padding
ou en ajoutantdisplay: inline-block
au style d'élément.EDIT: c'est ma théorie
J'ai le sentiment que cela a quelque chose à voir avec la façon dont les marges sont réduites (combinées).
à partir des marges réduites du W3C :
Ma théorie est que puisque votre premier élément est à côté du corps, les deux marges se combinent et sont appliquées au corps: cela oblige le contenu du corps à commencer en dessous de la marge réduite appliquée conformément au modèle de boîte .
Il y a des situations où les marges ne se réduisent pas, ce qui pourrait valoir la peine de jouer avec (à partir de la réduction des marges ):
la source
Voici quelques-unes des façons d'éviter la réduction des marges entre les éléments parent-enfant. Utilisez celui qui correspond le mieux au reste de votre style:
display
sur autre queblock
.float
sur autre quenone
.padding
. Par exemple, si vous en aviezmargin-top: 10px
, remplacez parpadding-top: 10px;
.position
(absolute
ourelative
) avec des attributstop
,bottom
etc. Par exemple , si vous aviezmargin-top: 10px
, remplacez -les parposition: relative; top: 10px;
.padding
ou unborder
dans le côté où les marges se réduisent, à l' élément parent . La bordure peut être 1px et transparente.overflow
sur autre quevisible
l' élément parent .la source
Je sais que c'est un vieux problème, je l'ai rencontré plusieurs fois. Le problème est que tous les correctifs ici sont des hacks qui auraient potentiellement des conséquences inattendues.
Tout d'abord, il y a une explication simple au problème racine. En raison du fonctionnement de la réduction des marges, si le premier élément à l'intérieur d'un conteneur a une marge supérieure, cette marge supérieure est effectivement appliquée au conteneur parent lui-même. Vous pouvez tester cela vous-même en procédant comme suit:
Dans un débogueur, ouvrez-le et passez la souris sur le div. Vous remarquerez que le div lui-même est en fait placé là où la marge supérieure de l'élément H1 s'arrête . Ce comportement est voulu par le navigateur.
Il y a donc une solution facile à cela sans avoir à recourir à d'étranges hacks, comme le font la plupart des messages ici (pas d'insultes intentionnelles, c'est juste la vérité) - revenez simplement à l'explication d'origine -
...if the first element inside a container has a top margin...
- Suite à cela, vous auriez donc besoin le premier élément d'un conteneur à NE PAS avoir de marge supérieure. D'accord, mais comment faire cela sans ajouter d'éléments qui n'interfèrent pas sémantiquement avec votre document?Facile! Pseudo-éléments! Vous pouvez le faire via une classe ou un mixin prédéfini. Ajoutez un
:before
pseudo-élément:CSS via une classe:
Avec cela, en suivant l'exemple de balisage ci-dessus, vous modifierez votre div en tant que tel:
Pourquoi ça marche?
Le premier élément d'un conteneur, s'il n'a pas de marge supérieure, définit la position du début de la marge supérieure de l'élément suivant. En ajoutant un
:before
pseudo-élément, le navigateur ajoute en fait un élément non sémantique (en d'autres termes, bon pour le référencement) dans le conteneur parent avant votre premier élément.Q. Pourquoi la hauteur: .0000001em?
A. Une hauteur est requise pour que le navigateur pousse l'élément de marge vers le bas. Cette hauteur est effectivement égale à zéro, mais elle vous permettra toujours d'ajouter un remplissage au conteneur parent lui-même. Puisqu'il est effectivement nul, cela n'aura pas non plus d'effet sur la disposition du conteneur. Belle.
Vous pouvez maintenant ajouter une classe (ou mieux, dans SASS / LESS, un mixin!) Pour résoudre ce problème au lieu d'ajouter des styles d'affichage étranges qui entraîneront des conséquences inattendues lorsque vous voulez faire d'autres choses avec vos éléments, en éliminant délibérément les marges sur les éléments et / ou le remplacer par un remplissage ou des styles de position / flottement étranges qui ne sont vraiment pas destinés à résoudre ce problème.
la source
display: flex
fonctionnera dans ce cas. Donnez l'élément parentdisplay: flex;
, puis donnez une marge selon vos besoins à lah1
balise.la source
Rencontrez ce problème aujourd'hui.
overflow: hidden
n'a pas fonctionné comme prévu quand j'ai eu plus d'éléments suivis.J'ai donc essayé de changer la propriété d'affichage de la div parent et j'ai
display: flex
travaillé !!!J'espère que cela peut aider quelqu'un. :)
la source
L'ajout d'un petit peu de remplissage au sommet de l'élément parent peut résoudre ce problème.
Ceci est utile si vous avez besoin qu'un élément à l'intérieur du parent soit visible à l'extérieur de l'élément parent, comme si vous créez un effet de chevauchement.
la source
Cela se produit en raison de l'effondrement des marges. Lorsque l'élément enfant touche la limite de l'élément parent et que l'un d'entre eux est appliqué avec des marges, alors:
La marge la plus importante l'emportera (appliquée).
si l'un d'entre eux a une marge, les deux partageront la même chose.
Solutions
la source