发布于 2026-01-06 0 阅读
0

全屏移动模式。这能有多难?

全屏移动模式。这能有多难?

想象一下,你需要实现一个移动端友好的表单,除了传统的输入框之外,你还需要实现全屏无限循环日历和全屏下拉框。我们来聊聊“全屏”吧。你觉得这有多难?应该不难——只要用一个带有 z-index 和固定定位的全屏 div 就行了。对吧?我也是这么想的。

尝试次数 1

在线示例

让我们使用div能够覆盖整个屏幕的选项

.FullScreenOne {
  position: fixed;
  bottom: 0;
  left: 0;
  right: 0;
  top: 0;
  z-index: 1;
  background: #fff;
}
Enter fullscreen mode Exit fullscreen mode

它能正常工作,但用户可以TabiOS 中可以使用)将光标移出模态框。

第二次尝试

在线示例

使用ReachDialog(作为之前解决方案的补充)。Dialog这将对aria-hidden根节点上document.body除当前活动对话框之外的所有节点进行设置。这样可以将虚拟光标限制在对话框内。

附注:我尝试了react-focus-lock,但它在 iOS 中不起作用(我是指对于)。

除了用户想要滚动模态框的内容时,其他情况下都能正常工作,但用户滚动到模态框后面的内容时,却会出现问题。

第三次尝试

在线示例

ScrollLocky(除了之前的解决方案之外)使用此方法ScrollLocky可以阻止与页面其余部分的任何交互,方法是借助body 元素上的 `<body>` 标签react-lockyposition: relative

除了用户向下滚动时移动版 Safari 的底部边框被隐藏之外,其他情况下都能正常工作;但之后可以通过某种方式触发底部边框的显示,导致部分模态框被隐藏。

第四次尝试

在线示例

(在之前解决方案的基础上)使用此方法mobile-safari-fullscreen。它会在模态框打开时始终强制显示浏览器底部边框。

附注:WindowSize也可以使用其他方法mobile-safari-fullscreen。我认为这是更优的解决方案,这个演示更多是为了展示可能出现的极端情况。

<WindowSize>
  {({ height }) => (
    <ul style={{ height }}>
      <li />
    </ul>
  )}
</WindowSize>
Enter fullscreen mode Exit fullscreen mode

结论

正是这些小细节让前端开发既充满挑战又趣味十足。如果你喜欢这篇文章,不妨看看我关于网页图片用户体验的文章

PS: 不同浏览器的焦点处理方式有所不同。最明显的是移动版 Safari,它不允许将焦点放在链接和按钮上¯\_(ツ)_/¯

请查看此 GitHub 仓库以获取本文的完整代码。

请在推特GitHub上关注我

文章来源:https://dev.to/stereobooster/fullscreen-mobile-modal-how-hard-can-it-be-7mj