Lorsque deux éléments de type blocs sont imbriqués, les marges de ces deux éléments peuvent fusionner dans certaines conditions... Par exemple dans l'exemple suivant :
HTML :
<div class="cadre"> <div class="page"> <p>Paragraphe de test.</p> <p>Deuxième paragraphe.</p> </div> </div>
Et CSS :
div.cadre {
background: skyblue;
}
div.page {
margin: 2em;
background: lightsalmon;
}
Ce qui nous donne :
Paragraphe de test.
Deuxième paragraphe.
On remarque que les marges verticales (en haut et en bas) du bloc de classe page et du bloc de classe cadre sont fusionnées en une seule, qui s'applique au bloc parent. Par contre, les marges horizontales (gauche et droite) ne sont pas concernées par cette fusion des marges.
Quoi qu'il en soit, si l'on voulait obtenir un effet avec une bordure bleu ciel (couleur de fond du bloc parent) autour de notre bloc saumon clair (couleur de fond du bloc enfant), c'est raté.
[Note : le même phénomène se produit pour la marge supérieur du premier paragraphe, et pour la marge inférieure du dernier paragraphe.]
Plusieurs propriétés permettent de forcer les navigateurs à ne pas fusionner les marges. J'ai pu obtenir ce comportement avec les propriétés CSS de formatage de bloc suivantes :
border) appliquée à l'élément parent (un border-top forcera le navigateur à ne pas fusionner les marges supérieures, tandis qu'un border-bottom le forcera à ne pas fusionner les marges inférieures – les bordures latérales ne seront pas nécessaires) ;padding appliqué à l'élément parent. Là encore, on pourra se contenter de padding-top et de padding-bottom.overflow avec les valeurs auto ou hidden ;De même, plusieurs propriétés de positionnement des blocs auront un comportement similaire. Cependant, elles auront des répercussions importantes sur le rendu des blocs. On les utilisera donc avec une certaine modération.
float et aux valeurs left et right ;display avec la valeur table-cell ;position: absolute;) ou en positionnement fixe (position: fixed;).CSS : .cadre {border-top: solid 1px black; border-bottom: solid 1px black;}
Paragraphe de test.
Deuxième paragraphe.
[Note : rien n'empêche d'utiliser des bordures transparentes en utilisant le code couleur transparent]
padding inférieur et supérieurCSS : .cadre {padding: 1px 0;}
Paragraphe de test.
Deuxième paragraphe.
CSS : .cadre {float: left;}
Paragraphe de test.
Deuxième paragraphe.
Ces trois exemples ont été testés avec :
overflowCSS : .cadre {overflow: auto;}
Paragraphe de test.
Deuxième paragraphe.
[Note : cette solution ne fonctionne pas avec Internet Explorer 6]
CSS : .cadre {display: table-cell;}
Paragraphe de test.
Deuxième paragraphe.
[Note : cette propriété n'est pas implémentée par Internet Explorer pour Windows !]
Ces deux derniers exemples ont été testés avec :
display: table-cell; fait "disparaître" le bloc conteneur...