Je veux que la barre de navigation reste en haut une fois que je fais défiler dessus, mais cela ne fonctionne pas et je n'ai aucune idée de pourquoi. Si vous pouvez 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>
html
css
css-position
Harleyoc1
la source
la source
position: sticky
peut cesser de fonctionner s'il est à l'intérieur d'une flexbox à moins que vous ne soyez prudent et échouera également s'il y a unoverflow: hidden
ouoverflow: auto
entre et tout ce qu'il défile à l'intérieur (racine du corps ou ancêtre le plus proche avec débordement: scroll)overflow: hidden
etoverflow: auto
! Je me gratte la tête depuis des jours en essayant de faire fonctionner cette merdeRéponses:
Donc, dans votre exemple, vous devez définir la position où il doit rester à la fin en utilisant la
top
propriété.la source
Vérifiez si un élément ancêtre a un jeu de débordement (par exemple
overflow:hidden
); essayez de le basculer. Vous devrez peut-être remonter l'arborescence DOM plus haut que prévu =).Cela peut affecter votre
position:sticky
sur un élément descendant.la source
$(stickyElement).parents().css("overflow", "visible")
dans la console Web pouvait aider et c'est le cas. Ensuite, j'ai localisé le parent éloigné avec leoverflow:hidden
style qui a causé le problème. J'aimerais lire cette réponse plus attentivement.overflow:hidden
, vous pouvez exécuter ce script dans la console de votre navigateur pour vérifier tous les parents / ancêtres d'un élément donné: gist.github.com/brandonjp/478cf6e32d90ab9cb2cd8cbb0799c7a7J'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ébordement définie sur le parent. Vous ne pouvez pas utiliser :
overflow: hidden
,overflow: scroll
ouoverflow: auto
sur le parent d'unposition: sticky
élément.la source
Peu de choses que j'ai rencontrées:
Lorsque votre élément collant est un composant (angulaire, etc.)
Si l'élément `` collant '' lui-même est 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 css du composant:ou
Safari sur iOS en particulier semble exiger
display:block
même sur l'élément racineapp-root
d'une application angulaire ou il 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 niveau supérieurdiv
dans le composant. Avec Angular, cela peut être réalisé avec le:host
sélecteur dans le css pour votre composant.Autre
Si l'élément suivant votre élément collant a un arrière-plan uni, vous devez ajouter ce qui suit pour l'empêcher de glisser en dessous:
Votre élément collant doit être le premier (avant votre contenu) s'il est utilisé
top
et après celui-ci s'il est utilisébottom
.Il y a des complications lors de l'utilisation
overflow: hidden
sur votre élément wrapper - en général, cela tuera l'élément collant à l'intérieur. Mieux expliqué dans cette questionLes navigateurs mobiles peuvent désactiver les éléments à position fixe / fixe lorsque le clavier à l'écran est visible. Je ne suis pas sûr des règles exactes (personne ne le sait jamais) mais lorsque le clavier est visible, vous regardez une sorte de `` fenêtre '' dans la fenêtre et vous ne pourrez pas facilement faire coller les choses haut visible réel de l'écran.
Assurez-vous que vous avez:
position: sticky;
et pas
display: sticky;
Divers problèmes d'utilisabilité
la source
display: block
et quiposition: relative
déclenche le comportement correct dans Safari - semblait-il que seuldisplay: block
était nécessaire? Bien sûr, cela ne fait probablement pas de mal d'avoir les deux spécifiésdisplay: block
C'était juste assezCeci est une continuation des réponses de MarsAndBack et Miftah Mizwar.
Leurs réponses sont correctes. Cependant, il est difficile d'identifier le ou les ancêtres du problème.
Pour rendre cela très simple, 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.
Là où un ancêtre n'a pas
overflow: visible
changé son CSS pour qu'il le fasse!De plus, comme indiqué ailleurs, assurez-vous que votre élément collant a ceci dans le CSS:
la source
overflow: invisible
.(async function() { let response = await fetch('https://code.jquery.com/jquery-3.3.1.min.js'); let script = await response.text(); eval(script); })();
var p = $0.parentElement; while(p != null) { var ov = getComputedStyle(p).overflow; if(ov !== 'visible') console.warn(ov, p); else console.log(ov, p); p = p.parentElement; }
Où$0
est le dernier élément sélectionné dans les outils de développement.position: fixed
et s'approprier les propriétés avec JavaScript. La question n'indique pas le besoin de JavaScript.J'ai dû utiliser le CSS suivant pour le faire fonctionner:
Si ci-dessus ne fonctionne pas, alors ...
Passez en revue tous les ancêtres et assurez-vous qu'aucun de ces éléments ne l'a fait
overflow: hidden
. Vous devez changer cela enoverflow: visible
la source
Si vous êtes tombé sur ceci et que votre sticky ne fonctionne pas - essayez de configurer le parent sur:
A travaillé pour moi
la source
display: unset
, ce qui n'est peut-être pas toujours immédiatement viablecontents
,initial
(?) Etinline
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 en utilisant DevTools.la source
Il semble que la barre de navigation à coller ne devrait pas être à l'intérieur d'une div ou d'une section avec un autre contenu. Aucune des solutions ne fonctionnait pour moi jusqu'à ce que j'aie retiré la barre de navigation du div que la barre de navigation partageait avec une autre barre supérieure. J'avais auparavant la barre supérieure et la barre de navigation enveloppées avec un div commun.
la source
display: unset
, cette restriction est levée! voir stackoverflow.com/a/60560997/2902367 Semble également fonctionner aveccontents
,initial
(?) etinline
de mon commentaire:
Il existe un polyfill à utiliser pour d'autres navigateurs que FF et Chrome. Il s'agit d'une règle expérimentale qui peut être implémentée ou non à tout moment via les navigateurs. Chrome l'a ajouté il y a quelques années, puis l'a laissé tomber, il semble que ça revienne ... mais pour combien de temps?
Le plus proche serait position: relative + coordonnées mises à jour lors du défilement une fois atteint le point collant, si vous voulez transformer cela en un script javascript
la source
Je sais que cela semble avoir déjà été répondu, mais je suis tombé sur un cas spécifique et je pense que la plupart des réponses passent à côté de l'essentiel.
Les
overflow:hidden
réponses couvrent 90% des cas. C'est plus ou moins le scénario "sticky nav".Mais le comportement collant est mieux utilisé dans la hauteur d'un conteneur. Pensez à un formulaire de newsletter dans la colonne de droite de votre site Web qui défile vers le bas avec la page. Si votre élément collant est le seul enfant du conteneur, le conteneur a exactement la même taille et il n'y a pas de place pour faire défiler.
Votre conteneur doit être à la hauteur dans laquelle vous vous attendez à ce que votre élément défile. Ce qui dans mon scénario "colonne de droite" est la hauteur de la colonne de gauche. La meilleure façon d'y parvenir est d'utiliser
display:table-cell
sur les colonnes. Si vous ne pouvez pas, et que vous êtes coincé avecfloat:right
et comme moi, vous devrez soit deviner la hauteur de la colonne de gauche, soit la calculer avec Javascript.la source
sticky-limit: parent
,sticky-limit: body
ousticky-limit: nth-parent(3)
... Quoi qu'il en soit: si vous le pouvez, vous pouvez lever cette limitation en définissant le parent limitant surdisplay: unset
, comme indiqué dans stackoverflow.com/a/60560997/2902367 . Semble également travailler aveccontents
,initial
(?) Etinline
Je sais que c'est un ancien message. Mais s'il y a quelqu'un comme moi qui a récemment commencé à jouer avec la position: collant cela peut être utile.
Dans mon cas, j'utilisais position: sticky comme élément de grille. Cela ne fonctionnait pas et le problème était un overflow-x: hidden sur l'
html
élément. Dès que j'ai supprimé cette propriété, cela a bien fonctionné. Avoir overflow-x: hidden sur l'body
élément semblait fonctionner bien, je ne sais pas pourquoi encore.la source
deux réponses ici:
supprimer la
overflow
propriété de labody
baliseréglé
height: 100%
surbody
pour résoudre le problème avecoverflow-y: auto
la source
Je pense que cet article en dit long sur le
sticky
fonctionnementla source
Le comportement réel d'un élément collant est:
Un élément positionné de manière collante est traité comme étant relativement positionné jusqu'à ce que son bloc contenant franchisse un seuil spécifié (tel que définir top sur une valeur autre que auto) dans sa racine de flux (ou le conteneur dans lequel il défile), auquel point il est traité comme "bloqué "jusqu'à rencontrer le bord opposé de son bloc contenant.
L'élément est positionné selon le flux normal du document, puis décalé par rapport à son ancêtre défilant le plus proche et contenant le bloc (ancêtre au niveau du bloc le plus proche), y compris les éléments liés à la table, en fonction des valeurs de haut, droit, bas, et gauche. Le décalage n'affecte pas la position des autres éléments.
Cette valeur crée toujours un nouveau contexte d'empilement. Notez qu'un élément collant "colle" à son ancêtre le plus proche qui a un "mécanisme de défilement" (créé lorsque le débordement est caché, défilement, automatique ou superposition), même si cet ancêtre n'est pas l'ancêtre de défilement le plus proche.
Cet exemple vous aidera à comprendre:
code
https://codepen.io/darylljann/pen/PpjwPMla source
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 bon flottant devienne collant mais j'ai dû ajouter un
<div style="clear: both;"></div>
à la fin du parent, pour lui donner de la hauteur.la source
float:left
pas pourquoi cela a été critiqué par quelqu'un, mais c'était exactement mon cas: j'ai ajouté à l'élément parent (sans flotteur, sa hauteur était de 0) et j'aiposition:sticky
travaillé.J'ai utilisé une solution JS. Cela fonctionne dans Firefox et Chrome. Tout problème, faites le moi savoir.
html
css
js
la source
z-index
est également très important. Parfois, cela fonctionnera mais vous ne le verrez tout simplement pas. Essayez de le régler sur un nombre très élevé pour être sûr. Aussi, ne mettez pas toujourstop: 0
mais essayez quelque chose de plus haut au cas où il serait caché quelque part (sous une barre d'outils).la source
Voici ce qui m'a fait trébucher ... ma div rémanente était à l'intérieur d'une autre div afin que la div parent ait besoin de contenu supplémentaire APRÈS la div rémanente, pour rendre la div parent "suffisamment grande" pour que la div rémanente "glisse" sur d'autres contenus comme vous faites défiler vers le bas.
Donc, dans mon cas, juste après le sticky div, j'ai dû ajouter:
(Mon application comporte deux divs côte à côte, avec une image "haute" à gauche et un court formulaire de saisie de données à droite, et je voulais que le formulaire de saisie de données flotte à côté de l'image lorsque vous faites défiler vers le bas, donc le formulaire est toujours à l'écran. Cela ne fonctionnerait pas tant que j'aurais ajouté le "contenu supplémentaire" ci-dessus pour que le div collant ait quelque chose à "glisser"
la source
Il est VRAI que le
overflow
doit être supprimé ou défini surinitial
pour que lesposition: sticky
travaux sur l'élément enfant soient exécutés . J'ai utilisé Material Design dans mon application Angular et j'ai découvert que certains composants Material changeaient laoverflow
valeur. Le correctif pour mon scénario estla source