Задать вопрос
@vaskadogana
Frontend developer

Как реализовать анимацию скролла на js, без jq?

Помогите п-ж-та,
делаю горизонтальный скролл, вроде доводчика при скролле на мобильных, чтобы компонент получался в нужной части окна
if(this.startx > this.endx){//touch to right
				this.route.scrollLeft =  this.route.scrollLeft + this.list.children[0].offsetWidth;
			}
			if(this.startx < this.endx){
				this.route.scrollLeft =  this.route.scrollLeft - this.list.children[0].offsetWidth;
			}

читал тут примеры https://learn.javascript.ru/js-animation

если можно, то хотелось бы использовать такой тип анимации
function quad(progress) {
  return Math.pow(progress, 2)
}


не могу сообразить как увязать завязать анимацию на время, чтобы не остановилось раньше времени.
пробую писать, что-то вроде
let curr = this.route.scrollLeft;
		if(this.startx > this.endx){//to right
			let need = this.route.scrollLeft + this.list.children[0].offsetWidth;
			 for(let i = curr; i <= need; i++){
			    let int  = setTimeout( ()=>{
			    	console.log('to right', i, need) 
		   			this.route.scrollLeft = i;
		   		}, 300
		   		)
			}
		}
		if(this.startx < this.endx){//to left
			let need = this.route.scrollLeft - this.list.children[0].offsetWidth;
		   for(let i = curr; i >= need; i--){
		   		let int  = setTimeout( ()=>{
		   			console.log('to left', i, need) 
		   			this.route.scrollLeft = i;
		   		}, 300
		   		)
		  	}
		}
  • Вопрос задан
  • 57 просмотров
Подписаться 1 Простой 3 комментария
Пригласить эксперта
Ответы на вопрос 1
@vaskadogana Автор вопроса
Frontend developer
написал такой вот рабочий код
let curr = this.route.scrollLeft;
		var requestId = 0;
		let now = window.performance.now();
		function quad(progress) {
						  return Math.pow(progress, 2)
						}
		let animate = (time) => {
			 var progress = (time - now) / 200;
			console.log(progress, time - now );
				if(progress>1){
					progress = 1
				}
				
				if(this.startx > this.endx){//to right
				   			this.route.scrollLeft = curr + (this.list.children[0].offsetWidth*progress);
				}
				if(this.startx < this.endx){//to left
				   			this.route.scrollLeft = curr - (this.list.children[0].offsetWidth*progress);
				}
				if(progress == 1){
					stop()
					return
				}
			  requestId = window.requestAnimationFrame(animate);
			}
			function start() {
			 	let animationStartTime = window.performance.now();
			  	requestId = window.requestAnimationFrame(animate);
			}
			function stop() {
			  if (requestId)
			    window.cancelAnimationFrame(requestId);
			  requestId = 0;
		}
		if(Math.abs(this.endx - this.startx) > 10 ){
			start();
		}


если у кого есть получше решение, прошу в комментарии
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
22 дек. 2024, в 20:40
10000 руб./за проект
22 дек. 2024, в 20:34
3000 руб./за проект
22 дек. 2024, в 20:12
10000 руб./за проект