返回知识库

界面与交互 · 反馈与临时层

加载器Spinner

表示短时或未知时长等待的小圆环指示器,必须配文字、防重复提交,并在完成或失败后消失。

加载器:转着的小圆环 + 一句在做什么

点「生成周报」,看小圆环出现在周报卡上、配「生成中」文字、按钮禁用防重复点击;完成时圆环消失、结果长在卡片上;切「长等待」看文字厚度差异,切「模拟失败」看停止旋转 + 重试,切「减少动效」看圆环静态化但状态文字仍在。

周报生成 · 实验台状态:未开始
尚未生成 · 点下方按钮开始

原因:尚未发起。下一步:点「生成周报」,周报卡上会出现小圆环和「生成中」文字,按钮同时禁用以防重复点击。

知识点总结

把刚才面板里能直接看到的规律命名下来。

  • 小圆环只表示「在动」:圆环不报完成度——刚才面板里它只转圈,没有百分比;要报完成度用 progress。
  • 必须配文字说明在做什么:短等待配「生成中」即可,长等待补「正在汇总 7 天数据…约需几秒」,不能只留一个光秃秃的圈。
  • 结果长在物件上:完成时圆环消失、周报卡显示真实内容;失败时圆环停止、显示原因——不只靠页脚一句文案。
  • 加载中防重复提交:按钮在 busy 时禁用,避免连点发出多次相同请求。
  • 尊重减少动效:圆环可停止旋转,但状态文字、按钮文案和 live region 仍把「在动 / 完成 / 失败」说清楚,信息不依赖动画。

什么时候用加载器

从等多久、能不能算出进度来判断;不是所有等待都该用 spinner。

  • 适用:短时(约 3 秒内)或未知时长的局部等待——按钮内提交、快速刷新、卡片内即时请求。
  • 改用 progress:等待较长且能算出完成度(导入、上传、安装),给百分比和剩余比无限转圈更安心。
  • 改用骨架屏:等待的是「即将到来的整块内容」(文章、列表、卡片),用骨架给出形状预览,而不是一颗抽象的圈。
  • 不要单独用:超过 3 秒仍只转圈、无文字、无进度,用户会以为卡死;至少补一句在做什么。

怎么把加载器做对

从开始到判断的最短操作链。

  • 视觉:用 CSS 边框圆环(border-radius:50% + 顶弧异色 + animation:rotate),只动 transform,不引发布局抖动。
  • 语义:容器给 aria-busy="true",状态变化写进 role="status" 的 live region;圆环本身 aria-hidden,避免读屏念出无意义符号。
  • 文字:圆环旁永远有一句在做什么;短等待一句标签,长等待补「约需几秒」或改用 progress。
  • 结束条件:完成(圆环消失 + 结果出现)和失败(圆环停止 + 原因 + 重试)是两个明确终态,绝不无限转下去。
  • 减动效:同时实现 prefers-reduced-motion 媒体查询和运行时开关,停止旋转后用文字继续承载状态。

正反例:同一个生成任务要不要给文字 + 失败要不要停

目标都是「告诉用户在等待」,只改一处——是否给文字、失败后是否停止。

正例
生成中…圆环 + 文字 · 完成消失 · 失败重试

圆环配「生成中…」文字,完成时消失、失败时停止并提供重试:用户知道在做什么、何时结束。

反例
(无文字)不知在做什么 · 失败仍无限转 · 像卡死

光秃秃转圈、无文字、失败后仍无限旋转:用户不知在做什么、分不清是卡死还是在动。

快速自测

「生成周报」点下去已过 5 秒还没返回,最合适的反馈是什么?

继续查证

术语的技术定义和行为以这些一手或权威资料为准。

下一步学

和本知识点经常一起出现的概念。