Existe-t-il un moyen de désactiver complètement l'effondrement des marges? Les seules solutions que j'ai trouvées (sous le nom de "décollement") impliquent l'utilisation d'une bordure 1px ou d'un remplissage 1px. Je trouve cela inacceptable: le pixel superflu complique les calculs sans raison valable. Existe-t-il un moyen plus raisonnable de désactiver cet effondrement des marges?
203
margin-bottom
mais laissezmargin-top
0.Réponses:
Il existe deux principaux types d'effondrement des marges:
L'utilisation d'un rembourrage ou d'une bordure empêchera l'effondrement uniquement dans ce dernier cas. En outre, toute valeur
overflow
différente de sa valeur par défaut (visible
) appliquée au parent empêchera l'effondrement. Ainsi, les deuxoverflow: auto
etoverflow: hidden
auront le même effet. La seule différence lors de l'utilisationhidden
est peut-être la conséquence inattendue de masquer le contenu si le parent a une hauteur fixe.Les autres propriétés qui, une fois appliquées au parent, peuvent aider à résoudre ce problème sont les suivantes:
float: left / right
position: absolute
display: inline-block / flex
Vous pouvez tous les tester ici: http://jsfiddle.net/XB9wX/1/ .
Je dois ajouter que, comme d'habitude, Internet Explorer est l'exception. Plus précisément, dans IE 7, les marges ne se réduisent pas lorsqu'un type de disposition est spécifié pour l'élément parent, tel que
width
.Sources: article de Sitepoint Collapsing Margins
la source
overflow: auto
peut faire apparaître des barres de défilement dans l'élément parent, plutôt que de laisser déborder le contenu déborder selonoverflow: visible
.flex
différente de sa valeur par défaut désactivera également l'effondrement des margesVous pouvez également utiliser le bon vieux micro clearfix pour cela.
Voir le violon mis à jour: http://jsfiddle.net/XB9wX/97/
la source
:before
et:after
. J'ai maintenant ajouté cette règle à mon stylesheet:div:before, div:after{content: ' '; display: table;}
. Fantastique. Soudain, les choses commencent à se comporter comme prévu.Une astuce intéressante pour désactiver l'effondrement des marges qui n'a aucun impact visuel, à ma connaissance, consiste à définir le remplissage du parent sur
0.05px
:Le rembourrage n'est plus 0, donc l'effondrement ne se produira plus, mais en même temps, le rembourrage est suffisamment petit pour que visuellement il arrondisse à 0.
Si un autre remplissage est souhaité, appliquez-le uniquement à la "direction" dans laquelle la réduction de la marge n'est pas souhaitée, par exemple
padding-top: 0.05px;
.Exemple de travail:
Modifier: a changé la valeur de
0.1
à0.05
. Comme Chris Morgan l'a mentionné dans un commentaire ci-dessous, et à partir de ce petit test , il semble qu'en effet Firefox prenne0.1px
en compte le rembourrage. Cependant,0.05px
semble faire l'affaire.la source
*{padding-top:0.1px}
. Sommes-nous sûrs que cela fonctionne dans tous les navigateurs?0.05px
semble toujours être un choix spécifique, pas un numéro aléatoire de navigateur, je préfère0.01px
.overflow:hidden
empêche l'effondrement des marges mais n'est pas exempt d'effets secondaires - à savoir qu'il ... cache le débordement.En dehors de cela et de ce que vous avez mentionné, il vous suffit d'apprendre en direct et d'apprendre pour ce jour quand ils sont réellement utiles (tous les 3 à 5 ans).
la source
overflow: auto
est bon à utiliser pour empêcher le débordement caché et toujours empêcher l'effondrement des marges.overflow:auto;
ma zone de contenu a gagné une barre de défilement sur certaines pages.En fait, il y en a un qui fonctionne parfaitement:
affichage: flex; flex-direction: colonne;
la source
<div>
dans le.container
, sinon le.container
contrôlera le modèle de boîte de ses enfants. Par exemple, les éléments en ligne deviendront des éléments de bloc pleine largeur; s'ils ont des marges, ceux-ci seront également réduits.Chaque navigateur basé sur webkit doit prendre en charge les propriétés
-webkit-margin-collapse
. Il existe également des sous-propriétés pour le définir uniquement pour la marge supérieure ou inférieure. Vous pouvez lui donner les valeurs collapse (par défaut), discard (définit la marge à 0 s'il y a une marge voisine) et distinct (empêche la marge de s'effondrer).J'ai testé que cela fonctionne sur les versions 2014 de Chrome et Safari. Malheureusement, je ne pense pas que cela serait pris en charge dans IE car il n'est pas basé sur le webkit.
Lisez la référence CSS d'Apple Safari pour une explication complète.
Si vous consultez la page des extensions webkit CSS de Mozilla , ils répertorient ces propriétés comme propriétaires et recommandent de ne pas les utiliser. En effet, ils n'entreront probablement pas dans le CSS standard de sitôt et seuls les navigateurs Webkit les prendront en charge.
la source
Je sais que c'est un très ancien article, mais je voulais juste dire que l'utilisation de flexbox sur un élément parent désactiverait l'effondrement de la marge pour ses éléments enfants.
la source
J'ai eu un problème similaire avec l'effondrement de la marge parce que le parent s'est
position
mis à relatif. Voici la liste des commandes que vous pouvez utiliser pour désactiver la réduction des marges.VOICI AIRE DE JEUX POUR TESTER
Essayez simplement d'assigner n'importe quelle
parent-fix*
classe à l'div.container
élément, ou n'importe quelle classechildren-fix*
àdiv.margin
. Choisissez celui qui correspond le mieux à vos besoins.Quand
div.absolute
un arrière-plan rouge sera positionné tout en haut de la page.div.absolute
sera positionnée à la même coordonnée Y quediv.margin
Voici jsFiddle avec un exemple que vous pouvez éditer
la source
Dans un navigateur plus récent (à l'exception d'IE11), une solution simple pour empêcher l'effondrement de la marge parent-enfant consiste à utiliser
display: flow-root
. Cependant, vous auriez toujours besoin d'autres techniques pour empêcher l'effondrement des éléments adjacents.DEMO (avant)
DEMO (après)
la source
Pour votre information, vous pouvez utiliser la grille mais avec des effets secondaires :)
la source