28173 sujets

CSS et mise en forme, CSS3

Bonjour,
comme IE 5 a des problèmes avec les padding j'ai eu l'idée de mettre un div avec un margin dans un autre.


<div id='cadre'>
   <div id='page'></div>
</div>


#cadre {
   margin: 0 auto;
   padding: 0;
   width: 60em;
}
#page {
   margin: 1em;
}

Sous IE il n'y a pas de problème mais sous firefox, il n'y a pas de margin-top et margin-bottom Smiley ohwell C'est assez bizarre, d'habitude c'est plutot IE qui interprete mal.
Du coup en essayant d'éviter une erreur d'IE 5, je me retrouve avec une erreur d'interpretation de Firefox Smiley biggol
Modifié par rockfef (11 Feb 2006 - 16:04)
je viens de me rendre compte qu'en fait le margin-top est bien présent sous Firefox mais il s'applique sur la balise body et pas sur
<div id='cadre'> 
Smiley ohwell
Sous IE pourtant ça fonctionne bien.
Opera et Konqueror ont le même comportement que Firefox sur ce sujet. Donc il ne s'agit probablement pas d'un bug de Firefox, mais plutôt d'un comportement standard (il suffit de trouver à quoi il est dû).

Ou alors c'est un bug de rendu CSS standard Smiley biggrin
ouais donc je vais remettre un padding et mettre juste un <div> tout en précisant "site optimisé pour Firefox et IE 6" au début de mon site Smiley ohwell
Bonjour.

Ce phénomène est lié à la fusion des marges verticales :
CSS2 a écrit :

8.3.1 La fusion des marges

Dans cette spécification, l'expression marges de fusion signifie que les marges adjacentes (sans qu'une aire d'espacement ou de bordure ne les séparent) de deux ou plusieurs boîtes (celles-ci pouvant être l'une à côté de l'autre ou imbriquées), ces marges se combinent pour n'en former qu'une seule.

En CSS2, les marges horizontales ne fusionnent jamais.

Les marges verticales peuvent fusionner entre certaines boîtes :

* Les marges verticales de deux boîtes, ou plus, d'éléments de type bloc, placés dans un flux normal fusionnent. La largeur de la marge finale devient la valeur la plus grande entre celles des marges adjacentes. Dans le cas de marges négatives, on soustrait la plus grande des valeurs des marges négatives adjacentes, en valeur absolue, de la plus grande des marges positives adjacentes. Et s'il n'y pas de marges positives, on déduit de zéro la plus grande des marges négatives, en valeur absolue. Remarque Les boîtes limitrophes peuvent être générées par des éléments qui n'ont aucune parenté en tant que frères ou ancêtres ;
* Les marges verticales entre une boîte qui flotte et toute autre boîte ne fusionnent pas ;
* Les marges entre des boîtes absolument et relativement positionnées ne fusionnent pas.

http://www.yoyodesign.org/doc/w3c/css2/box.html#x24
Bon, disons qu'on a la page suivante (celle de rockfef mais un peu standardisée au passage) :
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
	<title>Test</title>
	<style type="text/css">
	div#cadre {
		background: red;
	}
	div#page {
		margin: 10em;
		background: #fed;
	}
	</style>
</head>

<body>
<div id="cadre">
	<div id="page">
		<p>Test.</p>
		<p>Deuxième paragraphe.</p>
	</div>
</div>
</body>
</html>

Qu'observe-ton ? Les marges de gauche et de droite passent normalement, mais les marges de haut et de bas sont appliquées non pas à la div#page, mais à l'élément body...

Cela semble venir du fait que la div#cadre est "vide"... De fait, si on rajoute du texte au début ou à la fin de cette div, on voit apparaître les marges de la div#page.

Autre solution :
	div#cadre {
		border: solid 1px black;
		background: red;
	}
	div#cadre div#page {
		border: solid 1px blue;
		margin: 10em;
		background: #fed;
	}

Et hop, tout marche. On remarque aussi que par rapport au premier test, les marges par défaut des paragraphes sont prises en compte, alors qu'elles ne l'étaient pas jusqu'ici.

On arrive à reproduire ce genre de comportement par d'autres moyens, visibles en commentaires dans la feuille de styles suivante :
	div#cadre {
		/* [Solution 1] overflow: auto; [ou bien] overflow: hidden; */
		/* [Solution 2]
		border-top: solid 1px transparent;
		border-bottom: solid 1px transparent; */
		/* [Solution 3] padding: 1px; */
		/* [Solution 4] display: table-cell; */
		/* [Solution 5]	float: left; */
		/* [Solution 6] position: absolute; [ou bien] position: fixed; */
		background: red;
	}
	div#cadre #page {
		margin: 10em;
		background: #fed;
	}

Les solutions ci-dessus sont classées par ordre de préférence, de la moins intrusive à la plus intrusive (Note : je ne suis pas assez expert en CSS pour dire exactement quelle propriété aura des effets secondaires fâcheux ou pas... c'est donc un classement très aproximatif, et peut-être même erroné).

Tout cela doit être lié à des histoires de contexte de formatage de bloc (ou un truc du genre). Mister Laurent Denis, plus d'infos là-dessus ? Déjà deux ou trois articles en ligne sur ce sujet sur Blog&Blues ?
http://www.yoyodesign.org/doc/w3c/css1/#vertical-formatting
a écrit :
4.1.1 La mise en forme verticale

Pour les éléments de type bloc non-flottants, la largeur de la marge correspond à une distance minimum entre le contenu et le bord des boîtes qui l'entourent. Si aucune bordure, ni espacement, ni contenu ne séparent deux (ou plus) marges verticales adjacentes, alors elles fusionnent et la résultante est la plus grande de ces valeurs de marge. Dans la plupart des cas, cette fusion des marges verticales donne un meilleur aspect visuel, plus proche des attentes de l'auteur.

Ils ont de l'humour là Smiley lol
Alan a écrit :
http://www.yoyodesign.org/doc/w3c/css1/#vertical-formatting
4.1.1 La mise en forme verticale

Pour les éléments de type bloc non-flottants, la largeur de la marge correspond à une distance minimum entre le contenu et le bord des boîtes qui l'entourent. Si aucune bordure, ni espacement, ni contenu ne séparent deux (ou plus) marges verticales adjacentes, alors elles fusionnent et la résultante est la plus grande de ces valeurs de marge. Dans la plupart des cas, cette fusion des marges verticales donne un meilleur aspect visuel, plus proche des attentes de l'auteur.

Ils ont de l'humour là Smiley lol

Non, c'est effectivement très pratique pour les éléments de même niveau. L'avoir généralisé aux éléments imbriqués est peut-être dommage (mais pas forcément, il y a des cas où ça peut être utile), mais ça reste quelque chose de pratique pour gérer un flux de texte, par exemple, avec des paragraphes et des titres ayant des retraits (margin). Ça permet de définir des "marges minimum" pour un élément. Ensuite, il fusionne en ne gardant que la marge la plus grande. Du coup, pas besoin de prévoir le type d'éléments qui viendra se placer avant ou après afin d'éviter le casse-tête des marges qui s'aditionnent pour créer une marge deux fois trop grande.

C'est une solution élégante que j'aurais voulu voir intégrer dans des logiciels de type traitement de texte ou même PAO. Quelqu'un sait si certains le font (avec MS Word et OpenOffice Writer il me semble que non) ?