html - Material-ui:如何避免由于滚动条而导致动态内容 "jumping"?

标签 html css material-ui

我有一个浏览器应用程序,可以动态显示比可用屏幕尺寸更短或更长的内容。 在桌面浏览器上,这会导致垂直滚动条出现/消失,从而使内容左右“跳跃”。

为了避免这种情况,我将 style="overflow-y:scroll" 添加到 body 标记中,这会强制滚动条始终显示 - 滚动条只是被禁用如果内容比屏幕短。

当我使用 material-ui SwipeableDrawer 组件显示滑动选项菜单时,问题就出现了。在浏览器检查器中查看 DOM,当显示菜单时,material-ui 似乎主动删除了 body 标记上的 overflow-y 样式,但当它删除菜单时不会将其放回去。

  • Example app发布于 Netlify
  • Source code
  • 下面的屏幕截图显示,当禁用的滚动条可见时,内容首先是稳定的,然后显示菜单显示后内容向左/向右跳跃。

enter image description here

这只发生在桌面上,Chrome 和 Firefox 都会重现。在移动设备(例如 iOS)上不会发生这种情况,因为移动设备上的滚动条显示在内容的“顶部”。

我不想跟踪 material-ui 正在做什么并添加/删除填充 - 我很确定 material-ui 对其他组件执行此行为以及(弹出窗口、工具提示等)跟踪所有这些组件并摆弄填充将很容易出错(更不用说乏味了)。

我能否以某种方式使垂直滚动条显示在内容的“顶部”,就像在移动浏览器中一样?我必须添加填充以确保没有任何内容被遮挡,但至少它是静态的 - 所以一旦问题得到解决,它就会保持不变。

最佳答案

一种可能的解决方法是禁用滚动锁:

<SwipeableDrawer disableScrollLock={true} ... >

这样做的一个缺点是,您必须记住在任何使用具有 disableScrolllock 功能的 material-ui 组件的地方执行此操作 - 这意味着在任何地方您使用弹出窗口、弹出窗口等。

但是您可以覆盖 default props对于组件。以下内容适用于 SwipableDrawer(因为 Drawer 扩展了 Modal):

export const theme = createMuiTheme({
  props: {
    MuiModal: {
      disableScrollLock: true,
    },
  },
});

注意:mui 似乎不再需要 disableScrollLock 设置(即 material-ui 版本 5) >) - 但您仍然需要在根 body 元素或类似位置设置 style="overflow-y:scroll"

关于html - Material-ui:如何避免由于滚动条而导致动态内容 "jumping"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65164654/

相关文章:

javascript - 未捕获的类型错误 : Cannot read property 'injection' of undefined

java - 第二个 servlet 不调用 WebService

css - 如果在 Firefox 中对图像应用 border-box 会发生什么

javascript - THREE.js 的 SVG 路径(坐标)

css - 在 CSS 样式中省略前导 '0' 的好处

node.js - 当我运行 'npm run build' 、 'npm run start' 时组件缺少类,但其他人无法重现该错误

reactjs - 如何在 Material UI/JSS 中定位复杂组件的同级/子级

iphone - 带有 HTML5 Canvas 和 Retina 显示屏的 UIWebView

javascript - HTML5 地理定位不会在 Safari 浏览器上提示输入位置

javascript - 为什么我的主导航显示在两行而不是移动设备上的一行?