Comment appliquer une règle" smooth scrolling " pour mousewheel, jQuery?

Comment allez-vous? Ma Question:

Comment puis-je contrôler ou spécifier the way un document défile vers la position de désir décrite par la souris scrollwheel, et/ou en saisissant la barre de défilement. Ce que je veux serait de surmonter la méthode par défaut particulière de la page scrolling.

Comme il fonctionne actuellement la page saute à droite à x# de pixels vers le bas par 'entaille' qui est progressé sur le rouleau compresseur. Ou va directement à lorsque vous faites glisser la barre de défilement. Ce que je cherche est une extension simple à jquery qui peut appliquer certaines règles de défilement.Les principes sont simples. Accélération imposée, cela empêcherait la page de se déplacer trop vite sans d'abord accélérer. réglable comme un taux de dans px / sec-avec la possibilité d'appliquer des fonctions d'assouplissement...Il y a un maximum de px/sec que la page peut glisser/déplacer/glisser. et troisièmement, une règle de décélération, appliquée à mesure que la page s'approche de sa position de destination (en %, px?). Cela peut devoir être calculé d'une de nombreuses façons, et peut être plus délicat. c'est-à-dire que lors du défilement des 25 derniers pixels vers la position de destination, la décélération s'applique. Il y a plus... La principale préoccupation pour laquelle je voudrais me préparer serait de s'assurer que les rouleaux de petites pages nous sommes pleinement pris en charge et pas glitchy.

Quelles sont les approches qui pourraient être utilisées pour contrôler le document de cette manière? _kyle

mise à jour::: Merci d'avoir suivi ce Q, Si vous l'êtes. Une Excellente Nouvelle. J'ai trouvé un super plugin qui peut être manipulé pour supporter les effets désirés, yo! J'ai implémenté un conteneur de page entier et j'ai utilisé ce script de Nifty jScrollPane pour commander si vous voulez le défilement de la page http://jscrollpane.kelvinluck.com/fullpage_scroll.html

Il y a déjà une grande différence dans la performance de la page. Chaque rouleau encoche de la roue est un tiers à la moitié des navigateurs natifs de défilement il se déplace plus lentement, ce qui est bien, maussade et réglable.

Nous avons encore de la stalle stalle stalle méthode de déplacement de page.

j'écris moi-même javascript, mais c'est comme si je le réécrivais. Ce que je pense qu'il faut faire, c'est une" queue " construite de pixels à défiler le long d'une page, avec le temps total composé: et puis une empreinte d'animation définie et exécutée en trois phases, une en facilitant l'accélération, la phase maxscrollspeed, et decel phase.

quelqu'un Pourrait-il offrir des suggestions quant à la façon dont nous

  1. détachez le mousescrollwheel de sa fonction native de défiler la page.

  2. écouter pour les crans du mousescroll; et dans le cas d'un Crans: initialiser la fonction pour commencer le mouvement de la page, mais aussi écouter et ajouter des clics d'entaille supplémentaires à "queue" qui est ré-calulé et appliqué au rouleau de la fenêtre remplaçant le totaldistancetoscroll précédent, avant de calculer le totaldistancetoscroll suivant, qui fournit une façon d'anticiper la destination et de décélérer. Les fonctions pour démarrer le mouvement ne voudrait pas être redémarré, parce que des clics d'entaille multiples se produiront probablement en accélérant, mais juste un recalculé quand et où décélérer devrait être appliqué.

désolé de ne pas avoir posté code réel encore, pas exactement sûr où commencer et j'espérais que quelqu'un pourrait savoir si mwintent va travailler pour cela et si oui: pourrait également avoir des idées comment appliquer une décélération au rouleau, qui semble être la seule différence entre l'effet désiré et l'état des plug-ins actuels qui sont similaires.

23
demandé sur Toby 2011-04-06 06:05:40

7 réponses

ce que je voulais faire était de simuler le défilement en douceur du navigateur sur les navigateurs qui ne le supportent pas nativement, l'a éteint par défaut ou a une mauvaise implémentation de celui-ci.

grâce à la réponse de lumbric, j'ai trouvé cette solution:

$(function () {

    var top = 0,
        step = 55,
        viewport = $(window).height(),
        body = $.browser.webkit ? $('body') : $('html'),
        wheel = false;


    $('body').mousewheel(function(event, delta) {

        wheel = true;

        if (delta < 0) {

            top = (top+viewport) >= $(document).height() ? top : top+=step;

            body.stop().animate({scrollTop: top}, 400, function () {
                wheel = false;
            });
        } else {

            top = top <= 0 ? 0 : top-=step;

            body.stop().animate({scrollTop: top}, 400, function () {
                wheel = false;
            });
        }

        return false;
    });

    $(window).on('resize', function (e) {
        viewport = $(this).height();
    });

    $(window).on('scroll', function (e) {
        if (!wheel)
            top = $(this).scrollTop();
    });

});

mettez un peu de contenu sur votre page assez longtemps pour avoir des barres de défilement. Alors utilisez votre souris wheel. Il fonctionne sur tous les navigateurs. J'ai utilisé jQuery-1.7.2 et le plugin mousescroll mentionné dans le le poteau de lumbric.

le step var signifie le nombre de pixels à faire défiler sur chaque événement de la roue de la souris. ~55 pixels est ce que j'ai trouvé être la valeur par défaut sur la plupart des systèmes.

Aussi vous pouvez modifier la vitesse de l'animation, autres que le reste de la logique de code est nécessaire pour obtenir les choses fonctionnent correctement.

modifier: noter que j'ai extrait la fonctionnalité ci-dessus en un confort plugin jquery .

13
répondu simo 2013-04-16 20:16:26

j'ai eu un problème très similaire. J'ai voulu changer la fonction de défilement d'une page normale. Je veux que chaque rouleau soit exactement d'une hauteur spécifique de sorte que la page s'arrête dans des positions très spécifiques seulement.

Je l'ai réalisé de la manière suivante:

1. Plugins Usagés

télécharger et inclure les 2 plugins jQuery suivants et jQuery lui-même:

2. Événement "Mousewheel

la façon la plus simple est d'utiliser le bouchon de la souris de cette façon:

$('body').mousewheel(function(event, delta) { /* code here */ });

la variable delta est alors négative ou positive, selon que la roue a été enroulée vers le haut ou vers le bas. Si vous retournez false je pense que (!) il désactive le rouleau normal.

3. Méthode de défilement

pour faire défiler la page j'ai utilisé scrollTo, mais tout autre plugin (comme Smooth Scroll suggéré dans l'autre réponse) devrait aussi le faire.

4. Code complet

placez ceci dans la partie principale de vous HTML-File:

<script type="text/javascript" src="jquery-1.6.4.min.js"></script>
<script type="text/javascript" src="jquery.scrollTo-1.4.2-min.js"></script>
<script type="text/javascript" src="jquery.mousewheel.min.js"></script>
<script type="text/javascript">
    $(document).ready(function() {          
        $('body').mousewheel(function(event, delta) {
            # This if might not be very elegant!
            if (delta < 0) {
                $('body').scrollTo('+=100', 1500 );
            }
            else
                $('body').scrollTo('-=100', 1500 );

            return false;
        });
    });
</script>

5. Démo

j'ai créé une démo ici: http://pastehtml.com/view/ba0ziusqk.html

4
répondu lumbric 2011-10-09 17:07:53

Vous voulez l'essayer

https://github.com/galambalazs/smoothscroll-for-websites

il a gentil paramètres pour régler l'animation et semble être bien entretenu.

// Scroll Variables (tweakable)
var defaultOptions = {

    // Scrolling Core
    frameRate        : 100, // [Hz]
    animationTime    : 1200, // [ms]
    stepSize         : 80, // [px]

    // Pulse (less tweakable)
    // ratio of "tail" to "acceleration"
    pulseAlgorithm   : true,
    pulseScale       : 4,
    pulseNormalize   : 1,

    // Acceleration
    accelerationDelta : 50,  // 50
    accelerationMax   : 3,   // 3

    // Keyboard Settings
    keyboardSupport   : true,  // option
    arrowScroll       : 50,    // [px]

    // Other
    touchpadSupport   : false, // ignore touchpad by default
    fixedBackground   : true, 
    excluded          : ''    
};
2
répondu Benn 2015-08-28 09:41:55

Karl Swedberg a fait un plugin jQuery appelé Smooth Scroll , qui sonne comme il peut être juste ce que vous recherchez.

1
répondu Alex 2011-04-06 02:10:25

ma solution avec effet Mobile

    <div id="parent">
    <div id="child">aaa aaaaaaaaa aaaaaaaa aaaaaaaaaaaa abbbbbbbbbbbbbbbbb bbbbbbbbbbbbcc ccccccc ccccccccccc cccccccd ddddddd ddd ddddd ddddd dddddddd aaaaaaaaaaaa aaaaaaaa aaaaaaaaaaaa abbbbbbbbbbbbbbbbb bbbbbbbbbbbbcc ccccccc ccccccccccc cccccccd ddddddd ddd ddddd ddddd dddddddd aaaaaaaaaaaa aaaaaaaa aaaaaaaaaaaa abbbbbbbbbbbbbbbbb bbbbbbbbbbbbcc ccccccc ccccccccccc cccccccd ddddddd ddd ddddd ddddd dddddddd aaaaaaaaaaaa aaaaaaaa aaaaaaaaaaaa abbbbbbbbbbbbbbbbb bbbbbbbbbbbbcc ccccccc ccccccccccc cccccccd ddddddd ddd ddddd ddddd dddddddd aaaaaaaaaaaa aaaaaaaa aaaaaaaaaaaa abbbbbbbbbbbbbbbbb bbbbbbbbbbbbcc ccccccc ccccccccccc cccccccd ddddddd ddd ddddd ddddd dddddddd aaaaaaaaaaaa aaaaaaaa aaaaaaaaaaaa abbbbbbbbbbbbbbbbb bbbbbbbbbbbbcc ccccccc ccccccccccc cccccccd ddddddd ddd ddddd ddddd dddddddd aaaaaaaaaaaa aaaaaaaa aaa</div>

        #parent {
        width: 300px;
        height: 300px;
        background-color: #aaa;
        margin: auto auto;
        overflow: hidden;
    }
    #child {
        width: 200px;
        height: 800px;
        background-color: #999;
        margin: auto auto;
        text-align: justify;
        position: relative;
        top: 0;
        -webkit-transition: all 0.5s ease-out;
}




$('#parent').bind('mousewheel', function (e) {
        if (!(e.originalEvent.wheelDelta == 120)) {
            var top = parseInt($("#child").css("top"));
            $("#child").css("top", (top - 100) + "px");
            top = parseInt($("#child").css("top"));
            if (top <= -500) {
                setTimeout(function () {
                    $("#child").css("top", "-500px");
                }, 100);
            }
        } else {
            var top = parseInt($("#child").css("top"));

            $("#child").css("top", (top + 100) + "px");
            top = parseInt($("#child").css("top"));
            if (top >= 0) {
                setTimeout(function () {
                    $("#child").css("top", "0");
                }, 100);
            }
        }
    });

LA DÉMO

1
répondu Cameron A 2013-09-07 06:58:06

voici une bonne solution http://ataredo.com/morphology/lucidscroll /

<script src="file-directory/jquery.js"></script>
<script src="file-directory/lucid.js"></script>

<script>
$(window).on('load', function() {

  $(this).impulse();
});
</script>
1
répondu Irakli Dgebuadze 2015-09-24 12:30:16
var $window              = $(window),
    scrollDistance   = 300,
    scrollSpeed      = 500,
    scrollEffect     = 'swing',
    scrollAmount     = 1,
    smoothScroll;

if (! ('ontouchstart' in document.documentElement) && ! $('body').hasClass('modal-open')) {

        $window.on("mousewheel DOMMouseScroll", function (event) {

            event.preventDefault();

            if (smoothScroll) {

                // Start scrolling while waiting for final scoll amount (user stopped wheeling)
                if (scrollAmount == 1) {
                    var delta = event.originalEvent.wheelDelta / 120 || -event.originalEvent.detail / 3;
                    var finalScroll = $window.scrollTop() - parseInt(delta * (scrollDistance * scrollAmount));

                    $('html, body').stop().animate({ scrollTop: finalScroll }, scrollSpeed, scrollEffect);
                }

                // Increase scroll amount
                scrollAmount++;

                // Clear current timeout
                clearTimeout(smoothScroll);
            }

            // Set animated scroll
            smoothScroll = setTimeout(function() {

                var delta = event.originalEvent.wheelDelta / 120 || -event.originalEvent.detail / 3;
                var scrollTop = $window.scrollTop();
                var finalScroll = scrollTop - parseInt(delta * (scrollDistance * scrollAmount));

                // Reset scroll amoount
                scrollAmount = 1;

                $('html, body').stop().animate({ scrollTop: finalScroll },
                    (scrollSpeed*scrollAmount),
                    scrollEffect
                );

                // Clear timeout holder
                smoothScroll = null;

            }, 100);

        });
}
0
répondu Ronen 2015-05-15 16:52:31