Synchronisé de défilement à l'aide de jQuery?
Je suis en train de mettre en œuvre synchronisée de défilement pour deux DIV
avec le code suivant.
$(document).ready(function() {
$("#div1").scroll(function () {
$("#div2").scrollTop($("#div1").scrollTop());
});
$("#div2").scroll(function () {
$("#div1").scrollTop($("#div2").scrollTop());
});
});
#div1
et #div2
est d'avoir le même contenu, mais de tailles différentes, dire
#div1 {
height : 800px;
width: 600px;
}
#div1 {
height : 400px;
width: 200px;
}
Avec ce code, je suis confronté à deux problèmes.
1) le Défilement n'est pas bien synchronisés, depuis les divs sont de tailles différentes. Je sais, c'est parce que, je suis directement réglage de la scrollTop
valeur. J'ai besoin de trouver le pourcentage de défilement du contenu et de calculer correspondant scrollTop
valeur pour les autres div
. Je ne suis pas sûr, comment trouver la hauteur et la position de défilement actuelle.
2) Cette question n'est trouvé dans firefox
. Dans firefox, le défilement n'est pas lisse comme dans d'autres navigateurs. Je crois que c'est parce que le code ci-dessus est de créer une boucle infinie d'événements de défilement.
Je ne suis pas sûr, pourquoi cela n'arrive qu'avec firefox. Est-il possible de trouver la source de l'événement scroll, afin que je puisse résoudre ce problème.
Toute aide serait grandement appréciée.
- un peu la même question et ma réponse: stackoverflow.com/a/15344759/2000060
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser
element.scrollTop /(element.scrollHeight - element.offsetHeight)
pour obtenir le pourcentage (ça va être une valeur comprise entre0
et1
). Ainsi, vous pouvez multiplier l'autre élément du(.scrollHeight - .offsetHeight)
par cette valeur proportionnelle de défilement.Pour éviter de déclencher les auditeurs dans une boucle, vous pourriez séparer temporairement le port d'écoute, réglez la
scrollTop
et lier de nouveau à nouveau.http://jsfiddle.net/b75KZ/5/
*Height
à*Width
et*Top
à*Left
jsfiddle.net/b75KZ/102 (edit: désolé, je pensais que tu veux dire à la fois horizontalement, mais il doit être aussi facile, il suffit de changerscrollLeft
basé surscrollTop
et vice-versa)C'est ce que j'utilise. Il suffit d'appeler le
syncScroll(...)
fonction avec les deux éléments que vous souhaitez synchroniser. J'ai trouvé pawel la solution a eu des problèmes avec la poursuite lentement défiler après que la souris ou le trackpad a été fait avec l'opération.Voir exemple de travail ici.
Si les divs sont de la même taille alors ce code ci-dessous est un moyen simple pour faire défiler synchroniquement:
Ici im à l'aide de défilement horizontale, mais vous pouvez utiliser scrollTop ici à la place. Cette fonction est appel sur
scroll
événement sur la div, de sorte que lee
auront accès à l'objet de l'événement.Deuxièmement, vous pouvez tout simplement le rapport des tailles des divs calculé à s'appliquer dans cette ligne
$('.scroll_class')[i].scrollLeft = scrollLeft;
Fonctionne comme sur des roulettes (voir DÉMO)
J'aime pawel propre solution, mais ça manque de quelque chose dont j'ai besoin et a une étrange défilement d'un bug où elle continue de défiler et de mon plugin va travailler sur de multiples récipients et pas seulement deux.
http://www.xtf.dk/2015/12/jquery-plugin-synchronize-scroll.html
Exemple & demo: http://trunk.xtf.dk/Project/ScrollSync/
Plugin: http://trunk.xtf.dk/Project/ScrollSync/jquery.scrollSync.js
Si vous ne voulez pas proportionnelle de défilement, mais plutôt pour faire défiler une quantité égale de pixels sur chaque champ, vous pouvez ajouter de la valeur du changement de la valeur actuelle du champ, vous êtes liaison la de défilement-événement.
Disons que
#left
est le petit champ, et#right
est le plus grand champ.https://jsfiddle.net/vuvgc0a8/1/
En ajoutant de la valeur du changement, et pas seulement de définir égal à
#right
'sscrollTop()
, vous pouvez faire défiler vers le haut ou vers le bas dans le petit champ, quelle que soit sascrollTop()
étant de moins que le plus grand champ. Un exemple de ceci est la page d'un utilisateur sur Facebook.C'est ce que j'ai besoin quand je suis venu ici, j'ai donc pensé que je pourrais partager avec vous.
J'ai résolu le problème de la synchronisation du défilement en boucle problème en définissant le défilement pourcentage de notation à virgule fixe:
percent.toFixed(0)
, avec 0 comme paramètre. Cela empêche incompatibles fractions de défilement de hauteurs entre les deux synchronisés éléments, qui sont constamment essayer de "rattraper" les uns avec les autres. Ce code leur permettra de rattraper après plus qu'une seule étape supplémentaire (c'est à dire, le second élément peut continuer à faire défiler un pixel supplémentaire après que l'utilisateur cesse de défiler). Pas une solution parfaite, ou le plus sophistiqué, mais certainement le plus simple que j'ai pu trouver.De la pawel solution (première réponse).
Pour la horizzontal défilement synchronisé à l'aide de jQuery c'est la solution:
JSFiddle
Une autre solution pour plusieurs horizontalement synchronisé divs est présent, mais il fonctionne pour les divs avec la même largeur.
NB: Uniquement pour les divs avec la même largeur
JSFiddle