我有一个简单的html布局与按钮连接到Mui Menu,我想添加一个div以上的按钮.如下面的简短示例所示:

<div id='initially-not-rendered-div'
 style={{ height: "50px", width: "200px", backgroundColor: "blue" }}
/>
<Button>
        Dashboard
</Button>
<Menu>
    <MenuItem></MenuItem>
    <MenuItem></MenuItem>
</Menu>

如果菜单按钮部分脱离屏幕,如下图所示:

Layout before shifting

菜单会使屏幕稍微向上滚动,这样按钮就完全可见了.

我的问题是,当我在滚动后的菜单上方添加div,然后关闭菜单时,在大多数情况下,屏幕滚动会跳到屏幕中间的某个地方,如您在那里看到的:

enter image description here

你可以试试full problem example here美元.只需滚动第一张图片中所示的按钮,然后单击它并关闭菜单.

在谷歌Chrome上进行了测试.

我试着用来修复它

事件.预防默认(); Vent.stopPropagation();

在我的代码中的所有点击事件上(就像你在codesandbox link中看到的那样),但它没有帮助.

我怎样才能摆脱这种由Menu引起的自动滚动行为?

推荐答案

这太有趣了!

我首先怀疑了一个与焦点相关的场景:

  1. 单击
  2. 此时将出现新元素,并在视口外按下按钮
  3. 菜单已关闭
  4. MUI恢复焦点在按钮上,该按钮被带回视区中心

然而,即使在添加了PopoverModal组件(在Menu中可用)中与焦点相关的props 之后.例如,这并没有改变任何事情.也许我做错了.

无论如何,我找到了一个解决办法:

  1. 工作(避免关闭时的大滚动)
  2. 通过限制不需要的滚动来改进用户体验(并且不会影响辅助功能)

The workaround is to scroll back the page by the added element height BEFORE closing the menu

  const handleClose = (e) => {
    if (!showNewEl) {
      setShowNewEl(true);
      window.document.documentElement.scrollTop += HEIGHT;
    }
    setAnchorEl(null);
  };

这是您的Sandbox 的一个fork ,演示了上面的内容:https://codesandbox.io/s/fast-sun-vtt2z4?file=/Demo.js

Reactjs相关问答推荐

CSS转换不适用于React MUI对象

在React Create App TS项目中安装material UI

如何隐藏移动导航栏后面的向下滚动图标和文本?

react :输入失go 焦点,输入一个字符,

获取更多数据后更新 DOM,而不刷新 React.js 中的页面

如何在我的自定义主题中样式化MUI TreeItem组件

i18next中复数键的理解

如何根据用户在react.js中的 Select , Select 多个心形图标?

BrowserRouter改变了URL但没有链接到页面

React Router v6 路径中的符号

卸载 React 组件时未清除本地存储项目

VideoSDK api 不使用更新状态

当 React 中的状态发生变化时如何停止重新加载谷歌 map ?

DatePicker MUI 如何在日历左侧显示清除文本

如何通过 React JS 中的映射将新元素添加到对象数据数组中

动态添加或删除文本输入字段并将值设置为 React JS 中主要状态的数组

渲染的钩子比预期的少.这可能是由 React Hooks 中意外的提前返回语句引起的

将 Material UI 菜单渲染为

如何在 React 中的 Material Ui 多选中设置默认值?

在 redux 状态更改时更新react 按钮禁用状态