Уже есть несколько вопросов по теме прокрутки переполнения/резиновой ленты на SO, но
- ни одно из них не обеспечивает решение, работающее во всех случаях на iOS 9.3.2
- ни одна из них не дает исчерпывающей и полной информации о самой проблеме.
поэтому я создал этот пост как совокупность знаний.
Проблема:
Вещь, о которой никогда не упоминалось ни в одной другой записи, заключается в том, что прокрутка переполнения iOS на самом деле является поведением двух частей.
1. Прокрутка содержимого с помощью overflow: auto/scroll
Это общеизвестное и в основном желаемое поведение элемента с -webkit-overflow-scrolling: touch
, где непрерывное/импульсное поведение прокрутки проходит мимо контейнера элементов, чтобы плавно прокручивать прокручиваемый контент.
Это происходит, когда вы прокручиваете содержимое элемента с импульсом, достаточно высоким для прокрутки импульса, чтобы пройти мимо длины прокрученного содержимого.
При таком поведении свойство element.scrollTop
изменяется соответственно на положение прокрутки элементов и меньше или больше, чем максимальная прокрутка (element.scrollHeight - element.offsetHeight
).
2. Прокрутка переполнения <body>
Такое поведение возникает, если вы попытаетесь прокрутить любой элемент, уже находящийся в положении минимальной/максимальной прокрутки, даже дальше этого (элемент сверху вверх или элемент внизу вниз). Затем свиток, кажется, "пузырится" до тега <body>
и прокручивается весь видовой экран.
В противоположность выше здесь свойство element.scrollTop
не изменяется, а вместо него document.body.scrollTop
.
Блокировка фокуса и переключение между режимами (задержка 1,5 с)
Наиболее раздражающим в этом контексте является то, что переключатель между двумя описанными выше типами не переключается мгновенно.
После ввода одного из них вы не можете переключать фокус на любой другой элемент (прокручиваемые элементы, кнопки, ссылки и т.д.), и поэтому поведение прокрутки также не изменяется.
Например:, если вы прокрутите элемент, уже находящийся в верхней позиции вверх, вы введете
overflow scrolling type 2
, и наиболее естественная реакция для пользователя - это попытаться прокрутить назад. Поскольку фокус заблокирован для прокрутки тела вместо перехода наoverflow scrolling type 1
, он остается вtype 2
, и все тело прокручивается вниз. Затем типичный пользователь начинает произвольно прокручивать вверх и вниз часто, не вырываясь изtype 2
.
Переключение фокуса и, таким образом, изменение поведения прокрутки происходит только после завершения анимации переполнения, и элемент стоит на месте (даже немного длиннее [около 0,5 с]).
таким образом, возвращаясь к предыдущему примеру, правильная реакция пользователя заключалась бы в том, чтобы перестать касаться экрана примерно 1 с - 1,5 с, а затем попытаться прокрутить вниз.