Жодне з цих рішень не працювало для мене, оскільки мій DOM складний, і я маю динамічну нескінченну сторінку прокрутки, тому мені довелося створити свою власну.
Фон: Я використовую фіксований заголовок та елемент нижче, який тримається під ним, коли користувач прокручує це вниз. Цей елемент має поле введення пошуку. Крім того, у мене додаються динамічні сторінки під час прокрутки вперед і назад.
Проблема: У iOS, щоразу, коли користувач натискає на введені дані у фіксованому елементі, браузер прокручує весь екран до початку сторінки. Це не тільки спричинило небажану поведінку, але й спричинило моє додавання динамічної сторінки вгорі сторінки.
Очікуване рішення: У iOS немає прокрутки (взагалі жодної), коли користувач натискає введення в липкому елементі.
Рішення:
/*Returns a function, that, as long as it continues to be invoked, will not
be triggered. The function will be called after it stops being called for
N milliseconds. If `immediate` is passed, trigger the function on the
leading edge, instead of the trailing.*/
function debounce(func, wait, immediate) {
var timeout;
return function () {
var context = this, args = arguments;
var later = function () {
timeout = null;
if (!immediate) func.apply(context, args);
};
var callNow = immediate && !timeout;
clearTimeout(timeout);
timeout = setTimeout(later, wait);
if (callNow) func.apply(context, args);
};
};
function is_iOS() {
var iDevices = [
'iPad Simulator',
'iPhone Simulator',
'iPod Simulator',
'iPad',
'iPhone',
'iPod'
];
while (iDevices.length) {
if (navigator.platform === iDevices.pop()) { return true; }
}
return false;
}
$(document).on("scrollstop", debounce(function () {
//console.log("Stopped scrolling!");
if (is_iOS()) {
var yScrollPos = $(document).scrollTop();
if (yScrollPos > 200) { //200 here to offset my fixed header (50px) and top banner (150px)
$('#searchBarDiv').css('position', 'absolute');
$('#searchBarDiv').css('top', yScrollPos + 50 + 'px'); //50 for fixed header
}
else {
$('#searchBarDiv').css('position', 'inherit');
}
}
},250,true));
$(document).on("scrollstart", debounce(function () {
//console.log("Started scrolling!");
if (is_iOS()) {
var yScrollPos = $(document).scrollTop();
if (yScrollPos > 200) { //200 here to offset my fixed header (50px) and top banner (150px)
$('#searchBarDiv').css('position', 'fixed');
$('#searchBarDiv').css('width', '100%');
$('#searchBarDiv').css('top', '50px'); //50 for fixed header
}
}
},250,true));
Вимоги: для роботи функцій запуску та зупинки прокрутки потрібен JQuery mobile.
В комплекті є розпирання, щоб згладити будь-яке відставання, створене липким елементом.
Перевірено в iOS10.