2017-08-06 6 views
2

je le code HTML:Position: collante ne fonctionne pas

<div class="header"> 
<div class="desc">Description</div> 
<div class="logo"><img src=""/></div> 
<div class="navbar"></div></div> 

.header a une hauteur de 150 pixels. .navbar a une hauteur de 20px. Quand l'utilisateur défile, je veux que .navbar reste en haut. Je suis donc allé au CSS et j'ai mis la position: sticky et top: 0. Mais cela n'a pas fonctionné. J'ai d'abord pensé que firefox ne supporte pas la position: sticky, mais ce n'est pas le cas car j'ai pu voir une démo de travail. Je ai googlé à ce sujet, mais n'a trouvé rien d'utile. Quelqu'un sait pourquoi cela ne fonctionne pas?

+2

Puisque vous ne montrez pas votre css ... Sticky fonctionne seulement si le div (en-tête) contenant n'a pas de débordement caché ou auto. Ça pourrait être quelque chose à vérifier. – pinkfloydx33

+0

Pour quelqu'un d'autre qui se penche là-dessus, 'position: sticky' ne fonctionne souvent pas si le parent immédiat est' display: flex' – user568458

Répondre

3

Il fonctionne très bien si vous déplacez la barre de navigation en dehors de l'en-tête . Voir ci-dessous. Pour la raison, selon MDN:

L'élément est positionné en fonction du débit normal du document, puis décalé par rapport à sa racine d'écoulement et contenant bloc sur la base des valeurs de haut, à droite , en bas et à gauche.

Pour le bloc contenant:

Le bloc contenant est l'ancêtre auquel l'élément est relativement positionné

Alors, quand je ne vous méprenez pas, la barre de navigation est positionné à offset 0 dans l'en-tête dès qu'il défile à l'extérieur de la fenêtre (ce qui, évidemment, signifie que vous ne pouvez plus le voir).

.navbar { 
 
    background: hotpink; 
 
    width: 100%; 
 
    height: 50px; 
 
    position: -webkit-sticky; 
 
    position: sticky; 
 
    top: 0; 
 
} 
 

 
.header { 
 
    height: 150px; 
 
    background: grey; 
 
} 
 

 
body { 
 
    height: 800px; 
 
    position: relative; 
 
}
<div class="header"> 
 
<div class="desc">Description</div> 
 
<div class="logo"><img src=""/></div> 
 
</div> 
 

 
<div class="navbar"></div>

+0

Merci pour votre réponse! – Wolfuryo

+1

Avec la barre de navigation comme élément de l'en-tête comme dans la question, c'est collant aussi. Mais seulement jusqu'à la fin de son conteneur. Au départ, il est visible juste en dessous de "Description" et il se déplace à travers l'en-tête gris que vous faites défiler vers le bas. À la fin de la zone grise, il s'arrêtera lorsque le conteneur (= en-tête) se terminera. Dans cette réponse, le conteneur de la barre de navigation est le corps, c'est pourquoi il commencera initialement après l'en-tête gris et défilera tout en bas. – Neepsnikeep

0

Votre code HTML comme il est

<div class="header"> 
<div class="desc">Description</div> 
<div class="logo"><img src=""/></div> 
<div class="navbar"></div></div> 

et écrire classe CSS pour la barre de navigation

.header { 
height: 150px; 
background-color: #d1d1d1; 
} 

.navbar { 
    background: #999; 
    border-bottom: 1px solid #333; 
    border-top: 1px solid #333; 
    color: #FFF; 
    margin: 0; 
    padding: 2px 0 0 12px; 
    position: -webkit-sticky; 
    position: sticky; 
    top: -1px; 
} 

Hope cela aidera

+0

J'ai déjà essayé, sans succès. J'ai essayé d'ajouter une position: sticky et top: 0 à l'élément .header et ça marche, mais ce n'est pas ce que je veux. – Wolfuryo

+0

J'ai essayé de sortir la barre de navigation du conteneur en-tête, cela fonctionne –

0

D'une certaine manière votre code ne fonctionne que lorsque l'élément .navbar n'est pas dans un autre récipient comme l'en-tête. Je l'ai déplacé et ça fonctionne bien. I created a codepen snippet for that, check it out

<header> 
    <div class="logo">Logo</div> 
    <div class="description"><div>Lorem ipsum dolor sit amet consectetur adipisicing elit. Quo, veritatis.</div></div> 
</header> 
<div class="navbar"> 
    <ul> 
     <li><a href="#">navitem1</a></li> 
     <li><a href="#">navitem2</a></li> 
     <li><a href="#">navitem3</a></li> 
     <li><a href="#">navitem4</a></li> 
    </ul> 
</div> 

En ce moment position:sticky est pris en charge très bien que vous pouvez voir sur canIuse. Bien sûr, IE n'a actuellement aucun support mais la nouvelle version Edge apportera un support complet pour cela! J'ai trouvé quelques articles intéressants sur ce sujet:

Mais il y a de bonnes nouvelles à l'horizon. Je pense qu'un meilleur support du navigateur suivra la prochaine fois.

+0

Merci pour la réponse! – Wolfuryo

3

Pour toute autre personne rencontrée, la position collante ne fonctionnait pas pour moi en raison de l'élément body ayant overflow-x: hidden; ensemble.

+0

Vous venez de me sauver beaucoup de temps. Je faisais du restyling et je n'arrivais pas à comprendre pour la vie de moi pourquoi la position collante a cessé de fonctionner. Il s'avère qu'un tiers a ajouté des styles de débordement sur le HTML et le corps. Pouah! – mysticflute

+0

Cela m'a beaucoup aidé aussi. Merci! – Popmatik