sqr_behr
@sqr_behr

Как сделать плавный скролл по window.scroll() без jquery?

Пишу слайдер на нативном JS. Для того, чтобы не глючили тачи, отрубил их через event.preventDefault() и event.stopPropagation(). Написал свайп для оси X, а вот вернуть нормальный скролл на Y не получается.
Чтобы сделать хоть какой-то скролл - плюсую разницу между текущей и начальной точкой Х к текущей позиции документа... Закидываю изменения топа в touchmove или touchend - плавного скролла нет.

Помогите вернуть скролл :( Или скажите как его сделать плавным?.. JQuery не предлагать.
  • Вопрос задан
  • 1348 просмотров
Решения вопроса 1
deimon260993
@deimon260993
Web-программист
Отлавливай событие скролла мышью, проверяй, в какую сторону мышкой крутит пользователь и вызывай функцию, в которой у тебя есть несколько переменных, допустим:
let scrollValue = 100,; //Величина прокрутки за 1 раз в пикселях
     scrolltime = 60,; //Время прокрутки в секундах
     scrollSpeed = parseFloat(scrollValue/scrollSpeed); //Скорость скролла


А дальше в функции устанавливаешь какой-нибудь setInterval() который будет у тебя раз в секунду , допустим, прокручивать страничку на ScrollValue. Что-нибудь в таком духе. На 100% правильность не претендую, но, думаю, мысль понятна)

Вот есть старенький код, которым я когда-то давно пользовался:

//скролл
function SoftScroll () {
	var _this = this;
	window.onmousewheel = function () { return _this.catchScroll(window.event) };
	this.speed = 0;
	this.current = 0;
	this.time = 100;
	this.direction;
	this.timer = false;
}
SoftScroll.prototype = {
	catchScroll: function (e) {
		this.speed += 100;
		if(e.wheelDelta > 0) this.direction = 'up';
		else this.direction = 'down';
		this.timerScroll();
		return false;
	},
	timerScroll: function () {
		_this = this;
		if(_this.timer == true) return;
		_this.timer = true;
		_this.timerId = setInterval(function () {
			var increment = Math.sqrt(_this.speed) / 2.5;
			_this.current += increment;
			if(_this.current > _this.speed) _this.current = _this.speed;
			var y = -Math.pow(_this.current - _this.speed / 2, 2) / Math.pow(_this.speed / 2, 2) * increment + increment;
			if(_this.direction == 'up') y = -y;
			_this.doScroll(Math.floor(y));
			if(y == 0) {
				_this.timer = false;
				_this.speed = 0;
				_this.current = 0;
				clearInterval(_this.timerId);
			}
		}, 10);
	},
	doScroll: function (scroll) {
		document.body.scrollTop = document.body.scrollTop + scroll;
		document.documentElement.scrollTop = document.documentElement.scrollTop + scroll;
	}
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы
25 нояб. 2024, в 21:54
20000 руб./за проект
25 нояб. 2024, в 21:39
3000 руб./за проект
25 нояб. 2024, в 21:34
7000 руб./за проект