-
Notifications
You must be signed in to change notification settings - Fork 48.8k
Disable ScrollTimeline in Safari #33499
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
base: main
Are you sure you want to change the base?
Disable ScrollTimeline in Safari #33499
Conversation
Comparing: a947eba...0923474 Critical size changesIncludes critical production bundles, as well as any change greater than 2%:
Significant size changesIncludes any change greater than 0.2%: (No significant changes) |
const supportsScrollTimeline = | ||
typeof ScrollTimeline === 'function' && | ||
(ua.indexOf('Safari') === -1 || | ||
(ua.indexOf('iPhone') === -1 && ua.indexOf('iPad') === -1)); |
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.
Instead of special casing iOS we might be able to deopt to the polyfill only if a touch event has happened before we start.
e0c0aba
to
79d5399
Compare
This basically lets a custom implementation drive the Animation we start on pseudo-elements.
79d5399
to
0923474
Compare
Stacked on #33501.
This disables the use of ScrollTimeline when detected in Safari in the recommended SwipeRecognizer approach. I'm instead using a polyfill using touch events on iOS.
Safari seems set to release ScrollTimeline soon. Unfortunately it's not really what you'd expect.
First of all, it's not running in sync with the scroll which is kind of its main point. Instead, it is running at 60fps and out of sync with the scroll just like JS. In fact, it is worse than JS because with JS you can at least spawn CSS animations that run at 120fps. So our polyfill can respond to touches at 60fps while gesturing and then run at 120fps upon release. That's better than with ScrollTimeline.
Second, there's a bug which interrupts scrolling if you start a ViewTransition when the element is being removed as part of that. The element can still respond to touches so in a polyfill this isn't an issue. But it essentially makes it useless to use ScrollTimeline with swipe-away gestures.
So we're better off in every scenario by not using it.
The UA detection is a bit unfortunate. Not sure if there's something more specific but we also had to do a UA detection for Chrome for View Transitions. Those are the only two we have in all of React.