Я написал функцию плавной прокрутки javascript, чтобы обеспечить навигацию на одностраничной странице. Код в основном похож на тот, что внизу.
Функция вызывается с количеством пикселей для прокрутки, которое затем делится на 30 шагов, а затем прокручивается в цикле, пока число не будет достигнуто. Таким образом, я попробовал оба варианта зацикливания с setTimeout и requestAnimationFrame.
Он почти идеально работает во всех настольных браузерах, а также на моем телефоне Android, однако Safari и Chrome на устройствах IOS не могут достичь нужной точки. Тестирование с оповещением на каждой итерации показало, что все значения рассчитываются правильно, однако фактическое количество прокрутки не совпадает, в результате чего остановка прокрутки находится в неправильном положении.
Я не могу предоставить демонстрацию, так как это коммерческое приложение в разработке, также я попытался создать упрощенный jsfiddle, но на самом деле это не показывает ошибку, поэтому проблема должна быть связана с чем-то другим (вероятно, фиксированная позиция css, минимальная высота 100vh, обработчики событий прокрутки...?).
Я определенно думаю, что это странное поведение, и другие должны были заметить его раньше. Может ли кто-нибудь дать мне подсказку, что делать?
function scrollstep(dist) {
var n = Math.floor(dist / 30 * (1 - Math.abs(scrstp_dist / dist - 0.5)));
if (Math.abs(scrstp_dist + n) < Math.abs(dist)) {
scrstp_dist+= n;
// alert(n);
w.scrollBy(0, n);
w.requestAnimationFrame( function(timestamp) { scrollstep(dist); } );
} else {
w.scrollBy(0, dist - scrstp_dist);
}
}
window.scrollBy
, который без проблем работает на настольном хроме, но на Android мешает прокрутке пользователя (когда это разовое событие без какого-либо слушателя). Ничего не могу найти, я собираюсь отключить его для мобильных устройств - person GWorking   schedule 23.01.2020