Плавная прокрутка на чистом Javascript
Сегодня, на нашем столе функция плавной прокрутки до определенного DOM элемента. Без всяких jQuery и прочей ерунды.

Для начала получим исходные данные:
var
     speed = 0.2, // скорость
     startScroll = window.pageYOffset, // начальная позиция, текущее положение сколла
     element = document.getElementById('test'), // DOM элемент.
     finishScroll = element.getBoundingClientRect().top, // положение элемента по Y относительно окна браузера
     start = null; // тут будем считать затраченное время

Теперь нам нужна функция, которая будет обрабатывать каждый шаг плавной прокрутки. Объявим её ниже, сразу под исходными данными.
function step(time) {
     // в первый кадр запомним время старта
     if (start === null) {
          start = time;
     }
     var 
          progress = time - start,     // определить, сколько прошло времени с начала анимации
          nowScroll = null;              // текущее положение сколла

     // в зависимости от того двигаемся вверх или вниз, определим текущее положение сколла
     if (finishScroll < 0) {
          nowScroll = Math.max(startScroll - progress / speed, startScroll + finishScroll);
     } else {
          nowScroll = Math.min(startScroll + progress / speed, startScroll + finishScroll);
     }
     // прокрутим скролл
     window.scrollTo(0, nowScroll);
     // если прокрутка еще не окончена, повторим шаг
     if (nowScroll != startScroll + finishScroll) {
          requestAnimationFrame(step);     // запланировать отрисовку следующего кадра
     }
}

// Начнем плавную прокрутку
requestAnimationFrame(step);

requestAnimationFrame - планирует и выполняет перерисовку кадра. Выполняется синхронно относительно другой анимации. Скорость до 60 кадров в секунду.

Данная функция вошла в GCF.js версии 3.14, как GCF.scroll.to