74 votes

margin-top ne fonctionne pas avec clear : both

<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 ?

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" !

74voto

Pointy Points 172438

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.

0 votes

Pouvez-vous nous en dire plus ?

0 votes

@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.

0 votes

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.

21voto

Randall Cook Points 3003

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.

0 votes

C'est une approche très intelligente. Vous pouvez également faire en sorte que la hauteur de la ~<div style="clear : both ;"></div>~ soit la ~margin-top~ que vous auriez donnée à la ~<div>~ principale de la donnée.

7voto

rvbyron Points 51

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é.

0 votes

Cela perturbe l'élément suivant après le troisième div. En fin de compte, les flotteurs doivent être supprimés.

4voto

Simon_Weaver Points 31141

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 a clear: both .

http://jsfiddle.net/9EY4R/

enter image description here

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.

3voto

silkfield Points 131

Utilisez plutôt "padding-top" dans votre div de données principale. Ou encore, enveloppez la div de données principale dans une seule div avec "padding-top".

Prograide.com

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.

Powered by:

X