2009-04-28 6 views
13

J'ai la navigation suivante où .topNav a la position: relative et subnav a la position: absolute. Je ne peux pas obtenir la sous-liste à apparaître sur la liste principale en raison de problèmes z-index. Cela semble être un problème connu.IE z-index relatif/bug absolu dans la liste

<ul> 
<li class="topNav">About Us 
<ul class="subNav"><li> Subsection A</li><li>Subsection B</li></ul> 
</li> 
</ul> 

Est-ce que quelqu'un sait d'une solution de contournement?


MISE À JOUR http://brh.numbera.com/experiments/ie7_tests/zindex.html montre exacly le problème que j'ai. Mon affichage original était dans le contexte d'une liste mais j'ai réduit le problème au fait que z-index ne semble pas fonctionner quand avoir un élément avec position: absolu dans un élément parent avec la position: relative


+0

Qu'est-ce que les styles ressemblent ou sont-ils littéralement en train de définir la position? –

+0

ive j'ai tout enlevé des styles en dehors du positionnement car je me suis prouvé que c'est là que réside le problème – AJM

+0

Pourriez-vous nous expliquer un peu plus amplement l'effet que vous cherchez à obtenir s'il vous plaît. Vous voulez dire par dessus ou par dessus? – wheresrhys

Répondre

16

Voici un très bon article qui explique les problèmes d'empilement mentionnés par machineghost.

http://css-discuss.incutio.com/wiki/Overlapping_And_ZIndex

Ce que vous pouvez envisager (selon la raison pour laquelle vous êtes désireux de positionnement sur plusieurs éléments) est l'ajout d'un sélecteur de vol stationnaire à .base (utiliser JavaScript pour IE6) qui ajoute la classe pour lui donner relativité.

.base:hover{position:relative;} 

Cela signifie alors que le second ne .base pas position: relative. Stu Nicholls at CSSplay a un get CSS Based nav w/ 6 level drop down (peut être étendu à plus si nécessaire)

+0

super article, je pensais que j'ai compris z-index, mais je fais maintenant et j'ai résolu le problème. – AJM

+2

Je sais que c'est un vieux message - mais AJM vous dérangerait de partager votre solution, car je n'arrive pas à trouver le correctif pour le test .base css ci-dessus sur le site de Ben, tout en gardant les deux .base div comme position: relative . – TeckniX

+0

brillant, article brillant! Merci pour le partage – Dogoku

1

Ok, je pense que votre problème vient probablement d'un manque de compréhension sur le fonctionnement de z-index. La propriété z-index n'est pertinente que pour les éléments au même niveau dans la hiérarchie DOM. En d'autres termes, si vous avez:

<ul id="a"> 
    <li id="b">b</li> 
    <li id="c">c</li> 
</ul> 
<div id="d"></div> 

et « b » et « c » sont décorées de façon telle qu'elles se chevauchent, z-index déterminera que l'on finit par en haut. Cependant, si "c" et "d" se chevauchent, "d" sera toujours en haut, quel que soit l'index z de c, car les éléments qui sont plus proches du noeud DOM racine apparaîtront toujours au-dessus des éléments imbriqués Donc, tant que "subnNav" est un enfant de "topNav", je ne pense pas qu'il existe un moyen de le faire couvrir le contenu de ses parents. En d'autres termes, pour autant que je sache, il n'y a pas de solution à ce problème, sauf pour que "subNav" ne soit pas un enfant de "topNav".

(NOTE: Cela étant dit, CSS n'est pas simple, donc il peut toujours y avoir un moyen d'obtenir l'effet que vous voulez que je ne sache pas tout ce que je peux dire est que, selon ma compréhension de z-index et mes très bonnes connaissances générales en CSS, il n'y a aucun moyen que je connaisse.)

+2

Je fais du développement web depuis 15 ans et je n'ai jamais entendu dire que l'index z s'applique uniquement aux éléments de même niveau dans la hiérarchie DOM. Pouvez-vous citer une source ou une spécification qui l'indique? Je suis très curieux. –

+0

Je ne peux pas ... ou pour être plus précis, j'ai passé une minute sur Google, je suis devenu paresseux, et j'ai abandonné :-) Cependant, je peux faire un exemple qui "prouve" cela. Dans le code suivant, si vous supprimez les propriétés z-index, vous verrez une boîte verte dans le coin supérieur gauche, car a/b/c ont tous le même z-index (et c, qui est vert, vient dernier). Cependant, avec les z-index, vous verrez ... une boîte verte ... même si b (jaune) a un index z plus élevé que c; c toujours "l'emporte" sur b parce qu'il est plus haut dans l'arbre DOM. – machineghost

+0

machineghost

0

Cela fonctionne dans Internet Explorer IE5.5, IE6, IE7, Firefox, Opera et maintenant Safari, Netscape 8 et Mozilla.

1

ajouter

background: url(blank.gif); 

pour elemnts position absolue permet de résoudre le problème pour moi.MTBE il peut aide u 2 :)

concernant

0

Solution: assigner z-index par ordre décroissant

<div class="base" style="z-index:2"> 
<div class="inside"> 
    This has some more text in it. This also has a background. This should obscure the second block of text since it has a higher z-index. 
</div> 
This has some text in it. This has some text in it. This has some text in it. This has some text in it. This has some text in it. 
</div> 

<div class="base" style="z-index:1"> 
This is the second div. You should not be seeing this in front of the grey box. This has some text in it. This has some text in it. This has some text in it. This has some text in it. This has some text in it. This second box should be obscured by the grey box. 
</div> 
+0

Cela fonctionne pour les divs, mais l'op demande de styliser une liste. Je cours actuellement dans le même problème. – PeerBr

+0

la solution ci-dessus ne fonctionne pas dans IE7 en utilisant la même feuille de style CSS que sur http://brh.numbera.com/experiments/ie7_tests/zindex.html – TeckniX

1

J'ai eu le même problème et a pu le fixer dans IE6 et 7. La combinaison http://code.google.com/p/ie7-js/ avec le CSS suivant le problème a disparu. Avec mon problème, certains éléments d'une liste flottaient à gauche et une info-bulle apparaissait chaque fois que l'utilisateur survolait le li. Pour résoudre ce problème, j'Adde ceci:

.ul li:hover {position:relative;z-index:4;} .ul li:hover + li {position:relative;z-index:3;}

La façon dont cela fonctionne est à chaque fois que l'utilisateur passe au-dessus du premier LI par exemple, il définit la deuxième LI flottait à côté de lui à une valeur z-index inférieur. Vous pouvez bien sûr modifier les valeurs de l'index z pour répondre à vos propres besoins.

0

similaires à répondre par @Orhaan, définissant une propriété d'arrière-plan à l'élément absolu est la seule solution qui a fonctionné pour moi ...

background-color: rgba(0,0,0,0); 

Thanks Alex Leonoard

Questions connexes