2009-09-17 7 views
18

Impossible de comprendre la situation lorsque cet ensemble intelligent de règles peut être utile. Ils cassent la simplicité du modèle de boîte et fournissent la source infinie de problèmes quand vous combinez différentes pièces de disposition ensemble. Alors, quelle est la raison?Pour quelle raison les règles de réduction de marge ont-elles été introduites dans CSS?

Rules pour la référence. Mise à jour: Les règles sont assez logiques pour les éléments frères, mais pourquoi les marges devraient se propager aux éléments parents jusqu'à l'arbre? Quel genre de problèmes cela résout?

Par exemple:

<div style="margin: 20px; background-color: red;"> 
    <div style="margin: 20px;"> 
     <p style="margin: 100px;">red</p> 
    </div> 
</div> 
<div style="margin: 20px; background-color: blue;">blue</div> 

divs niveau haut sont espacées les unes des autres par 100px.

Répondre

17

C'est l'une des situations où cela n'a vraiment pas de sens jusqu'à ce que vous réalisiez que les alternatives ont moins de sens.

Comme vous le savez probablement, les marges spécifient la distance entre les éléments, ce n'est pas un "remplissage externe" qui entoure chaque élément. Si deux éléments avec la marge 20px sont côte à côte, la distance entre eux est 20px, pas 40px. Comme la marge est une distance à un autre élément, il est logique que la distance soit de l'élément aux éléments environnants, et non à la limite de l'élément parent. Si la marge est comptée à la limite de l'élément parent, placer des éléments dans un élément div introduirait un espacement supplémentaire entre les éléments, même si le div lui-même n'a pas de marge ou de remplissage. Les marges autour d'un élément doivent rester les mêmes si vous ajoutez un div non-délimité autour de lui.

+8

En fait, je préférerais la alternative pour sa clarté. Bien que je suis d'accord dans certaines situations, l'effondrement de la marge aide. –

+4

C'est assez logique pour les éléments frères. Mais je n'ai toujours pas une idée de la raison pour laquelle les marges d'élimination des enfants devraient affecter les marges de l'élément parent. – actual

+1

@actuel: L'espacement entre l'élément enfant et les limites de l'élément parent doit être le même, quels que soient les éléments environnants. Les éléments environnants ne peuvent pas introduire d'espace entre les limites de l'élément parent et de l'élément enfant, car cela pourrait modifier la taille de l'élément parent. La marge doit donc également repousser l'élément parent, pas seulement l'élément enfant. – Guffa

3

Quand cela pourrait-il être utile?

L'exemple le plus simple: une liste de paragraphes et d'en-têtes, chacun avec margin-top et margin-bottom. Vous voulez une marge sur le haut et le bas de l'article, et entre différents éléments. Avec l'effondrement de marge, vous pouvez faire sans définir des marges spéciales sur le premier ou le dernier élément (PAS une partie de la spécification CSS d'origine!) Ou rembourrer le conteneur.

Mais je suis d'accord, dans l'ensemble, c'est une fonctionnalité inutile. Considérons un corps de texte contenant plusieurs paragraphes.

3

Vous voulez que chaque paragraphe soit séparé par 2em, et vous voulez que le premier paragraphe soit séparé du contenu précédent par 2em, et le dernier paragraphe soit séparé du contenu suivant par 2em.

Ceci est facilement accompli avec le CSS suivant, parce que les marges supérieure et inférieure séparant les paragraphes s'effondreront:

p { 
    margin-top: 2em 
    margin-bottom: 2em; 
} 

Si les marges ne se sont pas effondrés, cela se traduirait par les marges étant séparées par un espace de 4em, pas 2em. Sans effondrement des marges, la seule façon d'obtenir l'effet désiré serait d'établir des règles supplémentaires pour le premier et le dernier paragraphe, ce qui impliquerait de leur donner une classe ou un identifiant (qui devrait être conservé si le texte était altéré) ou en les enveloppant dans un élément supplémentaire inutile et en utilisant: first-child et: last-child, ou bien ... vous avez l'idée.

Je peux vous garantir que, si la marge effondrement ne se produit pas, SO aurais beaucoup de questions en double demandant des solutions de contournement pour obtenir l'espacement uniforme que la règle ci-dessus fournit :-)

+1

En fait, vous pouvez résoudre ce problème en vous assurant simplement que le contenu précédent et le contenu suivant ont une marge. De cette façon, vous évitez de donner au premier ou au dernier paragraphe une classe/id et une marge spéciale. – Magne

+0

Il me semble que ne pas s'effondrer dans ce scénario serait l'attente naïve. Breaks PoLS à moi. De plus, avec des marges réduites, vous ne pouvez pas «dégrader», alors qu'ajouter un petit balisage pour gérer votre situation est assez facile, même si cela peut devenir répétitif. – nicodemus13

Questions connexes