Modal
模态框组件为创建对话框、弹出框、灯箱或任何其他内容提供了坚实的基础。
该组件在其子节点之前渲染一个幕布组件。Modal
提供了重要的功能
- 💄 管理模态框堆叠,当一次一个不够用时。
- 🔐 创建一个幕布,用于禁用模态框下方的交互。
- 🔐 它在打开时禁用页面内容的滚动。
- ♿️ 它正确地管理焦点;移动到模态框内容,并将其保持在那里直到模态框关闭。
- ♿️ 自动添加适当的 ARIA 角色。
过渡效果
模态框的打开/关闭状态可以使用过渡组件进行动画处理。此组件应满足以下条件
- 是模态框的直接子代。
- 具有
in
属性。这对应于打开/关闭状态。 - 当进入过渡开始时,调用
onEnter
回调属性。 - 当退出过渡完成时,调用
onExited
回调属性。这两个回调允许模态框在关闭并完全过渡后卸载子内容。
Modal 内置支持 react-transition-group。
或者,您可以使用 react-spring。
性能
模态框的内容在关闭时会被卸载。如果您需要使内容可供搜索引擎搜索,或者在优化交互响应性的同时在模态框内渲染昂贵的组件树,那么启用 keepMounted
属性可能是更改此默认行为的好主意
<Modal keepMounted />
与任何性能优化一样,这不是万能药。请务必首先识别瓶颈,然后尝试这些优化策略。
服务端模态框
React 不支持 服务端的 createPortal()
API。为了显示模态框,您需要使用 disablePortal
属性禁用 portal 功能
服务端模态框
如果您禁用 JavaScript,您仍然会看到我。
局限性
焦点捕获
如果焦点试图逃脱,模态框会将焦点移回组件的主体。
这样做是为了可访问性目的。但是,它可能会产生问题。如果用户需要与页面的另一部分(例如聊天机器人窗口)进行交互,您可以禁用此行为
<Modal disableEnforceFocus />
可访问性
(WAI-ARIA:https://www.w3.org/WAI/ARIA/apg/patterns/dialog-modal/)
请务必添加
aria-labelledby="id..."
,引用模态框标题,到Modal
。此外,您可以使用aria-describedby="id..."
属性在Modal
上提供模态框的描述。<Modal aria-labelledby="modal-title" aria-describedby="modal-description"> <h2 id="modal-title">My Title</h2> <p id="modal-description">My Description</p> </Modal>
WAI-ARIA 创作实践 可以帮助您根据模态框内容将初始焦点设置在最相关的元素上。
请记住,“模态窗口”覆盖在主窗口或另一个模态窗口之上。模态窗口下的窗口是惰性的。也就是说,用户无法与活动模态窗口外部的内容进行交互。这可能会产生冲突行为。
无样式
使用 Base UI Modal 完全拥有组件的设计,无需覆盖 Material UI 或 Joy UI 样式。此组件的无样式版本是需要重度自定义和更小捆绑包大小的理想选择。