28173 sujets

CSS et mise en forme, CSS3

Bonjour Smiley lol

Sur mon site : http://wizardschool.free.fr j'ai un design qui se resume ainsi :

conteneur {
{header}
{menu}
{page}
}

Le bloc conteneur regroupe donc les autres, vient ensuite le bloc header qui porte l'image du haut en arriere plan, le bloc menu qui est a gauche et qui a un float:left pour que le bloc 'page' soit à sa gauche... voila le CSS :

#conteneur {
	width:750px;
	min-height:650px;
	border-top:1px solid #FFFFFF;
	border-right:1px solid #FFFFFF;
	border-bottom:1px solid #FFFFFF;
	border-left:1px solid #FFFFFF;
	margin-top:10px;
	margin-left:auto;
	margin-right:auto;
	background-image:url("../images/fond_defaut");
	background-position:top left;
	background-repeat:repeat-y;
	}
#header {
	width:100%;
	height:195px;
	background-image:url("../images/header_defaut.jpg");
	background-repeat:no-repeat;
}
#menu {
	margin:0;
	padding:10px;
	width:150px;
	float:left;
}
#page {
	width:560px;
	margin-top:10px;
	margin-left:180px;
}


Sur une des pages que je fais je voudrais avoir deux petits blocs cote à cote et un en dessous dans le bloc page, de cette facon :
{page
{bloc1} {bloc2}
{ bloc 3 }
}

j'ai donc fait le code html suivant :
<div id="avatar">
	<h3>Image perso :</h3>
	<form method="post" enctype="multipart/form-data" action="index.php?page=personnage" onsubmit="return verif_avatar()">
		<input type="hidden" name="act" value="avatar" />
		<p class="centre"><img src="images/avatars/{avatar}" title="Votre avatar actuel" alt="avatar" /></p>
		<p><label for="avatar">Modifier votre avatar :</label></p>
		<p><input type="file" name="image" id="image" /></p>
		<p class="centre"><input type="submit" name="submit" value="Modifier!" /></p>
	</form>
</div>

<div id="perso">
	<h3>Personnage</h3>
	<p class="centre">
		<img src="images/fleche_gauche.jpg" title="precedent" alt="<<" />
		<img src="images/persos/{perso}" title="votre personnage" alt="personnage" />
		<img src="image/flecge_droite.jpg" title="suivant" alt=">>" />
	</p>
	<p>{perso}</p>
	<p>{poste}</p>
</div>

<div id="test">
	Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Sed hendrerit. Vivamus mollis. Cras sit amet metus ac urna tincidunt varius. Suspendisse at magna in mauris convallis tempus. Morbi eget massa. Suspendisse suscipit. Vestibulum ligula felis, gravida et, pharetra eget, pulvinar at, augue. Ut at pede sit amet turpis dictum molestie. In auctor porta mi. Cras ligula. Aenean erat nunc, lobortis pretium, egestas sed, viverra ac, nibh. Morbi eget lacus sed ipsum dignissim lacinia. Curabitur et justo. Praesent adipiscing enim non mauris. Ut suscipit tristique nibh. Cras dictum, metus vel aliquam ullamcorper, lorem erat dapibus magna, at fermentum mauris nibh non quam. In odio. Maecenas dictum pharetra tortor. Duis dapibus dolor et justo.
</div>


Mais vous allez rire... ca marche pas ^^, le probleme c'est qu'il ne fait pas le flottement si je ne met float:left que pour le bloc #avatar mais si je le met directement pour les deux le troisieme bloc va aussi se mettre à la gauche du bloc #personnage, j'ai donc essayé de mettre le bloc #test en clear:both; mais il clear beaucoup trop Smiley biggol vu qu'au final le bloc se met bien en dessous des deux autres blocs mais egalement en dessous du bloc menu :s genre ca : [URL=http://img140.imageshack.us/my.php?image=sanstitre9la.jpg][IMG]http://img140.imageshack.us/img140/663/sanstitre9la.th.jpg[/IMG][/URL]

Quelqu'un saurait me dire pourquoi ca fait ca ? :'(
Merci d'avance =)
Modifié par Palleas (30 Apr 2006 - 11:20)
Palleas a écrit :
Quelqu'un saurait me dire pourquoi ca fait ca ? :'(

Il me semble que c'est la gestion normale du clear. Le bloc en clear descend en dessous de tous les blocs flottants se touvant à sa gauche et/ou à sa droite (même si j'avoue ne pas savoir très exactement ce que signifie gauche et droite dans l'interprétation qu'en font les navigateurs). Le menu est flottant, et il est à gauche, donc on passe à la ligne.

Tu peux essayer en clear: right; voir ce que ça donne, mais j'ai peur que ça ne prenne pas en compte le bloc flottant à gauche. À tester quand même.

Sinon, il me semble que sur Blog & Blues Laurent Denis a un article un peu compliqué sur la question du clear et du contexte de formatage de bloc. Cf google ou autre pour retrouver la référence.

Tu peux aussi, peut-être, ruser en plaçant ce troisième bloc en flottant, avec une largeur de 100%. Il ne tiendra pas, et passera à la ligne. Mais j'éviterais ce genre de bidouillages si je voulais pas que ça me revienne dans la figure tôt ou tard.

À noter que la largeur fixée à 100% résoudra le problème dans IE (en exploitant un bug d'IE Win, lié au HasLayout – cf Laurent Denis, le concept de HasLayout dans IE Win). Pour les autres navigateurs, je me demande si un jeu sur le overflow ne serait pas efficace. À tester avec un overflow: auto;.

Si la page en ligne avait été complète, j'aurais pu tester en live, mais là tu vas devoir vérifier par toi-même. Smiley smile
Palleas a écrit :
conteneur {
{header}
{menu}
{page}
}

C'est sympa de présenter les choses comme ça, on comprend bien la structure. Smiley biggrin

Une ou deux remarques :
#header {
	width:100%; /* À priori inutile. La largeur d'un élément de type bloc en positionnement statique ou relatif est 100% de la place disponible. */
	height:195px;
}
#page {
	width:560px; /* A priori inutile. La largeur sera automatiquement toute la largeur disponible moins les 180px de marge à gauche. */
	margin-top:10px;
	margin-left:180px;
}
merci de ta reponse =)
pour tester c'est : ici mais pour que tout marche il faut se loguer vite fait à coté avec :

pseudo : test
mdp: alsacreations

Si jamais ca aide :$
Merci beaucoup d'avance, j'dois m'avouer un peu paumé dans tout ca :s
Modifié par Palleas (29 Apr 2006 - 23:47)
Je te propose ceci :
#avatar, #perso {
	width:245px;
	height:260px;
	padding-left:5px;
	margin-right:18px;
	border:1px solid white;
	float: right;
}
[...]
#test {
	clear: right;
	border:1px solid white;
}

Au passage j'ai viré les choses pas utiles et simplifié un peu l'écriture.
Testé uniquement sur Firefox (où ça marche bien).

Le principe : on fait un clear: right; pour passer à la ligne des flottants situés à droite. Situé à droite, je ne sais pas si ça signifie "géographiquement" à droite ou en float: right; (ou une combinaison des deux), mais le clear: right n'est pris en compte que si les deux flottants sont en float right.

On ne peut pas faire de clear both ou left, car cela prendrait en compte le menu flottant.