28173 sujets

CSS et mise en forme, CSS3

Salut.

Un petit problème de z-index sur IE 6 et 7.

J'ai une liste d'items (ici les p) en position:relative et, à l'intérieur de chacun, un span en position:absolue.

Et malgré un z-index sur ces span, sur IE, ils passent sous les autres items.

Voici le code très simplifié:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Document sans nom</title>
<style type="text/css">
	p	{ position:relative; margin:0; background-color:#FFFF00; margin:2px; }
	span	{ position:absolute; left:20px; top:10px; background-color:#FF0000; z-index:20; }
</style>
</head>

<body>

<div>
	<p>Item1
		<span>du texte, <br />du texte, du texte</span>
	</p>
	<p>Item2
	</p>
</div>
</body>
</html>


Et une image:
upload/9971-firefox.jpg upload/9971-ie.jpg

Merci de votre aide.
Salut,
As-tu essayé de mettre aussi un z-index inférieur sur le p en commentaire conditionnel ? (Bon je peux pas tester j'ai pas d'IE sous la main).
Bonjour,

Un peu tarabiscoté mais ça dépanne !!
Le truc c'est de positionner en relative une balise de référence qui ne soit pas "visible" car IE ne sait pas "passer par dessus" en absolute dans ce cas Smiley biggol
<style type="text/css">
	#conteneur{
	width: 300px;
	border: 1px solid black;
	}

	em{
	display: block;
	position:relative;
	}

	p{ 
 	margin:0; 
	background-color: lime; 
	margin:2px;
	}
	
	span{ 
	position:absolute; 
	left:20px; 
	top:-10px; 
	background-color:#FF0000;
	}

</style>
</head>
<body>
<div id="conteneur">
	<p>Item1<em><span>du texte, <br />du texte, du texte</span></em></p>
	<p>Item2<em><span></span></em></p>
	<p>Item3<em><span>du texte, <br />du texte, du texte</span></em></p>
	<p>Item4<em><span></span></em></p>
</div>
</body>
zzzazzz > Le z-index ne change malheureusement rien dans ce cas.

ghost > Merci ça a l'air ok. Par contre sait-on pourquoi IE n'arrive pas à suivre les autres navigateurs? Ou du moins sait-on précisément quelle association de propriété provoque ce comportement? C'est la 3e fois que je tombe sur ce cas en 1 mois.
Modifié par <nicolas> (13 Jun 2007 - 08:41)
Bonjour,

Personnellement, je n'ai rien trouvé, j'ai juste procédé à une série de tests pour comprendre et contourner ce problème qui d'ailleurs n'est pas unique avec le positionnement absolute et IE.
Modérateur
bonsoir,

le problème , ou spécificité de IE est bien au niveau du position:relative;

Cette règle n'a pas seulement pour effet de donné en référence de positionnement un parent dans IE mais force son affichage a l'avant plan ...

IE dessine les éléments html les un après les autres en superpositionnant les derniers (dans le flux) sur les précédents , quand les autres navigateurs font l'opposé.
Testez 2 élément block se suivant avec un fond de couleur différente et appliqués des marges négatives verticales , celui qui passe au dessus de l'autre n'est pas le même dans IE !
Si de plus rapport au comportement naturel de IE ou ajoute un position : relative; la difference est alors fixe/certaine pour de bon sur les element enfants positionné en absolue . Ces élémnts n'iront pas s'affiché a un niveau superieur que celui du parent pris en reference (<p> dans ton cas et pas <body> ).
Chaque element sera cloisoné dans le niveau d'affichage de son parent "relatif".

Pour eviter cette difference de "niveau" d'affichage du au position relative , dans ce cas , on peut tout simplement l'omettre et passer les top et left en margin-top et margin-left.

Un element positionné en absolue et sans coordonées va s'afficher et etre extrait du flux de la page a l'endroit ou il se trouve dans le code/flux html .

exemple de ton code sans le position relatif sur le parent :
<!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'>
	p	{  margin:0; background-color:#FFFF00; margin:2px;}

	span	{ position:absolute; margin-left:20px; margin-top:10px; background-color:#FF0000;  }
</style>
</head>
<body>
<div>
	<p>Item1
		<span>du texte, <br />du texte, du texte</span>
	</p>
	<p>Item2
	</p>
</div>
</body>
</html>

(ceci est sans surprises sans regle text-align:center)

... Attention tout de même à la régle : text-align:center; par exemple qui serait appliqué a l'un des element parent . Dans IE , cette regles se comporte comme si une balise : <center> avait etait introduite , du coup l'element en absolue affichera son coin gauche en fonction de cette regle. gauche , centre ou droite sans prendre en consideration la taille (largeur , ..) de l'element vu qu'il est en absolute;, un text align:right; affichera le coin gauche de l'element positionné en absolue a l'extreme droite du parent , ce qui rendrait le span totalement invisble(en dehors de la zone d'affichage) dans ton exemple..

Pour positionner alors cette element en absolue sans coordonnées il faut alors "evité ou surchargé" de maniere adequate la regle text-align:center; (ou right) pour avoir un rendu / positionnement assez similaire dans IE , en tout cas sans etre "embété " par un probleme ressemblant a du z-index .
Ceci dit le positionnement relatif n'est pas a bannir dans IE et a ses avantages dans d'autre cas , où justement l'affichage de l'element en absolu ne se fait pas toujours exactement a l'endroit attendu (retour ou pas a la ligne ?).

GC
Modifié par gcyrillus (13 Jun 2007 - 21:39)
Et bien... merci pour cette réponse détaillée.

J'ignorais qu'il y avait de si grandes différences dans l'empilement des éléments.

Juste une dernière question, tu me proposes de ne pas déclarer le position:relative. Cependant, cela me semble un peu moins robuste, non? Du coup, n'ai-je pas meilleur temps de déclarer une position:relative pour tous les navigateurs, et une position:static seulement pour IE?
<nicolas> a écrit :

Juste une dernière question, tu me proposes de ne pas déclarer le position:relative. Cependant, cela me semble un peu moins robuste, non? Du coup, n'ai-je pas meilleur temps de déclarer une position:relative pour tous les navigateurs, et une position:static seulement pour IE?


Bonjour,
Que tu choisisses une position: static poue IE et relative pour les navigateurs alternatif n'améliorera en rien la robustesse de l'ensemble puisque le top et height ont été remplacés par des marges et que par conséquent le position:ralatif n'aura plus lieu d'être.

Tout dépendra de ce que tu souhaites faire au final.
L'endroit ou s'affichera le span rouge devrait-il rester inchangé quelque soit le contenu du <p> conteneur ou dépendre de ce contenu?

La solution proposée par Gcyrillus ne fonctionnera que dans le premier cas
puisque les marge appliquées au span prendront comme point de référence,
la position du span dans le flux et non le coin haut gauche du paragraphe conteneur.
Modifié par Hermann (14 Jun 2007 - 12:48)
Modérateur
bonsoir ,

en effets ,

... robustesse d'une technique ou technique "générique" qui passe partout ne sont pas forcement synonymes... les tableau ont un coté "robustes" pour la mise en page Smiley smile , les commentaires conditionnels sont intéressant , mais aussi difficile a maintenir au cours du temps , alors , au cas par cas une soluce qui passe là ou il faut est peut-être plus simple a maintenir (aussi , un commentaire dans le css pour mettre en garde sur le comportement ou CC pour IE attirera l'attention )

La proposition faite pour ce cas montre que il y a toujours plusieurs façon de faire. ... mais laquelle choisir ? En fait une fois que l'on comprend mieux le comportement "différent" de IE , le choix devient plus aisé.

Pour reprendre l'exemple que j'ai donné plus haut , on pouvait aussi garder les coordonnées horizontales et n'appliquer la marge que sur le positionnement vertical.
Pour reprendre l'idée du text-align:center ; qui peut faire bugger.

<!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>pour test visuels IE/ff (windows)</title>
<style type='text/css'>
	p	{ margin:0; background-color:#FFFF00; margin:2px;
	}
	span	{ display:block;position:absolute; left:20px; margin-top:10px; background-color:#FF0000;  }
	div {position:relative;text-align:center;height:1%}
	.relatif {position:relative;}


</style>
</head>
<body>
<div>
	<p >Item1
	du texte dans le flux et un br ici:<br />	<span>du texte, <br />du texte, du texte</span>
	< br /> : <br />du texte dans le flux sans br	<span>du texte, <br />du texte, du texte</span>
	</p>
	<p class="relatif">Item2 positionner en relatif relatif .
	</p>
	<p>Item1
	du texte dans le flux et un span en absolu et display:block; hérésie ? sans < br /> devant:
	<span class="block">du texte, <br />du texte, du texte</span>
	</p>
</div>
</body>
</html>


En fait ce second exemple est un peu plus tordue ou met en évidence d'autres comportements et d'autre possibilités (text-align pour IE "debuggé").

1) IE et le layout
Sans layout sur un des parents ou prédécesseurs , IE positionne l'élément en absolue en fonction de la regle text-align applicable (defaut = left si rien de specifié aux parents).height:1% appliqué au div conteneur ou au premier paragraphe va renvoyé les span a gauche comme prévu, effet du layout qui rend IE en mesure de positionné les éléments correctement à l'ecran.

2) le position relative ... tient le second paragraphe déborde aussi dans FF ??

3) appliquons un display block au travers du css. tiens , ff décale les élément en absolue , mais ne passe pas dans IE .. (a éviter donc de laisser trainé).

sinon en reprenant ton premier exemple , en modifiant quelque peu le css avec un position relatif au parent commun (le div) , un left et un margin top au span , plus aussi une touche de layout pour IE (encore au div ) le css pourrait aussi devenir ça et te donner un résultat acceptable :

	p	{ margin:0; background-color:#FFFF00; margin:2px; }
	span	{ position:absolute; left:20px; margin-top:10px; background-color:#FF0000; z-index:20; }
	div 	{ position:relative; height:1%;text-align:center;}

(pour l'exemple donné de ton premier post).

En fait plein de choix et d'approches différentes ,et basé/testé sur 2/3 navigateurs seulement Smiley smile , l'important est surtout d'aller au plus simple et de bien observé les comportements d'IE pour en tirer parties ou les evités. (opinion d'amateur qui n'engage que moi) .

... C'etait le position relatif au mauvais endroit qui faisait buggé ton gabarit dans IE .

a plus