Я создаю одностраничное веб-приложение для мобильных телефонов. Приложение должно реализовывать переходы между "экранами" (как и любое другое мобильное приложение, например Facebook, Twitter), и эти переходы должны быть анимированы (слайд слева направо). Каждый экран должен сохранять свое положение прокрутки между переходами.
Одно очевидное решение, которое приходит в голову, следующее:
Viewport
+----------+
|+--------+| +--------+ +--------+ +--------+
|| DIV1 || | DIV2 | | DIV3 | | DIV4 |
|| || | | | | | |
|| || | | | | | |
|| || | | | | | |
|| || | | | | | |
|+--------+| +--------+ +--------+ +--------+
+----------+
Различные экраны помещаются в контейнеры (DIV1, DIV2,...), которые оформлены в соответствии с экраном (position: absolute; width: 100%; height: 100%; top: 0
) и имеют overflow-x: scroll
. Контейнеры расположены рядом друг с другом, и переход так же просто, как и анимация их свойства left
.
Легко до сих пор.
Проблема заключается в следующем: в этой реализации адресная строка не исчезает в мобильном браузере при прокрутке пользователя.
Я говорю об этой функции:
Это потому, что мобильные браузеры делают это, только если пользователь прокручивает body
- не контейнер в body
. Есть несколько предложений для решения, но они не работают на всех целевых платформах (Android Chrome и собственный браузер, iPhone Safari) и довольно хаки. Я бы хотел сохранить исходное поведение браузера, как есть.
По этой причине - по-видимому - нужно оставить прокрутку на теле. Это означает, что контейнеры должны быть "полноразмерными" (а не переполненными), которые все еще расположены рядом друг с другом. Здесь переходы становятся трудными, если вы думаете об этом.
Мое текущее решение имеет следующие шаги при переходе с DIV1 на DIV2:
- позиция
top
от DIV2 до текущегоscrollTop
окна - оживить свойства DIV1 и DIV2
left
, чтобы DIV2 заполнил экран - переместите DIV2
top
в0
после завершения анимации, чтобы пользователь не мог прокручивать назад дальше, чем верхняя часть этого экрана. - Переместить окно scrollTop в 0
- Скрыть DIV1 (если он длиннее DIV2)
Переход обратно в DIV1 аналогичен, наоборот. На самом деле это работает довольно неплохо (хотя он безумно сложный и использует прослушиватели событий перехода), но, к сожалению, там действительно ужасный мерцающий эффект между шагами 3 и 4 под iOS Safari, потому что он отображает страницу сразу после шага 3, не дожидаясь шага 4.
Я ищу независимую от структуры (vanilla JS).