Ладно, парни и девчонки, вот вам, волшебники, хитрый вопрос...
Я работаю над иммерсивным веб-приложением, которое переопределяет поведение сенсорной прокрутки по умолчанию на мобильных устройствах. Содержимое разделено на страницы, которые используют 100% области просмотра, а навигация осуществляется с помощью прокрутки вверх и вниз между страницами.
При первом свайпе я вызываю requestFullscreen()
для элемента body
, что, конечно же, вызывает перекомпоновку при изменении размеров области просмотра. Проблема в том, что я также хочу, чтобы этот первый жест запускал пользовательское поведение прокрутки, но я использую Element.nextElementSibling.scrollIntoView({ block : start, behavior : 'smooth' })
, и пока перекомпоновка не будет завершена, верхний край следующей страницы (HTMLSectionElement
) уже виден, поэтому прокрутка не происходит.
Если я использую setTimeout
, чтобы подождать около 600 мс, пока не завершится перекомпоновка, эффект прокрутки будет работать, как и ожидалось, но мне не нравится этот хакерский обходной путь, и я бы предпочел использовать более элегантное асинхронное решение.
Сначала я попытался вызвать эффект прокрутки изнутри исполнителя resolve
обещания, возвращаемого requestFullscreen, но это не помогло. Это обещание разрешается очень рано в потоке выполнения.
Затем я попытался изнутри обработчика событий fullscreenchange
. Здесь тоже не повезло, так как это событие запускается непосредственно до перехода в полноэкранный режим.
Наконец, я попытался изнутри обработчика событий окна resize
, но это срабатывает до того, как произойдет перекомпоновка. Я также добавил здесь requestIdleCallback
, но это не имело никакого значения.
Итак, мой вопрос: Есть ли какой-либо надежный способ определить конец операции перекомпоновки? Или, альтернативно... есть ли у кого-нибудь план Б получше, чем отказаться от использования scrollIntoView
и написать собственный код? эффект прокрутки в обработчик изменения размера окна.
Fullscreen API
запросы не работают внутриiframe
элементов, поэтому добавить работающий фрагмент проблемы было невозможно. Конкретная проблема, которая у меня была 2 года назад, в любом случае больше не имеет значения, поэтому я, вероятно, перепишу это, чтобы сделать его более общим и полезным вопросом для более широкой аудитории. - person Besworks   schedule 16.03.2021