Récemment, j'ai travaillé à la mise en place d'une bibliothèque de composants de vues arborescentes pour Angular. ngx-tree .
Problème
Peu de temps après, j'ai compris comment mettre en place une fonction de défilement virtuel pour cette bibliothèque afin d'obtenir des performances avec de grands ensembles de données, et l'ai fait fonctionner correctement dans Firefox, je suis pris au piège par un comportement bizarre de défilement dans Clignotement -navigateurs inclus (comme Chromium, Chrome, Opera).
Lien vers la démo
Voici la démo plunkr --
https://embed.plnkr.co/xMpmK5EBC46tDKpYFpw8voir la mise à jour n° 1 ci-dessous
Situation
- Dans Firefox, Edge et IE 11, ma bibliothèque avec la fonction de défilement virtuel fonctionne comme prévu avec un défilement fluide.
- Cependant, dans Chrome et Opera, lorsque je fais défiler l'arborescence jusqu'à certaines positions, la position de la barre de défilement (qui est la position de l'arbre) est modifiée.
scrollTop
de la zone de défilement) sautent de haut en bas, ce qui provoque une scintillement vue arborescente et décomposer la fonction de défilement virtuel.
version détaillée du navigateur
- Chrome - 59.0.3071.115
- Firefox - 54.0
- Bord - 40.15063.0.0
autres navigateurs
En Chine, il y a quelques décortiqué les navigateurs dérivés du projet Chromium (comme 360se, le navigateur QQ, le navigateur Sogou, le navigateur UC) avec ancienne version de V8 et blink . Et ils n'ont pas ce comportement bizarre de défilement.
Quelques hypothèses
Est-ce dû à une optimisation de l'implémentation du défilement (comme un défilement fluide) par l'équipe Chromium ?
J'espère obtenir des guides !!! ( )
Mise à jour n° 1
Mise à jour du lien de démonstration avec le journal des événements : https://embed.plnkr.co/GpQBZsguhZZOQWWbZnqI/
Il faut tester le défilement avant d'ouvrir devtool pour voir les logs.
Je dois expliquer un peu plus comment le défilement virtuel fonctionne et ce qui cause le scintillement.
D'abord, voir le conception du défilement virtuel .
Un point clé du défilement virtuel est que nous créons une fausse zone de défilement de la même taille que la zone sans défilement virtuel instrumentée. Ainsi, dans une situation optimale, la position de la barre de défilement de la zone de défilement ne devrait pas changer jusqu'à ce que certains événements attendus déclenchent ses changements. Pour l'événement de défilement, nous mettons à jour la vue pour chaque image d'animation.
À l'intérieur d'une zone de défilement à hauteur fixe, nous supposons une vérité que la propriété scrollTop ne changera pas avec un grand pourcentage si nous simulons correctement la hauteur de ces éléments non rendus (il pourrait y avoir des différences entre les deux). un peu d'écart pour la précision du calcul ) dans un cadre d'animation.
Cependant, d'après les résultats que j'ai observés, les navigateurs de la série blink semblent appliquer une stratégie différente pour mettre à jour le scrollTop de l'élément scrollable. Son timing pour mettre à jour le scrollTop est différent de celui des navigateurs non-blink-series. C'est tout ce que j'ai compris jusqu'à présent.
Exemples de gifs
Ici j'ai fait quelques gifs pour montrer la sortie de Chrome, Firefox, et Edge.
3 votes
Avec un peu de profilage, il semble qu'il s'agisse d'un bug dans la fonction setNative (zone.js). Il y a une sorte de gestion de requestAnimationFrame, mais il faut creuser davantage. L'initiateur est l'appel récurrent de setNative.apply(window, args) à zone.js:1522 (v0.8.11). Cela pourrait aussi être causé par le mélange avec d'autres bibliothèques, mais quand les autres navigateurs fonctionnent...
5 votes
Je dois mentionner que j'ai trouvé un problème connexe dans le gestionnaire de problèmes de Chromium. bugs.chromium.org/p/chromium/issues/detail?id=727239
0 votes
@bigless, Mais je suis heureux que vous fournissiez une autre perspective au problème.
0 votes
Le navigateur peut alors renvoyer quelque chose qu'il ne devrait pas et le traitement dans zone.js est interrompu. Mais si c'est lié au navigateur, qui je suis ;) J'espère que ce problème sera bientôt résolu. Bonne chance ;)
0 votes
Si cela peut vous aider, j'ai pu voir cela dans Chrome 58 également.
0 votes
Utilisez-vous le navigateur linux chromium ? Vous pouvez également constater qu'un écran blanc clignote de temps en temps lorsque le navigateur affiche un changement d'opacité sur l'ensemble de la page.
1 votes
Je n'ai même pas pu exécuter la démo fournie.
0 votes
Démo
plunker
Les liens ne chargent pas l'application0 votes
@KiranShakya désolé, c'est parce que la version d'angular n'est pas mise à jour puis s'est plantée.
0 votes
La démo de Plunker ne se charge pas non plus pour moi.
0 votes
@Daniel, regardez à nouveau, j'ai supprimé l'ancien lien.
1 votes
Avez-vous essayé de désactiver
smooth scrolling
surchrome://flags/
?0 votes
La démo de Plunker ne fonctionne pas. Utilisez peut-être StackBlitz - Plunker ne parvient pas à charger les applications Angular ces jours-ci.