J'ai un div
avec un positionnement par défaut (c'est-à-dire position:static
) et un div
avec une position fixed
.
Si je règle les z-index des éléments, il semble impossible de faire passer l'élément fixe derrière l'élément statique.
#over {
width: 600px;
z-index: 10;
}
#under {
position: fixed;
top: 5px;
width: 420px;
left: 20px;
border: 1px solid;
height: 10%;
background: #fff;
z-index: 1;
}
<!DOCTYPE html>
<html>
<body>
<div id="over">
Hello Hello HelloHelloHelloHelloHello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello
</div>
<div id="under">
</div>
</body>
</html>
Ou sur jsfiddle ici: http://jsfiddle.net/mhFxf/
Je peux contourner ce problème en utilisant position:absolute
sur l'élément statique, mais quelqu'un peut-il me dire pourquoi cela se produit?
(Il semble y avoir une question similaire à celle-ci, ( Positionnement fixe cassant l'indice z ) mais elle n'a pas de réponse satisfaisante, c'est pourquoi je pose la question ici avec l'exemple de code)
Cette question peut être résolue de plusieurs manières, mais en réalité, connaître les règles d'empilement vous permet de trouver la meilleure réponse qui vous convient.
L'élément <html>
est votre seul contexte d'empilement. Il vous suffit donc de suivre les règles d'empilement dans un contexte d'empilement pour voir que les éléments sont empilés dans cet ordre.
- L'élément racine du contexte d'empilement (l'élément
<html>
dans ce cas)- Éléments positionnés (et leurs enfants) avec des valeurs d'indice z négatives (les valeurs les plus élevées sont empilées devant les valeurs les plus basses; les éléments avec la même valeur sont empilés selon l'apparence dans le code HTML)
- Éléments non positionnés (classés par apparence dans le code HTML)
- Éléments positionnés (et leurs enfants) avec une valeur z-index de auto (classés par apparence dans le code HTML)
- Éléments positionnés (et leurs enfants) avec des valeurs d'indice z positives (les valeurs les plus élevées sont empilées devant les valeurs les plus basses; les éléments avec la même valeur sont empilés en fonction de l'apparence dans le code HTML)
Afin que vous puissiez
#under
positionné -ve z-index apparaissent derrière l'élément #over
non positionné#over
sur relative
pour que la règle 5 lui soit appliquéeLes développeurs doivent connaître les éléments suivants avant d'essayer de modifier l'ordre d'empilement des éléments.
<html>
est l’élément racine et constitue le premier contexte de superposition.Les règles de contexte d'empilement et d'ordre d'empilement ci-dessous proviennent de ce lien
<html>
)L'ordre des éléments:
<html>
est le seul contexte d'empilement par défaut, mais tout élément peut être un élément racine pour un contexte d'empilement, voir les règles ci-dessus) Ajouter position: relative;
à #over
#over {
width: 600px;
z-index: 10;
position: relative;
}
#under {
position: fixed;
top: 5px;
width: 420px;
left: 20px;
border: 1px solid;
height: 10%;
background: #fff;
z-index: 1;
}
<!DOCTYPE html>
<html>
<body>
<div id="over">
Hello Hello HelloHelloHelloHelloHello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello
</div>
<div id="under"></div>
</body>
</html>
z-index ne fonctionne que dans un contexte particulier, à savoir relative
, fixed
ou absolute
position.
z-index pour un div relatif n'a rien à voir avec le z-index
d'un div absolu ou fixe.
EDIT C'est une réponse incomplète. Cette réponse fournit de fausses informations. Veuillez consulter le commentaire et l'exemple de @ Dansingerman ci-dessous.
puisque votre over
div n'a pas de positionnement, le z-index ne sait pas où et comment le positionner (et par rapport à quoi?). Changez simplement la position de votre over div en relative, afin qu’il n’y ait aucun effet secondaire sur cette div et que le div div obéit à votre volonté.
voici votre exemple sur jsfiddle: Fiddle
edit : Je vois déjà quelqu'un qui a mentionné cette réponse!
Donnez au #under
un z-index
négatif, par exemple. -1
Cela est dû au fait que la propriété z-index
est ignorée dans position: static;
, qui se trouve être la valeur par défaut. Donc, dans le code CSS que vous avez écrit, z-index
est 1
pour les deux éléments, quelle que soit la hauteur que vous avez définie dans #over
.
En attribuant une valeur négative à #under
, il se trouvera derrière tout élément z-index: 1;
, c.-à-d. #over
.
Je construisais un menu de navigation. J'ai overflow: hidden
dans le css de mon navigateur qui cachait tout. Je pensais que c'était un problème d'index z, mais en réalité je cachais tout en dehors de ma navigation.
Lorsque des éléments sont positionnés en dehors du flux normal, ils peuvent chevaucher d'autres éléments.
selon la section sur les éléments se chevauchant sur http://web.archive.org/web/20130501103219/http://w3schools.com/css/css_positioning.asp
le comportement des éléments fixes (et des éléments absolus) tels que définis dans CSS Spec:
Ils se comportent comme ils sont détachés du document et placés dans le parent positionné fixe/absolu le plus proche. (pas une citation mot à mot)
Cela complique un peu le calcul zindex. J'ai résolu mon problème (même situation) en créant de manière dynamique un conteneur dans un élément body et en déplaçant tous ces éléments (classés comme "my-fixed-ones" dans cet élément de niveau corporel). )