防止在 React 渲染组件上使用 CSS 滚动

新手上路,请多包涵

因此,我通过 React 在我的 html 中呈现一个组件,如下所示:

  <html>
  <body>
    <div id=app>${appHtml}</div>
    <script src="/bundle.js"></script>
  </body>
</html>

在我的应用程序中,我有一个汉堡按钮,即 onClick 全屏显示。

但是,正文是可滚动的。我通常会在 body 标签中添加一个类并使其成为 overflow: hidden 以防止这种情况发生。但是,我的反应组件在 body 标签中呈现,因此我无法控制基于反应组件内点击的切换类。

有没有人对我如何实现我正在寻找的东西有任何想法/建议。

谢谢!

原文由 pourmesomecode 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 317
2 个回答

“我无法控制基于反应组件内点击的切换类。”

不一定是真的!

以“React-ful”方式思考并谨慎修改 DOM 是件好事。您希望避免进行 DOM 操作的主要原因是因为它会导致 React 尝试呈现的内容与您可能尝试进行的未知更改之间发生冲突。但在这种情况下,你不是在操纵 React 正在渲染的 DOM,而是在操纵它的 parent 。在那种情况下,你会完全没问题做这样的事情:

 document.body.style.overflow = "hidden"

要么

document.body.classList.add("no-scroll")

或者任何有效的方法。你是完全安全的,因为 React 只在 #app 中渲染 DOM,而不关心它的父级发生了什么。事实上,许多应用程序和网站仅在页面的一小部分使用 React,以呈现单个组件或小部件,而不是整个应用程序。

除此之外,还有一种更好、更“响应式”的方式来做你想做的事。只需重组您的应用程序,使滚动容器位于您的 React 应用程序中,而不是 body 。该结构可能看起来像这样:

 <html>
  <body>
    <div id="app">
      <div id="scroll-container">
        <!-- the rest of your app -->
      </div>
    </div>
  </body>
</html>

Make body overflow hidden, and body and #app fill the entire screen, and you can control whether #scroll-container allows scrolling or not entirely within反应。

原文由 jered 发布,翻译遵循 CC BY-SA 4.0 许可协议

以上不适用于 iOS 移动设备。

body-scroll-lock 使用 CSS 和 JS 的组合使其适用于所有设备,同时保持目标元素(例如模态)的可滚动性。

IE。对于 iOS,需要检测何时到达目标元素的底部或顶部,然后完全停止滚动

原文由 Will Po 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题