| 
		
			Сообщение от drkrol
			
		
	 | 
	| 
		В firefox, кстати, шаг одного прокручивания в 2 раза меньше. Даже в 2.5...
	 | 
	
 Это зависит от встроенного шага прокрутки, значит обычная прокрутка там в 2..2,5 раза медленней, по сравнению с тем, что вы обычно в другом месте видели... Эта скорость зависит от настроек ОП системы, в посте №7 я добавил переменную A, которая указывает во сколько раз ускорить встроенный шаг прокрутки...
	
	| 
		
			Сообщение от drkrol
			
		
	 | 
	
		Может если за место 
"transform", "translateY" 
сделать GSAP, то подёргиваний не будет?
	 | 
	
 Какой смысл сюда тащить абстракцию, которая применит то же самый 
transform? Я проверил в Chrome, и в ПК и телефоне оно прокручивается идеально! В Firefox проверил... да, если приглядеться, то оно анимируется по пикселям, это поскольку в Firefox значения дробных пикселей округляются до целого числа. Т. е. не используется субпиксельный рендеринг, можно всё повернуть на 0,001°, чтобы использовался такой рендеринг. 
<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<meta name="viewport" content="width=device-width">
	<title>Document</title>
	<style>
		body {
			background: #20262E;
			font-family: "Helvetica Neue", system-ui;
		}
		.wrap-box {
			width: 290px;
			height: 290px;
			background: #777;
			margin: 10px;
		}
		body,
		html {
			height: 100%;
			margin: 0;
		}
		.wrap {
			overflow: auto;
			border: 1px solid red;
			box-sizing: border-box;
			height: 100%;
			scroll-behavior: unset;
			position: relative;
		}
		.wrap-content {
			overflow: hidden;
			height: 100%;
			position: -webkit-sticky;
			position: sticky;
			top: 0;
		}
		
		.boxes {
			will-change: transform;
			display: inline-block;
			width: 100%;
		}
		
		.height {
			position: absolute;
			top: 0;
			width: 1px;
		}
	</style>
</head>
<body>
	<div class="wrap">
		<div class="wrap-content">
			<div class="boxes"></div>
		</div>
		<div class="height"></div>
	</div>
	<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.js"></script>
	<script>
		$(function() {
			for (var i = 0; i < 100; i++) {
				$(".boxes").append(`<div class="wrap-box">${1 + i}</div>`);
			}
			var T = 0.8; // время до торможения (секунды)
			var A = 5; // во сколько раз уменьшить полосу прокрутки? Лучше всего [1;5]
			var _top = 0;
			var top = 0;
			var height;
			var originalHeight, wrapHeight;
			var scrollTop = 0, _scrollTop = 0;
			var lastTime = performance.now();
			var isScrolling = false;
			
			var wrap = $(".wrap");
			var heightElement = $(".height");
			var boxes = $(".boxes");
			wrap.scroll(function(event) {
				event.preventDefault();
				_top = this.scrollTop;
				wrapHeight = wrap.height();
				if (!isScrolling) loop();
			});
			
			$(window).resize(function() {
				wrapHeight = wrap.height();
				originalHeight = boxes.height();
				height = Math.min(originalHeight - wrapHeight, (originalHeight - wrapHeight) / A) + wrapHeight;
				
				heightElement.css("height", height + "px");
				wrap.scroll();
			});
			
			$(window).resize();
			function loop() {
				isScrolling = true;
				var dt = -lastTime + (lastTime = performance.now());
				var a = 1 - Math.exp(-0.005 / T * dt);
				var p = _top / (height - wrapHeight);
				top = (1 - a) * top + a * _top;
				scrollTop = -top;
				boxes.css("transform", "translateY(" + (scrollTop + p * (A - 1) / A * (wrapHeight - originalHeight)) + "px) rotate(0.0001deg)");
				if (scrollTop !== _scrollTop) {
					requestAnimationFrame(loop);
					_scrollTop = scrollTop;
				} else
					isScrolling = false;
			}
		});
	</script>
</body></html>