-
Notifications
You must be signed in to change notification settings - Fork 184
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
fix(ModalRoot/ModalPage/PullToRefresh): Disable native pull-to-refresh #6004
fix(ModalRoot/ModalPage/PullToRefresh): Disable native pull-to-refresh #6004
Conversation
Use overscrollBehavior: 'none' on html elemeht when modal open
size-limit report 📦
|
This pull request is automatically built and testable in CodeSandbox. To see build info of the built libraries, click here or the icon next to each commit SHA. Latest deployment of this branch, based on commit 92448d1:
|
e2e tests |
👀 Docs deployed
Commit 92448d1 |
Codecov ReportAll modified and coverable lines are covered by tests ✅
Additional details and impacted files@@ Coverage Diff @@
## master #6004 +/- ##
==========================================
+ Coverage 79.16% 79.21% +0.04%
==========================================
Files 306 305 -1
Lines 9585 9588 +3
Branches 3239 3244 +5
==========================================
+ Hits 7588 7595 +7
+ Misses 1997 1993 -4
Flags with carried forward coverage won't be shown. Click here to find out more.
☔ View full report in Codecov by Sentry. |
Adding class to html when modal is open Adding class to html when PullToRefresh touchstart event fired and remove on touchend/touchcancel
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🔥🔥🔥
добавил пару правок по тексту комментов
стоит иметь ввиду, что overscroll-behavior
с Safaru >= 16 версии поддерживается
@inomdzhon Спасибо за ревью!
Точно же, я так зарылся в проблему, что забыл ещё раз проверить поддержку. |
Co-authored-by: Inomdzhon Mirdzhamolov <[email protected]>
Co-authored-by: Inomdzhon Mirdzhamolov <[email protected]>
As it still possible to trigger native pull-to-refresh with overscroll-behavior: none in mobile Safari
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🤝
#6004) - close #2806 - related #5670 и #5967 * Описание Ещё одна попытка победить нативный pull-to-refresh который периодически появляется при закрытии модалки или в PullToRefresh компоненте. В целом событие `touchmove` на window уже игнорируется, но этого недостаточно, потому что для pull-to-refresh в мобильном Safari хватит и одного обработанного браузером`touchstart`. Используется css свойство [`overscroll-behavior`](https://developer.mozilla.org/en-US/docs/Web/CSS/overscroll-behavior) на `html` элементе. Перепробывал кучу других вариантов с `touchstart/touchmove` событиями, но единственный действенный это превентить `touchstart`. Но тогда перестаёт работать скролл внутри PullToRefresh, а через JS имитировать скролл браузера неблагодарная задача. * Изменения добавил глобальный класс, которые в последствии будут вешаться на `html` элемент при открытии модалки или при взаимодействии с PullToRefresh. Сейчас уже работает наверняка для `PullToRefresh` компонента и покрывает баг в модалках если закрывать окно потянув из `ModalPageHeader`. Используем классы, а не напрямую меняем style, чтобы не думать и не сохранять предыдущие значения `overscroll-behavior`, это также позволяет избавиться от чтения/записи стилей, чтобы не заставлять браузер готовить и пересчитывать для нас CSSOM в момент чтения/записи style. ** ModalPage - устанавливаем `overscroll-behavior-y: none` когда модалка открыта *** PullToRefresh - класс вешается на `html` на событии `touchstart` и убирается в обработчике собитий `touchend/touchcancel`. * Особенности PullToRefresh. Так как убирается bounce-эффект, то страница становится менее отзывчивая (без эффекта) если это единственный компонент на странице и пользователь доскролил до конца страницы. Но зато можно начать наш PullToRefresh даже если страница уже была чуть проскроллена вниз, а пользователь начал тянуть. Раньше можно было вызвать наш PullToRefresh только если страница имеет `scrollTop = 0` в момент начала жеста. Есть вариант добиться `bounce` эффекта когда пользователь доскроли до конца страницы. Например, добавить к уже имеющейся логику в `touchmove` и смотреть в какую сторону в пределах `PullToRefresh` пользователь скроллит, и если это скролл вниз (пальцем снизу вверх), то убирать класс, если снова скролл вверх, то добавлять класс. Но это так себе решение, потому что мы всегда в `touchstart` выставляем класс, и если пользователь сразу скроллит вниз, то получится, что класс добавиться и тут же убереться. Хотя, не сильно хуже чем сейчас, конечно, потому что мы сейчас и так всегда класс добавляем а на touchend/touchcancel убираем. И ещё момент появится, что если пользователь уже доскроллил до конца страницы и попробует поскролить вниз ещё раз, то bounce-эффекта не будет, ведь на touchmove мы не поймём в какую сторону пользователь скролит. Хотя тут можно поиграться. И посмотреть scrollTop значение. 🤔 Вопрос только стоит ли?
#6004) - close #2806 - related #5670 и #5967 * Описание Ещё одна попытка победить нативный pull-to-refresh который периодически появляется при закрытии модалки или в PullToRefresh компоненте. В целом событие `touchmove` на window уже игнорируется, но этого недостаточно, потому что для pull-to-refresh в мобильном Safari хватит и одного обработанного браузером`touchstart`. Используется css свойство [`overscroll-behavior`](https://developer.mozilla.org/en-US/docs/Web/CSS/overscroll-behavior) на `html` элементе. Перепробывал кучу других вариантов с `touchstart/touchmove` событиями, но единственный действенный это превентить `touchstart`. Но тогда перестаёт работать скролл внутри PullToRefresh, а через JS имитировать скролл браузера неблагодарная задача. * Изменения добавил глобальный класс, которые в последствии будут вешаться на `html` элемент при открытии модалки или при взаимодействии с PullToRefresh. Сейчас уже работает наверняка для `PullToRefresh` компонента и покрывает баг в модалках если закрывать окно потянув из `ModalPageHeader`. Используем классы, а не напрямую меняем style, чтобы не думать и не сохранять предыдущие значения `overscroll-behavior`, это также позволяет избавиться от чтения/записи стилей, чтобы не заставлять браузер готовить и пересчитывать для нас CSSOM в момент чтения/записи style. ** ModalPage - устанавливаем `overscroll-behavior-y: none` когда модалка открыта *** PullToRefresh - класс вешается на `html` на событии `touchstart` и убирается в обработчике собитий `touchend/touchcancel`. * Особенности PullToRefresh. Так как убирается bounce-эффект, то страница становится менее отзывчивая (без эффекта) если это единственный компонент на странице и пользователь доскролил до конца страницы. Но зато можно начать наш PullToRefresh даже если страница уже была чуть проскроллена вниз, а пользователь начал тянуть. Раньше можно было вызвать наш PullToRefresh только если страница имеет `scrollTop = 0` в момент начала жеста. Есть вариант добиться `bounce` эффекта когда пользователь доскроли до конца страницы. Например, добавить к уже имеющейся логику в `touchmove` и смотреть в какую сторону в пределах `PullToRefresh` пользователь скроллит, и если это скролл вниз (пальцем снизу вверх), то убирать класс, если снова скролл вверх, то добавлять класс. Но это так себе решение, потому что мы всегда в `touchstart` выставляем класс, и если пользователь сразу скроллит вниз, то получится, что класс добавиться и тут же убереться. Хотя, не сильно хуже чем сейчас, конечно, потому что мы сейчас и так всегда класс добавляем а на touchend/touchcancel убираем. И ещё момент появится, что если пользователь уже доскроллил до конца страницы и попробует поскролить вниз ещё раз, то bounce-эффекта не будет, ведь на touchmove мы не поймём в какую сторону пользователь скролит. Хотя тут можно поиграться. И посмотреть scrollTop значение. 🤔 Вопрос только стоит ли?
h2. Описание В ущерб проблеме, что при сворачивании `ModalPage` и `ModalCard` может вызываться **pull-to-refresh** (см. #3416), удаляем полифил на `overscroll-behavior-y: none` – метод `preventTouch()`. Удалям по причине не работающих скроллов в интерфейсе – они критичная пробелма, т.к. блокирует действия пользователя. В PR #6004 добавили установку `overscroll-behavior-y: none` на `html`, поэтому блокирование **pull-to-refresh** будет в браузерах, где это CSS свойство поддерживается (см. [overscroll-behavior-y | Browser compatibility](https://developer.mozilla.org/en-US/docs/Web/CSS/overscroll-behavior-y#browser_compatibility)). Добавил сноску в документации `ModalRoot/Readme.md` про это ограничение. h2. Изменения - поправил, чтобы `overscroll-behavior-y: none` устанавливался и при первом рендере если `activeModal !== null`; - удалил свойство `documentScrolling`, т.к. уже не нужен – до этого это условие было полезным, чтобы не плодить события `touchmove`.
Описание
Ещё одна попытка победить нативный pull-to-refresh который периодически появляется при закрытии модалки или в PullToRefresh компоненте.
В целом событие
touchmove
на window уже игнорируется, но этого недостаточно, потому что для pull-to-refresh в мобильном Safari хватит и одного обработанного браузеромtouchstart
.Используется css свойство
overscroll-behavior
наhtml
элементе.Перепробывал кучу других вариантов с
touchstart/touchmove
событиями, но единственный действенный это превентитьtouchstart
. Но тогда перестаёт работать скролл внутри PullToRefresh, а через JS имитировать скролл браузера неблагодарная задача.Изменения
добавил глобальный класс, которые в последствии будут вешаться на
html
элемент при открытии модалки или при взаимодействии с PullToRefresh.Сейчас уже работает наверняка для
PullToRefresh
компонента и покрывает баг в модалках если закрывать окно потянув изModalPageHeader
.Используем классы, а не напрямую меняем style, чтобы не думать и не сохранять предыдущие значения
overscroll-behavior
, это также позволяет избавиться от чтения/записи стилей, чтобы не заставлять браузер готовить и пересчитывать для нас CSSOM в момент чтения/записи style.ModalPage
overscroll-behavior-y: none
когда модалка открытаPullToRefresh
html
на событииtouchstart
и убирается в обработчике собитийtouchend/touchcancel
.Особенности PullToRefresh.
Так как убирается bounce-эффект, то страница становится менее отзывчивая (без эффекта) если это единственный компонент на странице и пользователь доскролил до конца страницы.
Но зато можно начать наш PullToRefresh даже если страница уже была чуть проскроллена вниз, а пользователь начал тянуть. Раньше можно было вызвать наш PullToRefresh только если страница имеет
scrollTop = 0
в момент начала жеста.Есть вариант добиться
bounce
эффекта когда пользователь доскроли до конца страницы.Например, добавить к уже имеющейся логику в
touchmove
и смотреть в какую сторону в пределахPullToRefresh
пользователь скроллит, и если это скролл вниз (пальцем снизу вверх), то убирать класс, если снова скролл вверх, то добавлять класс.Но это так себе решение, потому что мы всегда в
touchstart
выставляем класс, и если пользователь сразу скроллит вниз, то получится, что класс добавиться и тут же убереться. Хотя, не сильно хуже чем сейчас, конечно, потому что мы сейчас и так всегда класс добавляем а на touchend/touchcancel убираем.И ещё момент появится, что если пользователь уже доскроллил до конца страницы и попробует поскролить вниз ещё раз, то bounce-эффекта не будет, ведь на touchmove мы не поймём в какую сторону пользователь скролит. Хотя тут можно поиграться. И посмотреть scrollTop значение. 🤔
Вопрос только стоит ли?
Видео
ModalPage
2023-10-17.20.09.26.mov
2023-10-17.19.59.02.mov
PullToRefresh
2023-10-17.19.49.44.mov