得鹿梦鱼 得鹿梦鱼

模态框的最佳实践

定义

模态框是一个定位于应用视窗顶层的元素。它创造了一种模式让自身保持在一个最外层的子视察下显示,并让主视窗失效。用户必须在回到主视窗前在它上面做交互动作

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>  };