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:
<div>
<h1>Test</h1>
</div>
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:
.top-margin-fix:before {
content: ' ';
display: block;
width: 100%;
height: .0000001em;
}
Avec cela, en suivant l'exemple de balisage ci-dessus, vous modifierez votre div en tant que tel:
<div class="top-margin-fix">
<h1>Test</h1>
</div>
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.
overflow:hidden
est mieux dans 90% des cas.