jQuery Outils de Défilement avec la Molette de défilement de la position et de stop
Je suis à l'aide de lier/délier pour rouler la molette de défilement sur la base de cette SORTE de réponse:
Je suis tunneling l'événement de l'arbre de delta, pour cibler uniquement les X de la molette de la valeurs. Tous fonctionne bien. Le problème, je vais essayer de les surmonter: je veux simplement défiler vers l'avant/vers l'arrière, UN panneau, puis arrêter le défilement. Actuellement, je suis à la déliaison la roulette de la souris de l'événement immédiatement après le déplacement, et qui empêche efficacement la vitesse de défilement...mais déliaison la roulette de la souris événement aussi les prises de page. Ce que j'ai besoin est d'être en mesure de détecter la première deltaX valeur pour la direction, puis faire un mouvement et d'arrêter d'écouter. Ce que je dois chercher à défilement automatique des réponses? Liaison/déliaison se sent klugy, mais je ne peux pas, pour la vie de moi, de comprendre comment à coup de pied après un mouvement, tout en continuant d'être ensuite capable de faire défiler après que la transition est terminée. Voici mon molette de la souris fonction:
function mouseHandler(event, delta) {
$('.homeScrollable').bind('mousewheel', mouseHandler);
var deltaX = event.originalEvent.wheelDeltaX;
//console.log(event.originalEvent.wheelDeltaX);
if(deltaX <= 0) {
//move forward 1 screen and stop
scrollapi.move(1);
$('.homeScrollable').unbind('mousewheel', mouseHandler);
} else if(deltaX > 0) {
//move backward 1 screen and stop
scrollapi.move(-1);
$('.homeScrollable').unbind('mousewheel', mouseHandler);
}
event.preventDefault();
//Rebind mousewheel event:
$('.homeScrollable').bind('mousewheel', mouseHandler); };
J'ai aussi regardé le réglage d'une minuterie, un la:
jquery molette de la souris plugin: comment tirer une seule fonction de chaque rouleau
qui nous semble extrêmement prometteur, mais no-go. Voici la page du plugin pour ce mec:
http://brandonaaron.net/code/mousewheel/docs
Merci pour le vérifier.
OriginalL'auteur wlangley | 2012-01-04
Vous devez vous connecter pour publier un commentaire.
Depuis les DOM n'offre aucun moyen de différencier entre la première défilement événement déclenché et pour les suivants qui se trouvent être partie de la même défilement de mouvement, nous sommes obligés de penser à des méthodes indirectes de faire la distinction entre eux.
Si vous parcourir rapidement tout élément particulier, un défilement de l'événement est déclenché plusieurs fois dans la séquence. En utilisant le code suivant, nous pouvons avoir une idée de exactement comment ça arrive souvent:
Lorsque vous faites défiler sur que la div, vous obtiendrez une sortie de la console qui ressemble à ceci:
En regardant cette sortie, il semble que le
mousescroll
événements sont généralement tirés à l'intérieur, quelque part entre 20 ms et 60 ms les uns des autres. Pour être sûr, nous allons prendre l'extrémité supérieure à 100 ms. C'est très instructif, parce que nous pouvons l'utiliser pour distinguer entre le défilement des événements qui font partie de la même action, et ceux qui sont susceptibles distinctes et délibérément initiée par l'utilisateur.Ce que vous pourriez faire à partir d'ici est de rendre accessible à l'échelle mondiale 'timestamp' variable, la mise à jour à chaque fois un
mousescroll
événement est déclenché, réussie ou pas. Quelque chose comme ceci:Cela ne tient pas compte de tous les
mousescroll
événements sont déclenchés après l'événement initial qui a précédé tous, mais commence à travailler de nouveau après que l'utilisateur a fait une pause pendant 100 ms.Cela permettrait de résoudre votre problème, sauf si votre
scrollToSomeOtherDiv()
fonction comportait un certain type de temps d'animation. Vous pouvez bien sûr faire une booléenneisAnimating
, et vérifier pour voir si c'est vrai à chaque fois qu'unmousescroll
événement est déclenché (en faisant tourner faux dans un rappel une fois que l'animation est plus).Cela serait, à l'exception qu'elle pourrait fournir un cognement de l'expérience pour l'utilisateur. Quelqu'un qui veut faire défiler deux panneaux rapidement ne sera probablement pas de pause entre les parchemins même après avoir vu l'animation de commencer. Le code ci-dessus va en voir de toutes leurs
mousescroll
événements dans le cadre de la même défilement de mouvement et de continuer à les ignorer!Dans ce cas, vous pouvez simplement utiliser le temps de l'animation en tant que votre seuil. Vous définissez un timeStamp une fois que l'animation est commencé, et puis de les ignorer tous les
mousescroll
événements au cours de cette période de temps. J'ai écrit un exemple ici: http://jsfiddle.net/Sg8JQ/Le code est ici:
J'ai aussi inclus
quietPeriod
qui est au-delà de l'animation de temps pendant laquelle vous souhaitez continuer à ignorermousescroll
événements. Vous pouvez le mettre à 0 si vous souhaitez que le défilement d'être "réactif" dès que l'animation est terminée.Génial! Appel d'un morceau de code "sexy" est autant un compliment que je peux gérer. Je pensais à votre première idée de la conception si - avec le défilement horizontal, vous auriez encore des problèmes avec des gestes sur mac (depuis deux passages de doigts à la fois de défilement et de vous ramener dans l'histoire, Chrome et Safari). Je suis encore à trouver une solution pour que problème.
Avec des valeurs inférieures à 500 (en parlant de animationTime et quietPeriod), ce modèle s'arrête de fonctionner. essayez à nouveau votre jsfiddle à la diminution des valeurs et vous verrez le point où, dans mon esprit, il s'arrête de fonctionner comme prévu. Solution apprécié que tout
Hmm, j'ai donc apporté les valeurs vers le bas (animationTime 200, quietPeriod 0), et il fonctionne comme prévu pour moi. Pourriez-vous être plus précis quant à la façon dont il est défaillante pour vous?
Il me semble que si la souris ou le pavé tactile utilise le défilement à inertie (où le défilement continue une fois que vous avez levé le doigt, lorsque la vitesse de défilement se désintègre à zéro), vous pourriez avoir un comportement inattendu si le quietPeriod est trop faible. Qu'arriverait-il dans ce cas est que vous pouvez déplacer deux div du bas, même si vous "arrêté" de défilement pendant la première défilement de l'animation a lieu. C'est parce que le défilement à inertie n'a pas assez de temps de décroissance à zéro et déclenché un autre (non désirée) de l'animation.
OriginalL'auteur pikappa
Je pense que la solution fournie par "pikappa" est de la pure sexyness.
Pour moi ça marchait très bien sur firefox, mais je faisais l'expérience de "scintillement" pendant le défilement sous Chrome 26.0.x
Un simple sale "patch" à son étonnante code est l'ajout d' "return false;" à ligne 57 et 64 de son JSfiddle
OriginalL'auteur sdrubish
Prendre un coup d'oeil à tout ça et voir ce que vous en pensez. Pour commencer, je ne se lient pas à la roulette de la souris parce que Firefox utilise DOMMouseScroll à la place. Cette utilise également un autre delta gestionnaire qui est l'inverse de celui utilisé par tous les autres navigateurs. Au lieu de les lier à des plugins jQuery scroll événement qui normalise le comportement. Vous pouvez suivre le dernier scrolltop position pour déterminer si l'utilisateur défiler vers le haut ou vers le bas.
Je suis en quelque sorte de faire l'hypothèse que vous animez entre les sections. Est-il une fonction de rappel vous pouvez utiliser pour déterminer si vous devriez être le défilement? J'ai créé un mondial permettant de vérifier si les éléments sont actuellement animation. Si oui, alors nous n'avons pas pris la peine de l'exécution de la fonction. Enfin, j'ai remarqué que la fonction de rappel pour le défilement de l'animation semble déclencher avant la finale de défilement événement se produit, et j'ai donc dû utiliser un setTimeout. Je n'aimais pas ça, mais je ne pouvais pas comprendre comment obtenir ce rappel pour fonctionner correctement.
http://jsfiddle.net/Gj3Qy/
Je me demande si .papillon() peut-être ma baguette magique. benalman.com/code/projects/jquery-throttle-debounce/examples/...
Hmm, je suis coincé. Vous ne savez pas comment vous résoudre ce =(.
Progrès Mental. Je suis allé dans la direction de la tête, avec un local de type boolean et de la minuterie. Il veut travailler, mais le cas de coin sur le Lion et mon Mac souris sont bestiale. Je vais regarder spécial des événements de la souris pour avoir des réponses plus précisément, scrollStop et scrollStart (james.padolsey.com/javascript/special-scroll-events-for-jquery).
Hey c'est cool. Si vous triez quelque chose que je serais ravi de voir le produit final.
OriginalL'auteur mrtsherman
Donc, c'est ce que je suis en train de faire. Il semble que le travail, mais est encore buggé.
Ainsi, alors que l'augmentation de la j'imprime très bien, si je décommentez la si i = 4 ligne d'impression, il ne fonctionne pas correctement (vous pourriez avoir à faire défiler dur si vous utilisez une souris, j'essaie dans mon trackpad). Alors que je le comprends comme je l'augmente en permanence que vous obtenez la valeur de delta, vous n'exécuter quelque chose quand j'ai atteint 4 et réinitialiser uniquement sa valeur si le défilement est arrêtée pour 250ms, ce code semble pour réinitialiser i à 0 au moins deux ou trois fois, donc i==4 exécute deux fois ou trois fois. Peut-être que vous pouvez trouver ce qui se passe. Je m y est presque, il faut juste corriger ce bug.
Essayez d'ajouter quelque chose qui change comme fadeIn, fadeOut effet à l'intérieur que si(i==4) et de plus en plus importantes.
EDIT:
Heres la nouvelle version éditée. La roulette de la souris lien était tellement vieux, cela montre peut-être mieux maintenant. Si vous vous déplacez rapidement, vous le voyez scintillement...
C'est une réponse.
OriginalL'auteur Chandra