J'ai une page où une barre de défilement contenant des lignes de table avec des divs est générée dynamiquement à partir de la base de données. Chaque ligne de tableau agit comme un lien, un peu comme vous le verriez sur une playlist YouTube à côté du lecteur vidéo.
Lorsqu'un utilisateur visite la page, l'option sur laquelle il se trouve est censée aller en haut de la division de défilement. Cette fonctionnalité fonctionne. Le problème est que cela va un peu trop loin. Comme l'option sur laquelle ils se trouvent est environ 10px trop élevée. Ainsi, la page est visitée, l'url est utilisée pour identifier quelle option a été sélectionnée, puis fait défiler cette option vers le haut du div de défilement. Remarque: ce n'est pas la barre de défilement de la fenêtre, c'est un div avec une barre de défilement.
J'utilise ce code pour le faire déplacer l'option sélectionnée vers le haut du div:
var pathArray = window.location.pathname.split( '/' );
var el = document.getElementById(pathArray[5]);
el.scrollIntoView(true);
Il le déplace vers le haut du div mais environ 10 pixels trop haut. Quelqu'un sait comment résoudre ce problème?
la source
scrollIntoView
est troublant.Réponses:
Si c'est environ 10px, alors je suppose que vous pouvez simplement ajuster manuellement le
div
décalage de défilement du contenant comme ça:la source
scrollIntoView
?scrollIntoView
fonction DOM simple ne provoque pas d'animation. Parlez-vous du plugin jQuery scrollIntoView?el.scrollIntoView({ behavior: 'smooth' });
. Mais le support n'est pas génial!Faites défiler en douceur jusqu'à une position appropriée
Obtenez les bonnes
y
coordonnées et utilisezwindow.scrollTo({top: y, behavior: 'smooth'})
la source
jQuery('#el').offset().top
puis l'utiliserwindow.scrollTo
scroll={el => { const yCoordinate = el.getBoundingClientRect().top + window.pageYOffset; const yOffset = -80; window.scrollTo({ top: yCoordinate + yOffset, behavior: 'smooth' }); }}
- où le décalage est de 10 à 15 pixels de plus que la taille de votre en-tête juste pour un meilleur espacementVous pouvez le faire en deux étapes:
la source
scrollIntoView()
défilement n'a pas fini avant l'scrollBy()
exécution, le dernier défilement annulera le premier. Au moins sur Chrome 71.scrollIntoView({adjustment:y})
, je pense que cela devrait être possible avec un code personnalisé à la finPositionner l'ancre par méthode absolue
Une autre façon de le faire est de positionner vos ancres exactement où vous le souhaitez sur la page plutôt que de compter sur le défilement par décalage. Je trouve que cela permet un meilleur contrôle pour chaque élément (par exemple, si vous voulez un décalage différent pour certains éléments), et peut également être plus résistant aux changements / différences d'API du navigateur.
Maintenant, le décalage est spécifié comme -100px par rapport à l'élément. Créez une fonction pour créer cette ancre pour la réutilisation du code, ou si vous utilisez un framework JS moderne tel que React, faites-le en créant un composant qui rend votre ancre, et passez le nom de l'ancre et l'alignement pour chaque élément, ce qui peut ou peut pas être le même.
Ensuite, utilisez simplement:
Pour un défilement fluide avec un décalage de 100 px.
la source
J'ai résolu ce problème en utilisant,
Cela fait apparaître l'élément dans le
center
défilement après, donc je n'ai pas à calculeryOffset
.J'espère que ça aide...
la source
scrollTo
pas surelement
mais surwindow
Cela fonctionne pour moi dans Chrome (avec un défilement fluide et pas de hacks de synchronisation)
Il déplace simplement l'élément, lance le défilement, puis le recule.
Il n'y a pas de "popping" visible si l'élément est déjà sur l'écran.
la source
En me basant sur une réponse précédente, je fais cela dans un projet Angular5.
Commencé avec:
Mais cela a posé quelques problèmes et a nécessité de définirTimeout pour scrollBy () comme ceci:
Et cela fonctionne parfaitement dans MSIE11 et Chrome 68+. Je n'ai pas testé en FF. 500 ms était le délai le plus court que j'aurais osé. La descente échouait parfois car le défilement fluide n'était pas encore terminé. Ajustez au besoin pour votre propre projet.
+1 à Fred727 pour cette solution simple mais efficace.
la source
En supposant que vous vouliez faire défiler jusqu'aux divs qui sont tous au même niveau dans DOM et qui ont le nom de classe "scroll-with-offset", alors ce CSS résoudra le problème:
Le décalage par rapport au haut de la page est de 100 pixels. Cela ne fonctionnera que comme prévu avec block: 'start':
Ce qui se passe, c'est que le point supérieur des divs est à l'emplacement normal mais que leur contenu interne commence 100px en dessous de l'emplacement normal. C'est à cela que sert padding-top: 100px. margin-bottom: -100px est de compenser la marge supplémentaire de la div ci-dessous. Pour rendre la solution complète, ajoutez également ce CSS pour compenser les marges / rembourrages pour les div les plus hauts et les plus bas:
la source
Cette solution appartient à @ Arseniy-II , je viens de la simplifier en une fonction.
Utilisation (vous pouvez ouvrir la console ici même dans StackOverflow et la tester):
la source
Vous pouvez également utiliser les
element.scrollIntoView()
optionsque la plupart des navigateurs prennent en charge
la source
J'ai ceci et cela fonctionne à merveille pour moi:
J'espère que ça aide.
la source
Une autre solution consiste à utiliser "offsetTop", comme ceci:
la source
Donc, c'est peut-être un peu maladroit mais jusqu'ici tout va bien. Im travaillant en angulaire 9.
fichier
.ts
fichier
.html
J'ajuste le décalage avec la marge et le haut de remplissage.
Saludos!
la source
J'ai trouvé une solution de contournement. Dites que vous voulez faire défiler jusqu'à un div, Element ici par exemple, et que vous voulez avoir un espacement de 20px au-dessus. Définissez la référence sur un div créé au-dessus:
<div ref={yourRef} style={{position: 'relative', bottom: 20}}/> <Element />
Cela créera cet espacement que vous souhaitez.
Si vous avez un en-tête, créez également un div vide derrière l'en-tête et attribuez-lui une hauteur égale à la hauteur de l'en-tête et référencez-le.
la source
Mon idée principale est de créer un tempDiv au-dessus de la vue vers laquelle nous voulons faire défiler. Cela fonctionne bien sans prendre de retard dans mon projet.
Exemple d'utilisation
J'espère que ça aide
la source
Basé sur la réponse d'Arseniy-II: j'ai eu le cas d'utilisation où l'entité de défilement n'était pas la fenêtre elle-même mais un modèle interne (dans ce cas, un div). Dans ce scénario, nous devons définir un ID pour le conteneur de défilement et l'obtenir via
getElementById
pour utiliser sa fonction de défilement:Le laisser ici au cas où quelqu'un serait confronté à une situation similaire!
la source
Voici mes 2 cents.
J'ai également eu le problème du scrollIntoView défilant un peu au-delà de l'élément, j'ai donc créé un script (javascript natif) qui ajoute un élément à la destination, le positionne un peu en haut avec css et fait défiler jusqu'à celui-ci. Après le défilement, je supprime à nouveau les éléments créés.
HTML:
Fichier Javascript:
CSS:
J'espère que cela aide n'importe qui!
la source
J'ajoute ces conseils css pour ceux qui n'ont pas résolu ce problème avec les solutions ci-dessus:
la source
UPD: j'ai créé un package npm qui fonctionne mieux que la solution suivante et plus facile à utiliser.
Ma fonction smoothScroll
J'ai pris la merveilleuse solution de Steve Banton et écrit une fonction qui la rend plus pratique à utiliser. Ce serait plus facile à utiliser
window.scroll()
ou mêmewindow.scrollBy()
, comme je l'ai déjà essayé, mais ces deux-là ont quelques problèmes:Voici le code
Copiez-le et dérangez-le comme vous le souhaitez.
Pour créer un élément de lien, ajoutez simplement l'attribut de données suivant:
Vous pouvez également définir un autre attribut comme addtion
Il représente l'
block
option de lascrollIntoView()
fonction. Par défaut, c'eststart
. En savoir plus sur MDN .finalement
Adaptez la fonction smoothScroll à vos besoins.
Par exemple, si vous avez un en-tête fixe (ou je l'appelle avec le mot
masthead
), vous pouvez faire quelque chose comme ceci:Si vous n'avez pas un tel cas, supprimez-le, pourquoi pas :-D.
la source
Pour un élément dans une ligne de tableau, utilisez JQuery pour obtenir la ligne au-dessus de celle que vous voulez , et faites simplement défiler jusqu'à cette ligne à la place.
Supposons que j'ai plusieurs lignes dans une table, dont certaines devraient être examinées par et par l'administrateur. Chaque ligne nécessitant une révision comporte à la fois une flèche vers le haut et une flèche vers le bas pour vous diriger vers l'élément précédent ou suivant à réviser.
Voici un exemple complet qui devrait simplement s'exécuter si vous créez un nouveau document HTML dans le bloc-notes et que vous l'enregistrez. Il y a un code supplémentaire pour détecter le haut et le bas de nos éléments à examiner afin que nous ne renvoyions aucune erreur.
la source
Solution simple pour faire défiler un élément spécifique vers le bas
la source