Skip to content

Commit

Permalink
refactor(segment): switch to scrollTo
Browse files Browse the repository at this point in the history
  • Loading branch information
thetaPC committed Sep 19, 2024
1 parent f0ae0fa commit 4b8b19d
Showing 1 changed file with 19 additions and 20 deletions.
39 changes: 19 additions & 20 deletions core/src/components/segment/segment.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -340,39 +340,38 @@ export class Segment implements ComponentInterface {
* scroll container.
*/
const centeredX = activeButtonLeft - scrollContainerBox.width / 2 + activeButtonBox.width / 2;
console.log(centeredX);

/**
* We intentionally use scrollBy here instead of scrollIntoView
* newScrollPosition is the absolute scroll position that the
* container needs to move to in order to center the active button.
* It is calculated by adding the current scroll position
* (scrollLeft) to the offset needed to center the button
* (centeredX).
*/
const newScrollPosition = el.scrollLeft + centeredX;

/**
* We intentionally use scrollTo here instead of scrollIntoView
* to avoid a WebKit bug where accelerated animations break
* when using scrollIntoView. Using scrollIntoView will cause the
* segment container to jump during the transition and then snap into place.
* This is because scrollIntoView can potentially cause parent element
* containers to also scroll. scrollBy does not have this same behavior, so
* containers to also scroll. scrollTo does not have this same behavior, so
* we use this API instead.
*
* scrollTo is used instead of scrollBy because there is a
* Webkit bug that causes scrollBy to not work smoothly when
* the active button is near the edge of the scroll container.
* This leads to the buttons to jump around during the transition.
*
* Note that if there is not enough scrolling space to center the element
* within the scroll container, the browser will attempt
* to center by as much as it can.
*/
// el.scrollBy({
// top: 0,
// left: centeredX,
// behavior: smoothScroll ? 'smooth' : 'instant',
// });

activeButton.scrollIntoView({
el.scrollTo({
top: 0,
left: newScrollPosition,
behavior: smoothScroll ? 'smooth' : 'instant',
inline: 'center',

/**
* Segment should scroll on the
* horizontal axis. `block: 'nearest'`
* ensures that the vertical axis
* does not scroll if the segment
* as a whole is already in view.
*/
block: 'nearest',
});
}
}
Expand Down

0 comments on commit 4b8b19d

Please sign in to comment.