模态框的最佳实践
定义
模态框是一个定位于应用视窗顶层的元素。它创造了一种模式让自身保持在一个最外层的子视察下显示,并让主视窗失效。用户必须在回到主视窗前在它上面做交互动作
Modal与Toast、Notification、Message 以及Popover都会在某个时间点被触发弹出一个浮层,但与Modal(模态框)还是有所不同的。定义上看,上述组件都不属于模态框,因为模态框有一个重要的特性,即阻塞原来主视窗下的操作,只能在框内作后续动作。也就是说模态框从界面上彻底打断了用户的操作。
设计好模态框出现的时机,流畅的弹出体验,必要的上下文信息,以及友好的退出反馈,还是完全可以提升体验的。模态框的目的在于吸引注意,但一定需要提供额外的信息,或是一个重要的用户操作,或是一份重要的协议确认。在本页面即可完成流程或信息告知
组成
- 退出的方式
- 描述性的标题
- 按钮的内容
- 大小与位置
- 焦点
- 用户发起
作用
- 抓住用户的吸引力
- 需要用户输入
- 在上下文下显示额外的信息
- 不在上下文下显示额外的信息
合理的使用模态框
- 内容是否相关。模态框是作为当前页面的一种衍生或补充,如果其内容与当前内容毫不相干,那么可以使用其他操作(如新页面跳转)来替代模态框
- 模态框内部应该避免有过多的操作。模态框应该给用户一种看完即走,而且走的流畅潇洒的感觉,而不是利用繁杂的交互留住或牵制住用户
- 避免出现一个以上的模态框。出现多个模态框会加深了产品的垂直深度,提高了视觉复杂度,而且会让用户烦躁起来
- 不要突然打开或自动打开模态框,这个操作应该是用户主动触发的
- 大小。对于模态框的大小应该要有相对严格的限制,如果内容过多导致模态框或页面出现滚动条,一般来说这种体验很糟糕
- 开启或关闭动画。现在有非常多的设计倾向于用动画完成流畅的过渡,让 Modal 变得不再突兀
代码实现注意
业务代码对于有状态或无状态模态框的使用方式存在普遍问题
对有状态模态框来说,很多库会支持 .show 直接调用的方式,那么模态框内部渲染逻辑,会在此方法执行时执行,没有什么问题。不过现在流行无状态模态框Stateless Modal,模态框的显示与否交由父级组件控制,我们只要将模态框代码预先写好,由外部控制是否显示
这种无状态模态框的方式,在模态框需要显示复杂逻辑的场景中,会自然将初始化逻辑写在父级,当模态框出现在循环列表中,往往会引发首屏触发 2-30 次模态框初始化运算,而这些运算最佳状态是模态框显示时执行一次,由于模态框同一时间只会出现一个,最次也是首屏初始化一次,但下面看似没问题的代码往往会引发性能危机
const TdElement = data.mapitem => { return <Td> <Button>详情</Button> <Modal show={item.show} /> </Td> };