<div style="float: left;">Left</div>
<div style="float: right;">Right</div>
<div style="clear: both; margin-top: 200px;">Main Data</div>
Pourquoi le margin:top
pour 'Main Data' ne fonctionne pas dans le code ci-dessus ?
<div style="float: left;">Left</div>
<div style="float: right;">Right</div>
<div style="clear: both; margin-top: 200px;">Main Data</div>
Pourquoi le margin:top
pour 'Main Data' ne fonctionne pas dans le code ci-dessus ?
Vous pourriez mettre les deux divs flottants dans un autre un qui a mis "overflow : hidden" :
<div style='overflow:hidden'>
<div style="float: left;">Left</div>
<div style="float: right;">Right</div>
</div>
<div style="clear: both; margin-top: 200px;">Main Data</div>
modifier - Pour ajouter un peu à cette réponse vieille de 5 ans : Je pense que la cause de ce comportement déroutant est le processus quelque peu compliqué de effondrement des marges . Une bonne astuce avec le HTML original de l'OP est d'ajouter une règle CSS comme celle-ci :
div { border: 1px solid transparent; }
Pouf ! Maintenant (sans mes <div>
) il fonctionne bien ! Enfin, sauf pour le pixel supplémentaire des frontières. En particulier, je pensez à c'est une combinaison de la façon dont clear: both
et les règles d'écrasement des marges qui donnent lieu à la mise en page inattendue du code dans le PO.
modifier à nouveau - Pour l'histoire complète (et, je pense, complètement exacte), voir L'excellente réponse de Mark Amery . Les détails ont une certaine complexité que cette réponse passe sous silence.
@user395881 et bien les calculs de marge que le navigateur effectue concernent les éléments qui sont dans le même contexte de mise en page. Pour les éléments flottants, les marges sont calculées par rapport aux autres éléments flottants locaux et (je pense) par rapport au contenu en ligne également. Mais ces éléments de bloc statiques sont dans un contexte différent. Les règles de mise en page sont compliquées et difficiles à comprendre, j'en conviens. Les documents du W3C contiennent des diagrammes qui expliquent certaines choses.
Le fait que les éléments flottants ne soient pas "là" est manifestement incorrect pour expliquer que la marge ne fonctionne pas. Si ce n'était que cela, nous nous attendrions à ce que le haut de la zone de marge de la division effacée commence en haut de l'élément parent et non en bas des éléments flottants. Au lieu de cela, nous voyons que la marge ne prend pas effet du tout le div effacé dans le code original de l'OP est positionné de la manière suivante plus haut qu'il ne l'aurait été si les divs flottants en fait pas là. Votre solution fonctionne, mais votre explication de la cause du problème ne peut pas être correcte.
Si Pointy montre comment envelopper les éléments flottants dans un div, vous pouvez également insérer un div vide entre les éléments flottants et la section de données principale. Par exemple :
<div style="float: left;">Left</div>
<div style="float: right;">Right</div>
<div style="clear: both;"></div>
<div style="margin-top: 200px;">Main Data</div>
Cela peut s'avérer utile dans les cas où l'ajout d'un div wrapper autour d'un certain HTML n'est pas souhaitable.
Pointy et Randall Cook ont d'excellentes réponses. J'ai pensé que je pourrais montrer une autre solution.
<div style="float: left;">Left</div>
<div style="float: right;">Right</div>
<div style="float: left; clear: both; margin-top: 200px;">Main Data</div>
Si vous faites du troisième élément "float : left ;" AND "clear : both ;", cela devrait avoir l'effet désiré de donner au troisième élément une marge de 200 pixels. Voici un exemple de enlace à un exemple.
Cela peut également avoir une incidence sur d'autres éléments qui suivent, à savoir s'ils doivent être flottants ou non. Cependant, cela pourrait aussi avoir l'effet désiré.
Solution alternative :
Vous pouvez en fait mettre un
margin-bottom
sur les éléments flottants pour pousser vers le bas l'élément situé en dessous qui aclear: both
.
Note : Ayant fait cette suggestion, je dois immédiatement me rétracter car ce n'est généralement pas une bonne idée, mais dans certaines situations limitées, cela peut être approprié ;
<div class='order'>
<div class='address'>
<strong>Your order will be shipped to:</strong><br>
Simon</br>
123 Main St<br>
Anytown, CA, US
</div>
<div class='order-details'>
Item 1<br>
Item 2<br>
Item 3<br>
Item 4<br>
Item 5<br>
Item 6<br>
Item 7<br>
Item 8<br>
Item 9<br>
Item 10<br>
</div>
<div class='options'>
<button>Edit</button>
<button>Save</button>
</div>
</div>
Le panneau contenant les éléments est appelé order-details
avec ce css
.order-details
{
padding: .5em;
background: lightsteelblue;
float: left;
margin-left: 1em;
/* this margin does take effect */
margin-bottom: 1em;
}
Dans l'exemple ci-dessus, le panneau jaune comporte une icône margin-top
mais si elle n'est pas supérieure à l'élément flottant le plus haut, elle ne fera rien (bien sûr, c'est le but de cette question).
Si vous définissez le margin-top
du panneau jaune à 20em, il sera visible car la marge est calculée à partir du haut du cadre bleu extérieur.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.
0 votes
Quel navigateur utilisez-vous ? J'ai vérifié avec Firefox, IE et Chrome.
4 votes
La plupart des réponses fournies ici proposent des solutions de contournement pour ce comportement, et c'est très bien, mais si vous voulez une réponse (longue et difficile) qui explique réellement pourquoi cela se produit en premier lieu, voir mine .
0 votes
La plupart des réponses ont dit "COMMENT" et non "POURQUOI" !