28173 sujets

CSS et mise en forme, CSS3

a écrit :

<style>
.allie { background-color:green;}
.allie .allie_haut{ height:18px; line-height:20px;font-size:15px; text-align:center;}
.allie .allie_corps{ background-color:yellow; font-size:12px; }
.corps_gauche{ width:250px;float:left; }
.corps_droite{ margin-left:257px; padding:3px; }
.allie .allie_bas{height:20px; line-height:20px;font-size:11px; padding:0 2px 0 5px; }
</style>

<div class="allie">

<div class="allie_haut">Haut</div>

<div class="allie_corps">
<div class="corps_gauche">
<img src="http://overgame.com/images/overgame/labels/2006/november/20092_m.jpg">
</div>

<div class="corps_droite">
Blabla bla bl AaaBlabla bla bl AaaBlabla bla bla bla bl AaaBlabla bla bl AaaBlabla bla bl
a bla bl AaaBlabla bla bl AaaBlabl bla bl AaaBlabla bla bl AaaBlabla bla bl
a bla bl AaaBlabla bla bl AaaBlabla bla bla bla bl AaaBlabla bla bl AaaBlabla bla bl
a bla bl AaaBlabla bla bl AaaBlabla bla bl
a bla bl AaaBlabla bla bl AaaBlabla bla bla bla bl AaaBlabla bla bl AaaBlabla bla bl
a bla bl AaaBlabla blaa bl AaaBlaaBlabla bla bl AaaBlabla bla bl
a bla bl AaaBlabla bla bl AaaBlabla bla blaaBlabla bla bl AaaBlabla bla bl
a bla bl AaaBlabla bla AaaBlabla bla bl AaaaBlabla bla bl
a bla bl AaaBlabla bla bl AaaBlabla bla bla bla bl AaaBlabla bla bl AaaBlabla bla bl
a bla bl AaaBlabla bla bl AaaBlabla bla bla bla bl AaaBlabla bla bl AaaBlabla bla bl
a bla bl AaaBlabla bla bl AaaBlabla bla bla bla bl AaaBlabla bla bl AaaBlabla bla bl
</div>
</div>
<div class="allie_bas">Bas</div>
</div>


J'ai essayer des tas de combinaison ... Ce que je peut essayer, c'est de retirer corps_gauche pour ne laisser que l'image ... Il faut que dans tout les cas, il faut que l'image soit à gauche, le texte à droite et qu'il y est une ligne au centre.

Si il y a des pro du vertical align ...


Sur l'image, le texte est pile poil de la même taille que l'image, donc aucun problème

Si le texte est plus grand que l'image, l'image reste "collé" en haut.
http://img95.imageshack.us/img95/8247/sanstitreip5.png


Si le texte est plus petit, l'image déborde en bas.
http://img166.imageshack.us/img166/5567/sanstitredj9.png


Je peut totalement changer la structure si il le faut.
Modifié par SpaceCowboy (27 Nov 2006 - 12:41)
Exemple, en ajoutant
table-cell;vertical-align: middle; à allie_corps permet à l'image de ne plus déborder quand le texte est plus petit, mais ca ne la centre pas du tout étant donné que la taille de la partie gauche varie en hauteur ...

Donc, quand le texte (partie droite) est plus grande que l'image (partie gauche), l'image est toujours collé en haut.
Modifié par SpaceCowboy (23 Nov 2006 - 09:50)
SpaceCowboy a écrit :
Exemple, en ajoutant
table-cell;vertical-align: middle; à allie_corps permet à l'image de ne plus déborder quand le texte est plus petit, mais ca ne la centre pas du tout étant donné que la taille de la partie gauche varie en hauteur ...

Donc, quand le texte (partie droite) est plus grande que l'image (partie gauche), l'image est toujours collé en haut.
Tu veux dire en utilisant
display: table-cell;
? cette propriété n'est pas supportée par IE (jusqu'à la version 6 en tous cas), mais ça devrait fonctionner dans Firefox & Opera ...

Sinon, le plus simple reste d'utiliser un tableau à 2 cellules.
oui le plus simple est d'utiliser un tableau si l'image doit être une image de contenu, donc un element <img />

Si par contre l'image ne sert qu'au design et à la déco, tu peux la passer en background css et l'aligner verticalement facilement comme ceci :


background-position:0 50%;
MrPatate a écrit :
oui le plus simple est d'utiliser un tableau si l'image doit être une image de contenu, donc un element <img />

Si par contre l'image ne sert qu'au design et à la déco, tu peux la passer en background css et l'aligner verticalement facilement comme ceci :


background-position:0 50%;

C'est une bonne idée ! sauf que cette structure est affiché des dizaines de fois dans des dizaines de pages ...
Je pourrait intégrer le code CSS dans l'html, mais je veut eviter aussi.

Sopo a écrit :
Tu veux dire en utilisant
display: table-cell;
? cette propriété n'est pas supportée par IE (jusqu'à la version 6 en tous cas), mais ça devrait fonctionner dans Firefox & Opera ...

Sinon, le plus simple reste d'utiliser un tableau à 2 cellules.
J'ai effectivement oublié le display.
Auparavant c'était en tableau, j'aimerais justement m'en séparer.
Modifié par SpaceCowboy (23 Nov 2006 - 10:58)
Tu peux (dois) utiliser background-position dans ta feuille de style. Par contre, pour center l'image de fond, j'utiliserais plutôt
background-position: 0 center;
J'ai une feuille de style et des centaine de structure, je fait comment ?
En mettant l'image en background, mais ca reviens à mettre du code CSS dans le code HTML. Ce qui est mal !
SpaceCowboy a écrit :
Auparavant c'était en tableau, j'aimerais justement m'en séparer.

Un simple tableau de mise en forme à deux cellules, codé correctement -- et sans excès du type cellules vides, tableaux imbriqués, etc. --, est tout à fait accessible.

Le frein principal, c'est que l'on fige dans le code HTML un élément de mise en forme, ce qui en soi n'est pas « mal », mais qui a des conséquences pratiques potentiellement gênantes : s'il n'est pas possible de modifier des pages anciennes (via la modification d'un template) lors d'une refonte graphique, on sera obligé de garder cette structure à deux cellules, ce qui empêche de mettre l'image à droite, ou au dessus, etc.

Pensez conséquences pratiques plutôt que « létabloçapucéleumal ». L'utilisation réfléchie d'un tableau vaut mieux que l'utilisation mal contrôlée (et aux conséquences peu claires) d'une bidouille.

Voili, voilou...
Quand j'ai des données tabulaire, j'utilise un tableau. Mais ici je pensé pouvoir m'en séparer pour n'avoir que du xhtml ...

Les tableaux c'est mal ! surtout à deux cellules...
Modérateur
bonjour,

une page test , deja proposé , qui se suffira de ta configuration html que tu as deja.
http://gcyrillus.free.fr/trucs_css/vertical_align_middle_block.html

Un topic similaire ou une solution sans tableau est donné :
http://forum.alsacreations.com/topic-4-19089-1-Center-verticalement-un-bloc-de-taille-relative.html

Maintenant si le tableau est justifié , pourquoi s'en passer ?

<edit> Je ne considere pas ces methode proposée comme des bidouilles , il n'est pas nouveau que IE se comporte differement , .... Microsoft , nous a pondu les commentaires conditionnels au cas ou on ne coderais pas avec front-page ceci est un Smiley cligne mais pas un troll Smiley smile .
</edit>
Modifié par gcyrillus (23 Nov 2006 - 15:00)
Deux cellules, ce n'est pas vraiment un tableau. Si je ne trouve vraiment aucune solution alors je ferais un tableau de deux cellules ...
Modérateur
bonsoir,

En admettant que tu veuilles afiché ton image et son texte dans une zone qui a une taille predeterminé en largeur (em , pixel , % , etc .. , le tout est de ne pas melangé les unités de mesures ), admettons donc : 700px (706 c'est ton screen )

Il est possible d'utiliser le display:table-cell ;(comme tu en as parlé ) pour les navigateurs recent et de
fournir a IE 2 autres lignes css .

ex:
<!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>
<title>XHTML 1.0 Strict</title>
<style type='text/css'>
.allie { 
background-color:green;
}
.allie .allie_haut{
	height:18px; 
	line-height:20px;
	font-size:15px; 
	text-align:center;
}
.allie .allie_corps{ 
	background-color:yellow; 
	font-size:12px; 
				display:table;
}
.allie {
		width:700px; /* IE ne peut se passer de valeur de taille */
}
.corps_gauche{ 
	width:250px;
			display:table-cell;
			vertical-align:middle;
	text-align:center;
}
.corps_droite{ 
			display:table-cell;
			vertical-align:middle; 
	padding:3px; 
	width:444px;
}
.allie .allie_bas{
	height:20px; 
	line-height:20px;
	font-size:11px; 
	padding:0 2px 0 5px; 
}
</style>
<!--[if IE ]>
<style type="text/css">
.corps_droite , .corps_gauche {
	display:inline;		/* les elements en ligne s'aligne les uns par rapports aux autres ! */
	zoom:1; 		/* un coup de haslayout pour  garder les dimensions ! */
}
</style>
<![endif]--> 
</head>
<body>
</style>
<div class="allie">
	<div class="allie_haut">Haut</div>
	<div class="allie_corps">
		<div class="corps_gauche">
			<img src="http://overgame.com/images/overgame/labels/2006/november/20092_m.jpg">
		</div>
		<div class="corps_droite">
Blabla bla bl AaaBlabla bla bl AaaBlabla bla bla bla bl AaaBlabla bla bl AaaBlabla bla bl
a bla bl AaaBlabla bla bl AaaBlabl bla bl AaaBlabla bla bl AaaBlabla bla bl
a bla bl AaaBlabla bla bl AaaBlabla bla bla bla bl AaaBlabla bla bl AaaBlabla bla bl
a bla bl AaaBlabla bla bl AaaBlabla bla bl
a bla bl AaaBlabla bla bl AaaBlabla bla bla bla bl AaaBlabla bla bl AaaBlabla bla bl
a bla bl AaaBlabla blaa bl AaaBlaaBlabla bla bl AaaBlabla bla bl
a bla bl AaaBlabla bla bl AaaBlabla bla blaaBlabla bla bl AaaBlabla bla bl
a bla bl AaaBlabla bla AaaBlabla bla bl AaaaBlabla bla bl
a bla bl AaaBlabla bla bl AaaBlabla bla bla bla bl AaaBlabla bla bl AaaBlabla bla bl
a bla bl AaaBlabla bla bl AaaBlabla bla bla bla bl AaaBlabla bla bl AaaBlabla bla bl
a bla bl AaaBlabla bla bl AaaBlabla bla bla bla bl AaaBlabla bla bl AaaBlabla bla bl
		</div>
	</div>
	<div class="allie_bas">Bas</div>
</div>
</body>
</html>


On voit que l'alternative pour IE n'a rien d'une bidouille super compliqué ni super bancale.


Par contre en fluide (en largeur) et sans dimension IE sera difficile a maitrisé Smiley smile , d'ailleurs il faudrait aussi dans une configuration (100% largeur de la fenêtre ) penser a un min-width eventuellement . donc la debut de bidouille (javascript ) pour les IE inferieur a la version 7.

++



<edit>

ah oui , malgré tout il y a une difference entre ce que rend IE et les autres , pour la visualiser essayez ceci en plus :

.corps_droite , .corps_gauche {
background:red;
}


Quand au comportement des width ou height considerées comme des valeurs minimale par IE , il faut peut-etre aussi s'assurer d'un
.corps_droite , .corps_gauche {
overflow-x:hidden;
}

pour eviter un eventuel retour a laligne intempestif pour une image exedents les 250px de largeur ou une chaine de caracteres deseperement longue .
Modifié par gcyrillus (23 Nov 2006 - 22:47)
Ca fonctionne très bien, sous IE ou sous Firefox.

Par contre, j'aimerais mettre à gauche des images d'au maximum 300px.
comment je fait ?
Sous Firefox, facile. ..
Pour IE, j'ai fait ca, et apparament ca fonctionne.

.corps_gauche{ width:310px; display:table-cell; vertical-align:middle; text-align:center; }
.corps_droite{ display:table-cell; vertical-align:middle; padding:3px; width:374px; }


Par contre j'aimerais virer le middle à droite, ce qui n'a pas l'air possible ...

En conclusion, je vais faire un tableau, ca sera plus simple pour tout le monde ...
Modérateur
bonjour,

?? hmmm , le vertical-align: top , middle ou bottom ; est assigné par le css
, il suffit que tu indique la valeur que tu veut ...

( a propos quelque valeurs pour le vertical-align:
http://www.laltruiste.com/document.php?url=http://www.laltruiste.com/courscss/texteverticalalign.html )

et reprendre le cas de IE !

LEs 2 elements côte à cote doivent recevoir un vertical-align de même
valeur pour que cela reste coherent visuellement .

Oui mais comment faire pour qu'un text-court s'aligne en haut et que
l'image s'aligne au milieu si le texte s'aggrandi ? si je ne peut pas specifier des valeurs differentes ! .

On peut alors déterminé une hauteur minimale a ce block (passé en ligne
et layout activé ici dans l'exemple).Le texte contenu dans ce block
commencera a s'afficher des "l'ouverture de la balise " (<div>texte ....).

En reprenant ton image d'exemple je prends alors 100px de hauteur
minimale (l'ideale serait de prendre en reference la hauteur de chaque
image pour chaque test , en pratique un compromis acceptable serait de
prendre la moins haute de la page en reference pour ne pas trop "cassé"
l'aspect visuel .(je ne pense pas que tu souhaite affiché des images tres
hautes ).

Maintenant je propose alors un min-height a IE7 dans le css commun ,
puis un height dans le css dédié a IE6 et inferieurs.

Le min-height est sans effets sur un element en display:table-cell;
Il n'est donc utile que pour IE7 .


Ce qui me donne alors en page de test :



<!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>
<title>XHTML 1.0 Strict</title>
<style type='text/css'>
body {
	background:#9E9F5E;
	color:#6F6F42;
}
h1 , h2  {
	width:700px;
	margin:1em auto;
	text-align:center;
	background:#FEFF67;
	border:0.3em solid #469F45;
	border-left:0.5em double #469F45;
	border-right:0.5em double #469F45;
}
.allie { 
background-color:green;
}
.allie .allie_haut{
	height:18px; 
	line-height:20px;
	font-size:15px; 
	text-align:center;
}
.allie .allie_corps{ 
	background-color:yellow; 
	font-size:12px; 
	display:table;
}
.allie {
	width:700px; /* IE ne peut se passer de valeur de taille */
	margin:1em auto;
}
.corps_gauche{ 
	width:300px;
	display:table-cell;
	vertical-align:middle; 
	text-align:center;
}
.corps_droite{ 
	display:table-cell;
	vertical-align:top; 
	padding:3px; 
	width:394px;
	min-height:100px;
}

.allie .allie_bas{
	height:20px; 
	line-height:20px;
	font-size:11px; 
	padding:0 2px 0 5px; 
}
</style>
<!--[if IE ]>
<style type="text/css">
.corps_droite , .corps_gauche {
	display:inline;		/* les elements en ligne s'aligne les uns par rapports aux 

autres ! */
	zoom:1; 		/* un coup de haslayout pour  garder les dimensions ! */
}
.corps_droite{ 
	vertical-align:middle; 
}
</style>
<! endif --> 
<!--[if lte IE6 ]>
<style type="text/css">
.corps_droite { 
	height:100px; 
}
</style>
<! endif --> 
</head>
<body>
</style>
<h1><code>Vertical-align:middle;</code> sans tableaux.</h1>
<h2>Image et textes longs</h2>
<div class="allie">
	<div class="allie_haut">Haut</div>
	<div class="allie_corps">
		<div class="corps_gauche">
			<img 

src="http://overgame.com/images/overgame/labels/2006/november/20092_m.jpg">
		</div>
		<div class="corps_droite">
Blabla bla bl AaaBlabla bla bl AaaBlabla bla bla bla bl AaaBlabla bla bl AaaBlabla bla bl
a bla bl AaaBlabla bla bl AaaBlabl bla bl AaaBlabla bla bl AaaBlabla bla bl
a bla bl AaaBlabla bla bl AaaBlabla bla bla bla bl AaaBlabla bla bl AaaBlabla bla bl
a bla bl AaaBlabla bla bl AaaBlabla bla bl
a bla bl AaaBlabla bla bl AaaBlabla bla bla bla bl AaaBlabla bla bl AaaBlabla bla bl
a bla bl AaaBlabla blaa bl AaaBlaaBlabla bla bl AaaBlabla bla bl
a bla bl AaaBlabla bla bl AaaBlabla bla blaaBlabla bla bl AaaBlabla bla bl
a bla bl AaaBlabla bla AaaBlabla bla bl AaaaBlabla bla bl
a bla bl AaaBlabla bla bl AaaBlabla bla bla bla bl AaaBlabla bla bl AaaBlabla bla bl
a bla bl AaaBlabla bla bl AaaBlabla bla bla bla bl AaaBlabla bla bl AaaBlabla bla bl
a bla bl AaaBlabla bla bl AaaBlabla bla bla bla bl AaaBlabla bla bl AaaBlabla bla bl
		</div>
	</div>
	<div class="allie_bas">Bas</div>
</div>
<h2>Image et texte court</h2>
<div class="allie">
	<div class="allie_haut">Haut</div>
	<div class="allie_corps">
		<div class="corps_gauche">
			<img 

src="http://overgame.com/images/overgame/labels/2006/november/20092_m.jpg">
		</div>
		<div class="corps_droite">
Blabla bla bl AaaBlabla bla bl AaaBlabla bla bla bla bl AaaBlabla bla bl AaaBlabla bla bl

		</div>
	</div>
	<div class="allie_bas">Bas</div>
</div>
</body>



Tiens , un exemple qui demontre l'utilité de ces drole de commentaires
conditionnels , on peut donc gerer le min-height sans hacks ,pour
FF/Opera/... , IE6-5 et IE7.

(a propos d'IE5 , il ne supporte pas le zoom:1; il faudra se repporter sur
une autre regles css pour activé le layout ou se repporté sur les float et
oublié l'alignement vertical:middle.)

++

<edit>

Si j'insite a te proposer une methode sans table , ce n'est pas pour t'y convertir.

Dans ton cas je crois même que le tableau est preconisé , il s'agit de données affichable en tableau , la page actuelle du site ou tu met ton lien en exemple , presente plusieurs images et texte (de legende ) disposés en ligne . 2 colonnes , 1colonnes images et 1 colonnes "legendes" , chaque colonne se completent.

Non , si je reviens , c'est pour bien insisté sur le fait que le vertical-align ; display inline et zoom (layout) ne copie / reproduits , pas la mise en forme du display :table et Cie des autres navigateurs.

Il s'agit dans IE de transformer des block en elements se comportant comme des elements inline , qui reposeront tous sur le même "baseline" , c'est donc quelque chose de totalement different ! .

Le plus haut de ces elements determinera la position de la ligne (interligne) de reference pour les autres , et les valeurs , top, middle, bottom , la se caleront dessus .
Ce qui ce centre alors n'est pas le texte contenu , mais le conteneur lui même et par rapports aux autres. Un seul conteneur ne ce centreras sur rien , a part que sur lui même Smiley decu , Smiley lol .

donc il n'y a pas de "simili display:table-cell;"dans IE . a part un vrai tableau.

Il faut donc apprehender la mise en forme dans ce contexte comme si chaque block devenait une image ou une balise inline avec des tailles de police differentes , et faire abstraction de ce qu'elles contiennent.

Il y a aussi le fait que lorsque l'on a etabli sa feuilles de style compatible tout navigateurs , sauf IE , on a bien du mal a dissocier , oublié ces regles au moment de faire le style qui va etre acceptable dans IE , ou de ne pas touché aux regles deja etablient et bonne ailleurs.

Une methode peut alors d'etre de mettre carrement les bonnes regles css entre commentaires et s'occuper de IE en recreant de toutes pieces les rêgles css , comme ça pas d'interference ou de confusion possibles .

Enfin quand c'est bon , on envoit ça dans les commentaires conditionnels.
Un petit commentaires dans la feuilles de style principal pour rappeller que tel portion de css a un equivalent ou alternative a part pour IE .

</edit>
Modifié par gcyrillus (27 Nov 2006 - 18:39)
Salut,
je sais bien que j'arrive comme un cheveu sur la soupe, mais je peux pas m'empêcher de faire la remarque suivante :
"Bon sang de bon soir!!! qu'est ce que vous pouvez vous compliquer la vie à vouloir absolument vous passer de tableau"
"Le mieux est l'ennemi du bien"