Есть множество решений скролла (прокрутки) на jQwery, но если вы ее не используете то устанавливать ради скролла огромную библиотеку нет смыла, поэтому я решил написать небольшой урок, как сделать плавный scroll на чистом JS без jQwery.
К примеру у нас есть простенькое меню с якорями
<ul id="nav"> <li><a href="#aboutus">О нас</a></li> <li><a href="#products">Товары</a></li> </ul>
Ну и соответственно сами якоря (на странице)
<div id="aboutus">Контент о компании</div> <div id="products">Товары</div>
Для плавного скролла подключаем к документу следующий скрипт
<script>
function anim(duration) {
var temp;
return function(sel) {
cancelAnimationFrame(temp);
var start = performance.now();
var from = window.pageYOffset || document.documentElement.scrollTop,
to = document.querySelector(sel).getBoundingClientRect().top;
requestAnimationFrame(function step(timestamp) {
var progress = (timestamp - start) / duration;
1 <= progress && (progress = 1);
window.scrollTo(0, from + to * progress | 0);
1 > progress && (temp = requestAnimationFrame(step))
})
}
};
var scrollMenu = anim(2000)
</script>
и для того чтобы все начало работать немного модифицируем разметку меню
<ul id="nav" onclick="event.preventDefault()">
<li><a href="#aboutus" onclick="scrollMenu('#aboutus')">О компании</a></li>
<li><a href="#products" onclick="scrollMenu('#products')">Товары</a></li>
</ul>










Спасибо, все прекрасно отрабатывает, но теряюсь на вот этих двух строчках
1 progress && (temp = requestAnimationFrame(step))
не совсем понимаю синтаксис записи, можешь подробнее объяснить их?