2016-04-14 3 views
1

У меня возникают некоторые проблемы, пытающиеся плавно прокручивать элемент, используя ванильный JavaScript.Плавно прокручивается элемент с помощью ванильного JavaScript.

У меня есть одностраничный сайт с 3 ссылками. Когда я нажимаю одну из ссылок, я хочу гладкую прокрутку к разделу, который он представляет. У меня версия jQuery, и это отлично работает, но я хотел бы узнать, как добиться того же результата с помощью ванильного JavaScript.

Вопрос задан раньше, но ответы немного сложны. Я считаю, что для этого должен быть более чистый и легкий ответ.

Спасибо.

JQuery код:

$('a').click(function(){ 
    $('html, body').animate({ 
     scrollTop: $($(this).attr('href')).offset().top 
    }, 1000); 
    return false; 
}); 
+0

Что именно неправильно Предоставлять скрипку. –

+0

Я хотел бы получить тот же результат, что и код jQuery, но используя ванильный Javascript. Я не могу понять, как его достичь. Я был бы признателен, если бы кто-то с хорошим знанием Javascript мог написать код. – NoName84

ответ

4

Вам понадобятся некоторые функции замедления для гладкой Vanilla прокрутки расслоения плотных.

Robert Penner является ослабление человек

У меня есть demo on jsbin я сделал некоторое время назад на курс HTML5. Вас могут заинтересовать источники.

демонстрационная функция для прокрутки используется в приведенном выше примере:

function scrollToItemId(containerId, srollToId) { 

     var scrollContainer = document.getElementById(containerId); 
     var item = document.getElementById(scrollToId); 

     //with animation 
     var from = scrollContainer.scrollTop; 
     var by = item.offsetTop - scrollContainer.scrollTop; 
     if (from < item.offsetTop) { 
      if (item.offsetTop > scrollContainer.scrollHeight - scrollContainer.clientHeight) { 
       by = (scrollContainer.scrollHeight - scrollContainer.clientHeight) - scrollContainer.scrollTop; 
      } 
     } 

     var currentIteration = 0; 

     /** 
     * get total iterations 
     * 60 -> requestAnimationFrame 60/second 
     * second parameter -> time in seconds for the animation 
     **/ 
     var animIterations = Math.round(60 * 0.5); 

     (function scroll() { 
      var value = easeOutCubic(currentIteration, from, by, animIterations); 
      scrollContainer.scrollTop = value; 
      currentIteration++; 
      if (currentIteration < animIterations) { 
       requestAnimationFrame(scroll); 
      }  
     })(); 

     //without animation 
     //scrollContainer.scrollTop = item.offsetTop; 

    } 

    //example easing functions 
    function linearEase(currentIteration, startValue, changeInValue, totalIterations) { 
     return changeInValue * currentIteration/totalIterations + startValue; 
    } 
    function easeOutCubic(currentIteration, startValue, changeInValue, totalIterations) { 
     return changeInValue * (Math.pow(currentIteration/totalIterations - 1, 3) + 1) + startValue; 
    } 
+0

Спасибо за ответ michaPau. Не существует ли более простой способ сделать это? – NoName84

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