Je souhaite que la barre de navigation reste en haut une fois que je l'ai fait défiler, mais cela ne fonctionne pas et je ne sais pas pourquoi. Si vous pouvez m'aider, voici mon code HTML et CSS:
.nav-selections {
text-transform: uppercase;
letter-spacing: 5px;
font: 18px "lato",sans-serif;
display: inline-block;
text-decoration: none;
color: white;
padding: 18px;
float: right;
margin-left: 50px;
transition: 1.5s;
}
.nav-selections:hover{
transition: 1.5s;
color: black;
}
ul {
background-color: #B79b58;
overflow: auto;
}
li {
list-style-type: none;
}
<nav style="position: sticky; position: -webkit-sticky;">
<ul align="left">
<li><a href="#/contact" class="nav-selections" style="margin-right:35px;">Contact</a></li>
<li><a href="#/about" class="nav-selections">About</a></li>
<li><a href="#/products" class="nav-selections">Products</a></li>
<li><a href="#" class="nav-selections">Home</a></li>
</ul>
</nav>
Le positionnement collant est un hybride de positionnement relatif et fixe. L'élément est traité en tant que position relative jusqu'à ce qu'il dépasse un seuil spécifié, point auquel il est traité en position fixe.
...
Vous devez spécifier un seuil avec au moins l'un destop
,right
,bottom
ouleft
pour que le positionnement correct se comporte comme prévu. Sinon, il sera impossible de distinguer le positionnement relatif . [ source: MDN ]
Donc, dans votre exemple, vous devez définir la position à laquelle il doit coller en utilisant la propriété top
.
html, body {
height: 200%;
}
nav {
position: sticky;
position: -webkit-sticky;
top: 0; /* required */
}
.nav-selections {
text-transform: uppercase;
letter-spacing: 5px;
font: 18px "lato", sans-serif;
display: inline-block;
text-decoration: none;
color: white;
padding: 18px;
float: right;
margin-left: 50px;
transition: 1.5s;
}
.nav-selections:hover {
transition: 1.5s;
color: black;
}
ul {
background-color: #B79b58;
overflow: auto;
}
li {
list-style-type: none;
}
<nav>
<ul align="left">
<li><a href="#/contact" class="nav-selections" style="margin-right:35px;">Contact</a></li>
<li><a href="#/about" class="nav-selections">About</a></li>
<li><a href="#/products" class="nav-selections">Products</a></li>
<li><a href="#" class="nav-selections">Home</a></li>
</ul>
</nav>
Vérifiez si un élément ancêtre a un dépassement de capacité défini (par exemple, overflow:hidden
); essayez de le basculer. Vous devrez peut-être monter l’arbre DOM plus haut que prévu =).
Cela peut affecter votre position:sticky
sur un élément descendant.
J'ai le même problème, et j'ai trouvé la réponse ici .
Si votre élément ne colle pas comme prévu, la première chose à vérifier sont les règles appliquées au conteneur.
Plus précisément, recherchez toute propriété de dépassement définie sur le parent. Vous ne pouvez pas utiliser: overflow: hidden
, overflow: scroll
ou overflow: auto
sur le parent d'un élément position: sticky
.
Peu de choses que j'ai rencontrées:
Lorsque votre élément collant est un composant (angulaire, etc.)
Si l'élément 'sticky' est lui-même un composant avec un sélecteur d'élément personnalisé, tel qu'un composant angulaire nommé <app-menu-bar>
, vous devrez ajouter ce qui suit au fichier css du composant:
:Host { display: block; }
ou
app-menu-bar { display: block; } // (in the containing component's css)
Safari sur iOS en particulier semble nécessiter display:block
même sur l’élément racine app-root
d’une application angulaire, sinon elle ne collera pas.
Si vous créez un composant et définissez le css à l'intérieur du composant (shadow DOM/styles encapsulés), assurez-vous que le position: sticky
est appliqué au sélecteur 'externe' (par exemple, app-menu-bar
dans devtools devrait afficher la position collante) et non un sommet. niveau div
intra le composant. Avec Angular, cela peut être réalisé avec le sélecteur :Host
dans le css de votre composant.
:Host
{
position: sticky;
display: block; // this is the same as shown above
top: 0;
background: red;
}
Autre
Si l'élément suivant votre élément collant a un arrière-plan solide, vous devez ajouter ce qui suit pour l'empêcher de glisser en dessous:
.sticky-element { z-index: 100; }
.parent-of-sticky-element { position: relative; }
Votre élément collant doit être en premier (avant votre contenu) si vous utilisez top
et après si vous utilisez bottom
.
Il existe des complications lors de l’utilisation de overflow: hidden
sur votre élément d’emballage - en général, il tue l’élément collant à l’intérieur. Mieux expliquée dans cette question
Les navigateurs mobiles peuvent désactiver les éléments fixes/collants lorsque le clavier à l'écran est visible. Je ne suis pas sûr des règles exactes (est-ce que quelqu'un le sait jamais) mais quand le clavier est visible, vous regardez une sorte de "fenêtre" dans la fenêtre et vous ne serez pas facilement en mesure de faire en sorte que les choses restent collées au clavier. visible en haut de l'écran.
Assurez-vous que vous avez:
position: sticky;
et pas
display: sticky;
Ceci est la suite des réponses de MarsAndBack et Miftah Mizwar.
Leurs réponses sont correctes. Cependant, il est difficile d'identifier le ou les ancêtres à problèmes.
Pour simplifier les choses, exécutez simplement ce script jQuery dans la console de votre navigateur et il vous indiquera la valeur de la propriété overflow sur chaque ancêtre.
$('.your-sticky-element').parents().filter(function() {
console.log($(this));
console.log($(this).css('overflow'));
return $(this).css('overflow') === 'hidden';
});
Lorsqu'un ancêtre n'a pas overflow: visible
, changez son CSS pour qu'il le fasse!
De plus, comme indiqué ailleurs, assurez-vous que votre élément collant a ceci dans le CSS:
.your-sticky-element {
position: sticky;
top: 0;
}
de mon commentaire:
nav {
position: sticky;
top: 0;
}
.nav-selections {
text-transform: uppercase;
letter-spacing: 5px;
font: 18px "lato", sans-serif;
display: inline-block;
text-decoration: none;
color: white;
padding: 18px;
float: right;
margin-left: 50px;
transition: 1.5s;
}
.nav-selections:hover {
transition: 1.5s;
color: black;
}
ul {
background-color: #B79b58;
overflow: auto;
}
li {
list-style-type: none;
}
body {
height: 200vh;
}
<nav>
<ul align="left">
<li><a href="#/contact" class="nav-selections" style="margin-right:35px;">Contact</a></li>
<li><a href="#/about" class="nav-selections">About</a></li>
<li><a href="#/products" class="nav-selections">Products</a></li>
<li><a href="#" class="nav-selections">Home</a></li>
</ul>
</nav>
Il y a polyfill à utiliser pour d'autres navigateurs que FF et Chrome. Il s'agit d'une règle expérimentale qui peut être mise en œuvre ou non à tout moment via les navigateurs. Chrome l'ajoute il y a quelques années et l'a laissé tomber, il semble revenir… mais pour combien de temps?
Le plus proche serait la position: les coordonnées relatives + mises à jour lors du défilement une fois atteint le point collant, si vous voulez transformer cela en un script javascript.
Je devais utiliser le CSS suivant pour le faire fonctionner:
.parent {
display: flex;
justify-content: space-around;
align-items: flex-start;
overflow: visible;
}
.sticky {
position: sticky;
position: -webkit-sticky;
top: 0;
}
Moment drôle qui n’était pas évident pour moi: au moins dans Chrome 70, position: sticky
n’est pas appliqué si vous l’avez défini avec DevTools.
Il semble que la barre de navigation à coller ne devrait pas être dans une div ou une section avec un autre contenu. Aucune de la solution ne fonctionnait pour moi jusqu'à ce que je retire la barre de navigation de la div que la barre de navigation partageait avec une autre barre supérieure. J'avais précédemment la barre de navigation et la barre de navigation entourées d'un div commun.
deux répondent ici:
supprimer la propriété overflow
de la balise body
définissez height: 100%
sur body
pour résoudre le problème avec overflow-y: auto
min-height: 100%
non fonctionnel au lieu deheight: 100%
Il est VRAI que la overflow
doit être supprimée ou définie sur initial
pour que position: sticky
fonctionne sur l'élément enfant. J'ai utilisé Material Design dans mon application Angular et j'ai découvert que certains Les composants matériels ont changé la valeur overflow
. La solution pour mon scénario est
mat-sidenav-container, mat-sidenav-content {
overflow: initial;
}
si le correctif de danday74 ne fonctionne pas, vérifiez que l'élément parent a une hauteur.
Dans mon cas, j'avais deux enfants, un flottant à gauche et un flottant à droite. Je voulais que le flottant de droite devienne collant, mais je devais ajouter un <div style="clear: both;"></div>
à la fin du parent pour lui donner une hauteur.
Je sais que c'est un ancien post. Mais s'il y a quelqu'un comme moi qui vient de commencer à jouer avec sa position: collant, cela peut être utile.
Dans mon cas, j'utilisais position: collant comme élément de grille. Cela ne fonctionnait pas et le problème était un overflow-x: caché sur l'élément html
. Dès que j'ai enlevé cette propriété cela a bien fonctionné. Avoir overflow-x: caché sur l'élément body
semblait fonctionner, mais nous ne savions pas pourquoi.
Je crois que cet article peut démystifier beaucoup le fonctionnement de sticky
Comment la position collante de CSS fonctionne vraiment! La position CSS collante a deux parties principales, un article collant et un contenant collant .
Article collant - est l'élément que nous avons défini avec la position: styles collants. L'élément flottera lorsque la position de la fenêtre correspond à la définition de la position, par exemple:
top: 0px
.Sticky Container : élément HTML enveloppant l'élément collant. Il s'agit de la zone maximale dans laquelle l'élément collant peut flotter.
Lorsque vous définissez un élément avec position: sticky, vous définissez automatiquement l’élément parent en tant que conteneur collant!