position: sticky fonctionne maintenant sur certains navigateurs mobiles, vous pouvez donc faire défiler une barre de menu avec la page, mais ensuite rester en haut de la fenêtre chaque fois que l'utilisateur la fait défiler.
Mais que se passe-t-il si vous souhaitez redéfinir légèrement votre barre de menu collante chaque fois qu'elle est actuellement bloquée? Par exemple, vous voudrez peut-être que la barre ait des coins arrondis chaque fois qu'elle défile avec la page, mais dès qu'elle colle au haut de la fenêtre, vous voulez vous débarrasser des coins arrondis supérieurs et ajouter une petite ombre portée en dessous il.
Existe-t-il une sorte de pseudosélecteur (par exemple ::stuck
) pour cibler les éléments qui ont collé position: sticky
et sont actuellement bloqués? Ou est-ce que les fournisseurs de navigateurs ont quelque chose de semblable dans le pipeline? Sinon, où le demanderais-je?
NB. Les solutions javascript ne sont pas bonnes pour cela car sur mobile, vous n'obtenez généralement qu'un seul scroll
événement lorsque l'utilisateur relâche son doigt, de sorte que JS ne peut pas savoir à quel moment exact le seuil de défilement a été dépassé.
la source
position
propriétés d'un:stuck
sélecteur doivent être ignorées? (une règle pour les fournisseurs de navigateurs, je veux dire, similaire aux règles sur laleft
priorité surright
etc.)):stuck
qui change latop
valeur de0
à300px
, puis faites défiler vers le bas150px
... devrait-il rester ou non? Ou pensez à un élément avecposition: sticky
etbottom: 0
où le:stuck
peut - être changefont-size
et donc à la taille des éléments (donc en changeant le moment où il devrait coller) ...while
cycle est mal conçu car il permet une boucle sans fin :) Cependant, merci d'avoirDans certains cas, un simple
IntersectionObserver
peut faire l'affaire, si la situation permet de s'en tenir à un pixel ou deux à l'extérieur de son conteneur racine, plutôt que de se rincer correctement. De cette façon, quand il se trouve juste au-delà du bord, l'observateur tire et nous partons en courant.Collez l'élément juste hors de son conteneur avec
top: -2px
, puis ciblez via l'stuck
attribut ...Exemple ici: https://codepen.io/anon/pen/vqyQEK
la source
stuck
classe serait meilleure qu'un attribut personnalisé ... Y a-t-il une raison spécifique à votre choix?padding-top: 60px
dans votre cas :)Quelqu'un sur le blog Google Developers affirme avoir trouvé une solution performante basée sur JavaScript avec un IntersectionObserver .
Bit de code pertinent ici:
Je ne l'ai pas reproduit moi-même, mais peut-être que cela aide quelqu'un à trébucher sur cette question.
la source
Je ne suis pas vraiment fan de l'utilisation des hacks js pour styliser des trucs (c'est-à-dire getBoudingClientRect, faire défiler l'écoute, redimensionner l'écoute), mais c'est ainsi que je résous actuellement le problème. Cette solution aura des problèmes avec les pages qui ont un contenu minimisable / maximisable (<détails>), ou un défilement imbriqué, ou vraiment des boules de courbe que ce soit. Cela étant dit, c'est une solution simple lorsque le problème est simple également.
la source
if (requestedFrame) { return; }
Ce n'est pas un "tueur de performances" en raison du lot d'images d'animation. Cependant, Intersection Observer est toujours une amélioration.Une manière compacte lorsque vous avez un élément au-dessus de l'
position:sticky
élément. Il définit l'attributstuck
que vous pouvez associer en CSS avecheader[stuck]
:HTML:
JS:
la source