CSS: solution propre à la marge de l'effondrement problème lorsqu'un élément flottant
Exemple HTML+CSS:
<html>
<body style="padding: 0; margin: 0;">
<div style="float: right;">first</div>
<div style="margin-top: 2em;">second</div>
</body>
</html>
Comportement souhaité: la first
div flotte en haut à droite de la fenêtre. Comportement réel: il flotte 2em ci-dessous la position souhaitée. Raison: l'effondrement de la marge.
En dépit de l'identification du problème, les solutions que je peux venir avec envie hacks:
- changement
body
style demargin: -1px 0 0 0; border-top: 1px solid;
. - insérer
<div style="height: 1px; margin-bottom: -1px;"></div>
avantfirst
- insérer ci-dessus
<div>
entre lesfirst
etsecond
Est-il propre, idiomatiques façon d'éviter ce problème?
- Connexes: clair et l'effondrement de l'fix.
Vous devez vous connecter pour publier un commentaire.
Ajoutant
overflow: hidden;
à labody
devrait résoudre votre problème. Elle définit un nouveau bloc de mise en forme de contexte comme décrit dans cet article: La magie de l'overflow: hidden.jsFiddle Démo (le
body
tag est ajouté automatiquement par jsFiddle, c'est pourquoi je n'ai pas inclus dans la balise HTML)Mise à JOUR (merci à @clairesuzy): Cette solution ne fonctionne pas si
body
apadding: 0
. Jusqu'à ce que je peux trouver une meilleure façon, je ne peux que suggérer d'ajouter un wrapper autour de deux divs (au moins je mérite maintenant @Marcel downwote :)), ce qui je pense est plus propre que les solutions postées par les OP. J'ai l'habitude d'ajouter un wrapper autour de flottaient des trucs de toute façon (il est plus facile de manipuler des navigateurs plus anciens, la plupart du temps), la plupart du temps, il n'a pas besoin d'être ajouté délibérément, parce que c'est de la logique et de la sémantique nécessaire.Donc pour l'instant, je peux venir avec ce:
jsFiddle Démo
Mise à JOUR 2: Après réflexion, et à la lecture des commentaires, je pense vraiment que
overflow: hidden
(ou autre chose queoverflow: visible
) sur le conteneur est la bonne solution. La seule exception où il n'a pas de travail pour moi, c'est sur lebody
élément, ce qui est très rare que cette situation de toute façon. Dans ces rares cas, vous pouvez essayer d'utiliserposition: absolute; top: 0; right: 0;
au lieu de flotter.Une autre solution possible: j'ai aussi trouvé que la mise
display: inline-block; width: 100%;
surbody
fonctionne effectivement.jsFiddle Démo
body
élément qui est hautement improbable, dans un scénario réel de toute façon.. débordement caché sur l'élément parent je.e ajouter un div conteneur (à l'exception du corps, qui est la racine de formatage contexte) fonctionne. Il est très improbable que vous voulez être flottant le premier élément de la source et de ne pas l'avoir il avoir un div conteneur de quelque sorte 😉overflow:hidden
sur un "habillage" de l'élément n'est pas seulement une bonne solution à ce problème mais il est probablement déjà en usage commun pour la compensation des flotteurs.overflow: hidden
's magie est très utile dans plusieurs situations.overflow: auto
suroverflow: hidden
que vous pourriez avoir un certain effet à l'intérieur de la div qui doit aller à l'extérieur (peut-être par rapport les éléments en position ou pseude éléments, peut-être que certaines box-shadow). En fait, toute autre valeur quevisible
devrait fonctionner. Tous les deux ne fonctionnent pas correctement, si la largeur et la hauteur ne sont pas fixes et que moins le contenu de l'.Sur le parent
div
ajouter cette#parent {padding 1px 0; }
ce fut un énorme problème pour moi et il m'a pris pour toujours de trouver une solution. J'ai vu sur un post de 2 ans et cela corrige l'effondrement.SOLUTION
ajouter
overflow: auto;
ouoverflow: hidden;
ouoverflow: scroll;
à la foishtml
etbody
tag.SI VOUS VOULEZ SAVOIR POURQUOI
La création de bloc de mise en forme de contexte(BFC) sur
body
tag.Pourquoi il ne fonctionne pas si j'ajoute
overflow: hidden;
seulement àbody
?Voici pourquoi:
W3C#bloc de mise en forme
W3C#débordement:
the first such child element
etThe element from which the value is propagated
reportez-vous àbody
balise dans ce cas.En d'autres termes, si vous ajoutez
overflow: hidden;
ouoverflow: auto;
ouoverflow: scroll;
àbody
alors que la valeur dehtml
'soverflow
propriété estvisible
, la valeur debody
'soverflow
propriété(hidden
ouauto
ouscroll
) seront propagées à la fenêtre d'affichage. Ainsi, selon la première W3C devis,body
ne serait pas établir un nouveau bloc de mise en forme de contexte.Toutefois, si vous ajoutez
overflow: hidden;
ouoverflow: auto;
ouoverflow: scroll;
àhtml
, leoverflow
valeur du 'corps' ne serait pas propagé et donc établir un nouveau bloc de mise en forme de contexte.Ajouter
float: left;
à la deuxième div.violon
Le W3C spécifications décrit ce à propos de l'effondrement des marges:
http://www.w3.org/TR/CSS21/box.html#collapsing-margins
meilleure façon de faire face à un effondrement des marges est juste d'ajouter un pixel vers le haut ou le bas du rembourrage de l'élément qui a l'effondrement de la marge.
si la marge était de s'effondrer sur le dessus.. alors:
ou border-top de corriger ce ainsi
si votre marge du bas est effondré puis vous ajoutez padding-bottom:1px; ou border-top:1px solid transparent;
en gros toute la frontière ou de rembourrage sur le haut ou le bas va arrêter les marges s'effondrent lorsque vous ont-ils au-dessus de l'un l'autre, ou même lorsque vous avez les éléments imbriqués les uns des autres qui ont de la marge d'effondrement
bonne référence:
http://reference.sitepoint.com/css/collapsingmargins
..
Un autre truc que vous pouvez utiliser lorsque
overflow:hidden
n'est pas adapté:Cet extrait a pour effet secondaire de contenant tous les flotteurs ainsi.
Il peut être étrange, mais dans les nouvelles versions de google Chrome, et Mozilla, vous pouvez obtenir le comportement souhaité (première div est en haut à droite) par l'ajout de wrapper de div avec une bordure