Плавный скролл с scrollSpeed

388
13 апреля 2017, 17:56

Нашел удобный вариант создания плавного скролла с Jquery. Все бы отлично но есть 1 проблема/баг. После обновления странички где-то в центре браузер автоматически перемещает меня туда, но разработчик скрипта видимо это не предвидел и если я крутну колесико мышки перемещаюсь в самое начало страницы.

Я уже сделал попытки исправить это, я нашел что проблема по видимости в переменной root которая всегда изначально 0. Я пробовал задать ей высоту wheelDeltaY или wheelDelta, deltaY, но не работает почему-то.

Вы не могли бы взглянуть на код скрипта и корректировать его? Благодарю за внимание.

Пример на JSFiddle если так будет удобнее, а ниже код по правилам.

$(function() { 
        $.scrollSpeed(100, 450); 
    }); 
	 
	// Plugin: jQuery.scrollSpeed 
// Source: github.com/nathco/jQuery.scrollSpeed 
// Author: Nathan Rutzky 
// Update: 1.0.2 
 
(function($) { 
     
    jQuery.scrollSpeed = function(step, speed, easing) { 
         
        var $document = $(document), 
            $window = $(window), 
            $body = $('html, body'), 
            option = easing || 'default', 
            root = 0, 
            scroll = false, 
            scrollY, 
            scrollX, 
            view; 
             
        if (window.navigator.msPointerEnabled) 
         
            return false; 
             
        $window.on('mousewheel DOMMouseScroll', function(e) { 
             
            var deltaY = e.originalEvent.wheelDeltaY, 
                detail = e.originalEvent.detail; 
                scrollY = $document.height() > $window.height(); 
                scrollX = $document.width() > $window.width(); 
                scroll = true; 
             
            if (scrollY) { 
                 
                view = $window.height(); 
                     
                if (deltaY < 0 || detail > 0) 
             
                    root = (root + view) >= $document.height() ? root : root += step; 
                 
                if (deltaY > 0 || detail < 0) 
             
                    root = root <= 0 ? 0 : root -= step; 
                 
                $body.stop().animate({ 
             
                    scrollTop: root 
                 
                }, speed, option, function() { 
             
                    scroll = false; 
                 
                }); 
            } 
             
            if (scrollX) { 
                 
                view = $window.width(); 
                     
                if (deltaY < 0 || detail > 0) 
             
                    root = (root + view) >= $document.width() ? root : root += step; 
                 
                if (deltaY > 0 || detail < 0) 
             
                    root = root <= 0 ? 0 : root -= step; 
                 
                $body.stop().animate({ 
             
                    scrollLeft: root 
                 
                }, speed, option, function() { 
             
                    scroll = false; 
                 
                }); 
            } 
             
            return false; 
             
        }).on('scroll', function() { 
             
            if (scrollY && !scroll) root = $window.scrollTop(); 
            if (scrollX && !scroll) root = $window.scrollLeft(); 
             
        }).on('resize', function() { 
             
            if (scrollY && !scroll) view = $window.height(); 
            if (scrollX && !scroll) view = $window.width(); 
             
        });        
    }; 
     
    jQuery.easing.default = function (x,t,b,c,d) { 
     
        return -c * ((t=t/d-1)*t*t*t - 1) + b; 
    }; 
     
})(jQuery);
<!DOCTYPE html> 
<html><head> 
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script> 
 
</head> 
<body> 
    <h1><b>jQuery.scrollSpeed</b> is a lightweight jQuery extension for 
    custom scrolling speed in modern web browsers. Supports vertical or 
    horizontal scrolling direction, including user-defined easing. 
    Singapore conversation business class, vibrant sharp Swiss Ettinger bespoke 
    Lufthansa discerning Toto handsome. Bulletin sleepy conversation hand-crafted 
    international. Washlet alluring elegant, Sunspel charming vibrant Swiss the 
    best Helsinki liveable lovely Singapore flat white intricate. Boulevard 
    Tsutaya discerning uniforms Zürich Sunspel Ettinger perfect first-class St 
    Moritz bespoke. Cutting-edge bulletin soft power concierge vibrant the 
    best. Ginza charming impeccable, izakaya hand-crafted global Lufthansa soft 
    power. Alluring Fast Lane hub, pintxos St Moritz intricate Nordic wardrobe 
    first-class boutique Boeing 787. Business class carefully curated global, 
    izakaya airport Helsinki Ettinger Melbourne. International cosy liveable 
    Sunspel ryokan Washlet ANA signature joy artisanal. Hand-crafted pintxos 
    bespoke soft power. Charming lovely pintxos Melbourne Toto bureaux 
    Singapore first-class. Impeccable Porter exquisite quality of life 
    liveable. Pintxos boulevard ryokan sophisticated handsome Sunspel Baggu 
    elegant wardrobe signature Zürich hub Ginza eclectic Beams. Airbus A380 
    Shinkansen bespoke, Helsinki Baggu ANA bulletin cutting-edge Swiss Gaggenau 
    elegant hand-crafted Singapore. Marylebone St Moritz emerging espresso 
    Swiss. Conversation boulevard destination Ettinger, Gaggenau St Moritz 
    artisanal sleepy pintxos Beams Shinkansen business class Nordic emerging. 
    St Moritz artisanal eclectic the best, joy Baggu Washlet wardrobe Comme des 
    Garçons vibrant Beams Swiss. K-pop pintxos liveable exclusive the best 
    global smart flat white remarkable Zürich Scandinavian tote bag Baggu 
    hand-crafted. Elegant pintxos Baggu Beams Swiss. Elegant Asia-Pacific 
    pintxos izakaya bespoke, vibrant flat white exquisite. Intricate 
    Scandinavian finest Baggu Gaggenau smart elegant Helsinki Airbus A380 
    Swiss. Bureaux smart Nordic, Lufthansa Ginza Singapore extraordinary 
    cutting-edge ryokan lovely Comme des Garçons perfect liveable joy Muji. 
    Global craftsmanship intricate, flat white Helsinki Winkreative Beams 
    izakaya airport ryokan artisanal Ettinger handsome Toto.</h1> 
 
 </body></html>

Answer 1

попробуйте сделать такую замену

root = $document.scrollTop(),

READ ALSO
Как отобразить блок при клике?

Как отобразить блок при клике?

Имеется блок <div id="block"></div> и 5 ссылок <a href='

212
Замена frameset на div. Проблема верстки

Замена frameset на div. Проблема верстки

Есть старый код с frameПодскажите пожалуйста как разметить используя div и css?

570
Активировать бургер при клике по div js

Активировать бургер при клике по div js

Всем приветИмеется бургер-меню, которое раскрывается при клике на сам бургер, который тоже меняет свою форму на вид крестика

165
Как вывести квадратный участок background через CSS и подстроить его масштаб?

Как вывести квадратный участок background через CSS и подстроить его масштаб?

Есть скриптЯ выделяю область на картинке и хочу вывести превью выделенной области

220