За последние 24 часа нас посетили 22828 программистов и 1267 роботов. Сейчас ищет 791 программист ...

Выезжающая кнопка 'наверх' - баг.

Тема в разделе "JavaScript и AJAX", создана пользователем ghostcom, 20 авг 2017.

  1. ghostcom

    ghostcom Активный пользователь

    С нами с:
    17 фев 2016
    Сообщения:
    92
    Симпатии:
    2
    Всем привет! Наткнулся в одном приложении на андроид на интересную кнопку наверх. Которая при прокрутке вниз прячется, а при прокрутке навех выезжает. Уверен что фишка не новая и многие уже делали. Все оказалось не так сложно, но вылез некрасивый баг. Если быстро покрутить колесиком вверх-вниз. Кнопка выполняя все действия и еще какое-то время туда-сюда дергается. Раздражает сильно! Возможно ли сделать сброс или остановку предыдущих событий и выполнять последнее действие???

    А те кому понравится пользуйтесь на здоровье)))

    Код (Javascript):
    1. /** Плавная прокрутка "Наверх" */
    2.     var top_show = 150; // В каком положении полосы прокрутки начинать показ кнопки "Наверх"
    3.     var delay = 1000; // Задержка прокрутки
    4.     var tempScrollTop, currentScrollTop = 0;
    5.     $(document).scroll(function(){
    6.         currentScrollTop = $(document).scrollTop();
    7.         if (tempScrollTop < currentScrollTop ){
    8.             //scrolling down
    9.             $('#am-top').slideUp();
    10.         }
    11.         else if (tempScrollTop > currentScrollTop ) {
    12.             //scrolling up
    13.             if ($(this).scrollTop() > top_show) $('#am-top').slideDown();
    14.             else $('#am-top').slideUp();
    15.         }
    16.         tempScrollTop = currentScrollTop;
    17.     });
    18.     // При клике по кнопке "Наверх" попадаем в эту функцию
    19.     $('#am-top').click(function () {
    20.         /* Плавная прокрутка наверх */
    21.         $('body, html').animate({
    22.             scrollTop: 0
    23.         }, delay);
    24.     });
    HTML:
    1.     <div id="am-top">UP</div>
    2. </body>
    Код (CSS):
    1. #am-top {
    2.   position:fixed;
    3.   bottom: 10px;
    4.   right: 10px;
    5.   color: white;
    6.   background: green;
    7.   padding: 10px;
    8. }
    https://jsfiddle.net/ghostcom/4sgaq24L/
     
  2. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.989
    Симпатии:
    759
    это не баг, а нормальное поведение (js делает всё, как ты ему сказал).
    методы slideUp и slideDown последним параметром принимают функцию, которая должна выполниться после завершения анимации.
    Создаешь глобальную переменную, которая будет "разрешать" или "запрещать" выполнение всей функции.
    В начале выполнения анимации - запрещаешь выполнение функции, после завершения - разрешаешь. Вот так.
    --- Добавлено ---
    ну и display:none; - изначально для кнопки. Она же не нужна сразу после загрузки страницы.
     
    ghostcom нравится это.
  3. ghostcom

    ghostcom Активный пользователь

    С нами с:
    17 фев 2016
    Сообщения:
    92
    Симпатии:
    2
    То что нужно! Огромное спасибо. display:none в css прописано.
     
  4. ghostcom

    ghostcom Активный пользователь

    С нами с:
    17 фев 2016
    Сообщения:
    92
    Симпатии:
    2
    Вот что получилось

    Код (Javascript):
    1. /** Плавная прокрутка "Наверх" */
    2.     var top_show = 150; // В каком положении полосы прокрутки начинать показ кнопки "Наверх"
    3.     var delay = 1000; // Задержка прокрутки
    4.     var tempScrollTop, currentScrollTop = 0;
    5.     var allow = true;
    6.     $(document).scroll(function(){
    7.         if ( allow == false ) return;
    8.         currentScrollTop = $(document).scrollTop();
    9.         if (tempScrollTop < currentScrollTop ){
    10.             //scrolling down
    11.             allow = false;
    12.             $('#am-top').slideUp(function(){ allow = true; });
    13.         }else if (tempScrollTop > currentScrollTop ) {
    14.             //scrolling up
    15.             if ($(this).scrollTop() > top_show) { allow = false; $('#am-top').slideDown( function(){ allow = true; }); }
    16.             else { allow = false; $('#am-top').slideUp( function(){ allow = true; }); }
    17.         }
    18.             tempScrollTop = currentScrollTop;
    19.     });
    20.     $('#am-top').click(function () {
    21.         /* Плавная прокрутка наверх */
    22.         $('body, html').animate({
    23.             scrollTop: 0
    24.         }, delay);
    25.     });
     
    TeslaFeo нравится это.