2016-09-07 2 views
1

У меня возникли проблемы с пониманием того, почему мой toggleClass внутри функции после того, как анимация не срабатывает должным образом. Когда вы смотрите на консоль, вы увидите, что элемент menu меняет состояния, что заставляет меня думать, что он быстро и быстро переключается. Как только анимация прокрутки завершается, toggleClass работает так, как ожидается.Переключение класса после завершения анимации JQ

Мой код скрипта выглядит следующим образом:

$(document).ready(function() { 

    // initToggle(); 
    stickyNav(); 
    toggleMenu(); 

    }); 

    function stickyNav() { 

     var navOffset = $('.nav-bar').offset().top; 

     $(window).scroll(function() { 
      var nav = $('.nav-bar'); 
      var scroll = $(window).scrollTop(); 

      if (scroll >= navOffset) { 
       nav.addClass('fixed'); 
      } else { 
       nav.removeClass('fixed'); 
      } 
     }); 
    } 

    function toggleMenu() { 
     $('.nav-menu').click(function() { 
      if (!$('.nav-bar').hasClass('fixed')) { 
       $('html, body').animate({scrollTop: $('.nav-bar').offset().top}, '800', 
       function() { 
        $('.menu').toggleClass('active'); 
        $('body').toggleClass('no-scroll'); 
       }); 
      } else { 
       $('.menu').toggleClass('active'); 
       $('body').toggleClass('no-scroll'); 
      } 
     }); 
    } 

HERE is a "working" codepen of my code which better displays the issue I'm having.

+0

Что * точно * вы ожидаете произойдет? Перечислите, что вы ожидаете, что происходит **, и шаги, которые нужно предпринять, чтобы увидеть проблему. –

+0

Я считаю, что ваша анимация срабатывает дважды, один раз для 'html' и один раз для' body'. – showdev

+0

@showdev Именно это и было проблемой. Мальчик, я чувствую себя глупо, учитывая, что я даже упомянул, что он стрелял дважды, но не мог понять, почему. Кроме того, ваш второй комментарий, касающийся 'when' и' then', действительно опрятен. Не уверен, что это абсолютно необходимо в этом случае, поскольку я дважды звонил в анимацию, но может быть полезен в будущем. Большое спасибо за помощь! – ekfuhrmann

ответ

0

@showdev связан с подобным вопросом, связанных с использованием promise().

Есть скрипт для работы, изменив его следующим образом:

function toggleMenu() { 
    $('.nav-menu').click(function() { 
     if (!$('.nav-bar').hasClass('fixed')) { 
      $('html, body').animate({scrollTop: $('.nav-bar').offset().top}, '800').promise().done(function() { 
       $('.menu').toggleClass('active'); 
       $('body').toggleClass('no-scroll'); 
      }); 
     } else { 
      $('.menu').toggleClass('active'); 
      $('body').toggleClass('no-scroll'); 
     } 
    }); 
} 
+0

Согласно [этому сообщению] (http://stackoverflow.com/questions/19303405/difference-between-html-body-animate-and-body-animate), могут возникнуть проблемы с совместимостью браузера при использовании только одного из селекторов , – showdev

+0

Да, я использовал ссылку, которую вы предложили, и получил ее для работы через 'prom(). Я собираюсь отметить ваш дубликат как правильный ответ. Еще раз спасибо! – ekfuhrmann

Смежные вопросы