material-ui icon indicating copy to clipboard operation
material-ui copied to clipboard

[material-ui][Tabs] End scroll button overlaps last tab when it is the initial value

Open kealjones-wk opened this issue 1 year ago • 10 comments

Steps to reproduce

Link to live example: https://codesandbox.io/p/sandbox/nostalgic-fog-9z6fzy

Steps:

  1. Observe the end scroll button overlapping the initially focused tab.

Current behavior

When the initial value is the last tab of a Tabs component with a scrollable variant the end scroll button overlaps the focused tab.

  • With react-dom ^18.0.0 using ReactDOM.createRoot api (concurrent rendering), this happens but MUCH more intermittently. Hitting refresh on the sandbox demo page a few times will eventually make it happen.
  • With react-dom ^17.0.0 using legacy ReactDOM.render it happens every time.

It seems like it is a race condition between when the scrolling happens and when the scroll buttons are rendered into the dom.

Expected behavior

The end scroll button shouldn't overlap the focused tab on initial render.

Context

I am trying to make the UX of Tabs better. It has made it awkward for users to know the tab is even focused.

Pretty confident it was introduced in 5.14.2 by either: https://github.com/mui/material-ui/pull/36071 or https://github.com/mui/material-ui/pull/38133

Your environment

npx @mui/envinfo
  Don't forget to mention which browser you used.
  Output from `npx @mui/envinfo` goes here.

Search keywords: tabs scrollable focus

kealjones-wk avatar Jan 19 '24 18:01 kealjones-wk

I'd like to help with this. Can I try to solve this issue?

trizotti avatar Jan 22 '24 16:01 trizotti

I tried your code in a playground, @kealjones-wk , but it seems to be working normally, without any overlaping... Here is a gif of the page being loaded: peek It is the exact code you provided, but running in a development playground... I couldn't reproduce the overlap behavior...

trizotti avatar Jan 22 '24 16:01 trizotti

I can reproduce this, as you noted, starting from version 5.14.2.

ZeeshanTamboli avatar Feb 06 '24 08:02 ZeeshanTamboli

I just updated the issue description with some more details and an improved live example to https://codesandbox.io/p/sandbox/nostalgic-fog-9z6fzy which properly demos the issue.

While fixing the demo I noticed some things:

  • With react-dom ^18.0.0 using ReactDOM.createRoot api (concurrent rendering), this still happens but MUCH more intermittently. Hitting refresh on the sandbox demo page a few times will eventually make it happen.
  • With react-dom ^17.0.0 using legacy ReactDOM.render it happens every time.

It seems like it is a race condition between when the scrolling happens and when the scroll buttons are rendered into the dom.

kealjones-wk avatar Feb 06 '24 17:02 kealjones-wk

With react-dom ^18.0.0 using ReactDOM.createRoot api (concurrent rendering), this still happens but MUCH more intermittently. Hitting refresh on the sandbox demo page a few times will eventually make it happen.

@kealjones-wk It does not occur intermittently for me with v18. It happens everytime. Here is the CodeSandbox using react-dom version 18.0.0: https://codesandbox.io/p/sandbox/cocky-marco-fwgy3q.

One thing I noticed is that it doesn't overlap during the initial render, meaning when I first open the CodeSandbox.

ZeeshanTamboli avatar Feb 07 '24 06:02 ZeeshanTamboli

I am facing the same issue. I have also noticed that this behaviour (as in the overlapping) is present in the actual documentation, see here: https://mui.com/material-ui/react-tabs/#automatic-scroll-buttons.

How to reproduce:

  • open the documentation (https://mui.com/material-ui/react-tabs/#automatic-scroll-buttons)
  • click 'expand code'
  • change the value in React.useState(0); to 6 (the index of the last element)
  • -> in the preview box, the text for "Item Seven" is overlapped by the scroll button

Screenshot 2024-03-20 at 16 04 37

What I have noticed during local debugging is that even when I force a scrollIntoView on the last element, it will still be overlapped. However, delaying the scrollIntoView by half a second seems to then scroll correctly and show the last element as expected.

janeisenmenger avatar Mar 20 '24 15:03 janeisenmenger

Sooooooooooooo....

kealjones-wk avatar Aug 12 '24 22:08 kealjones-wk

I can also replicate this issue in 5.15.0 and it was definately not there before

lfpose avatar Apr 07 '25 16:04 lfpose

This issue has been closed. If you have a similar problem but not exactly the same, please open a new issue. Now, if you have additional information related to this issue or things that could help future readers, feel free to leave a comment.

github-actions[bot] avatar Sep 28 '25 10:09 github-actions[bot]

Unfortunately we had to revert the fix due to a bug. Re-opening this issue.

ZeeshanTamboli avatar Oct 02 '25 12:10 ZeeshanTamboli