Better

Ethan的博客,欢迎访问交流

团队 UI 样式统一与设计价值观

最近同设计组统一前端样式的一些基本规范,否则不同的设计师容易设计出截然不同的产品,导致产品看上去很山寨。好好阅读了一下 Ant Design 设计部分,理解了背后设计的一些原因,感触还是挺深的。

前言

今天仔细阅读了 Ant Design 的设计部分内容。和代码编写真的是相通的

  • 什么样的代码是好的代码 vs 判断设计的好坏
  • 编程思想与原则 vs 践行设计价值观中行之有效的向导或提示
  • 编程设计模式 vs 设计模式(具体问题的一般解决方案)

全局样式

关于色彩

  • Ant Design 提供了一个色彩生成算法,你只需要选择一个主色,算法会为你生成完整的色板
  • 品牌色
    • 建议选择色板从浅至深的第六个颜色作为主色
    • 交互状态(默认、悬停、点击和不可用
    • 其他应用场景:关键行动点、重要信息高亮、图形化等
  • 功能色:成功、警告、危险、Link(链接)
  • 中性色
    • 合理地选择中性色能够令页面信息具备良好的主次关系,助力阅读体验。
    • 需要考虑深色背景和浅色背景差异
    • 常用场景:文字颜色(标题、主要文字、次要文字、辅助、禁用、展示)、边框颜色、分割线颜色、背景色

关于布局

  • 统一画板:蚂蚁中台设计团队统一的画板尺寸为 1440
  • 适配:根据具体情况判断系统是否需要进行适配,以及哪些区块需要考虑动态布局
  • 网格单位:网格的基数为 8,不仅符合偶数的思路同时能够匹配多数主流的显示设备
  • 关于栅格:采用 24 栅格体系
  • 常用模度:提取了一组可以用于 UI 布局空间决策的数组,他们都保持了 8 倍数的原则、具备动态的韵律感

关于文字

  • 字体
    • 对字体进行统一,力求在各个操作系统下都有最佳展示效果
    • Ant Design 字体家族中优先使用系统默认的界面,同时提供一套利于屏显的备用字体库
    • 数字经常需要进行纵向对比展示,我们单独将数字的字体 font-variant-numeric 设置为 tabular-nums,使其为等宽字体
  • 字号
    • Ant Design 对主字号从 12 上升到 14,以保证在多数常用显示器上的用户阅读效率最佳
    • 字阶的选择尽量控制在 3-5 种之间,保持克制的原则,少即是多
  • 行高:和字体保持一定的关系
  • 字重:微软雅黑没有 500 的字重

关于边框

  • 边框颜色
  • 圆角大小
  • 投影
    • 第 0 层:物体紧贴地面,投影与物体重叠,在界面中不对此层定义阴影值,如输入框
    • 第 1 层:低层级,此时物体被操作(悬停、点击)触发为悬浮状态,操作完成后,悬停状态反馈也跟随消失,物体回归到原有层级中,如卡片悬浮
    • 第 2 层:中层级,物体与基准面的关系是展开并跟随,如下拉面板
    • 第 3 层:高层级,物体的运动和其他层级没有关联,如对话框
  • 阴影值与方向
    • 离地面越远的物体,产生的阴影颜色越淡、模糊度越高、面积越大;反之则颜色更深、模糊度越低、面积越小
    • 阴影方向问题:阴影向下是常规场景的用法。还有向上(底部导航或工具栏)、向左(右边导航栏、抽屉、固定表格栏)、向右(左边导航栏、抽屉、固定表格栏)

特殊的输入框状态:默认、输入结果、提示错误、禁用、获取焦点

设计模式

关于原则

  • 亲密性
    • 纵向间距关系:规定大中小三个间距
    • 横向间距关系:采用栅格布局来排布组件,组件内部间距建议和纵向间距保持一致
  • 对齐
    • 在知觉过程中人们往往倾向于使知觉对象的直线继续成为直线,使曲线继续成为曲线
    • 文案类对齐、表单类对齐、数字类对齐
  • 对比
    • 分清主次关系:注意在一些需要用户慎重决策的场景中,系统应该保持中立,不能替用户或者诱导用户做出判断
    • 总分关系对比:汇总与分项
    • 状态关系对比
  • 重复:针对列表项
  • 直截了当:需要在哪里输出,就要允许在哪里输入,主要指编辑
    • 页内编辑:单击编辑、文字链/图标编辑
    • 利用拖放
  • 足不出户:能在这个页面解决的问题,就不要去其它页面解决
    • 覆盖层:避免滥用 Modal 进行二次确认,应该勇敢的让用户去尝试,给用户机会「撤销」即可
      • 二次确认覆盖层
      • 详情覆盖层
      • 输入覆盖层
    • 嵌入层
      • 列表嵌入层
      • 标签页
    • 流程处理
      • 渐进式展示:基于用户的操作,渐进式展现不同的操作选项
      • 配置程序
      • 步骤条
  • 简化交互:如果用户鼠标移动距离越少、对象相对目标越大,那么用户越容易操作。通过运用上下文工具(即:放在内容中的操作工具),使内容和操作融合,从而简化交互
    • 实时可见工具:某个操作非常重要
    • 悬停即现工具:某个操作不那么重要
    • 开关显示工具:某些操作只需要在特定模式时显示
    • 可视区域 ≠ 可点击区域:当需要增强按钮的响应性时,可通过增加用户点击热区的范围,而不是增大按钮形状,从而增强响应性,又不缺失美感。移动端尤其适用
  • 提供邀请
    • 很多富交互模式,如拖放、行内编辑、上下文工具都有一个共同问题,就是缺少易发现性,因此提供邀请是完成人机交互的关键所在
    • 静态邀请
      • 引导操作邀请:文本邀请、白板式邀请、未完成邀请
      • 漫游探索邀请:介绍新功能
    • 动态邀请
      • 悬停邀请:在鼠标悬停期间提供邀请
      • 推论邀请:用于交互期间,合理推断用户可能产生的需求
      • 更多内容邀请:用于邀请用户查看更多内容
  • 巧用过渡
    • 人脑灰质会对动态的事物(eg:移动、形变、色变等)保持敏感
    • 视图变化中保持上下文
      • 滑入与滑出:可以有效构建虚拟空间
      • 传送带:可极大地扩展虚拟空间
      • 折叠窗口:在视图切换时,有助于保持上下文,同时也能拓展虚拟空间
    • 解释刚刚发生了什么
      • 对象增加:在列表/表格中,新增了一个对象
      • 对象删除:在列表/表格中,删除了一个对象
      • 对象更改:在列表/表格中,更改了一个对象
      • 对象呼出:点击页面中元素,呼出一个新对象
  • 即时反应
    • 查询模式:自动完成、实时搜索
    • 反馈模式:实时预览、渐进式展示、进度指示
    • 点击刷新:告知用户有新内容,并提供按钮等工具帮助用户查看新内容
    • 定时刷新:无需用户介入,定时展示新内容

关于按钮选择

  • 常规按钮:用于非主要动作。如果不确定选择哪种按钮,次按钮永远是最安全的选择
  • 主按钮:突出“完成”、“推荐”类操作;一个按钮区最多使用一个主按钮
  • 文字按钮:弱化的按钮,采用更轻量的按钮样式,可用于需大面积展示按钮场景
  • 图标按钮
    • 需要在较小的空间内展示尽量多的按钮
    • 使用纯图标按钮必须有 Tooltip 提示按钮含义
  • 按钮中添加图标:用于对按钮含义补充解释,提高按钮识别效率
  • 特殊按钮
    • 虚线按钮:引导用户在一个区域内添加内容
    • 危险按钮:警示用户该操作存在风险
    • 幽灵按钮:置于复杂或较深的背景中,避免按钮突兀地破坏背景的整体性
    • 行动号召按钮:最大可以将按钮放宽到与父区域等宽,一个屏幕空间中,建议只有一个行动号召按钮

关于空状态

  • 空状态应给予提示,帮助让用户了解空状态原因,避免产生误解与迷失
  • 给予用户推荐操作提示,帮助用户摆脱空状态

关于结果页

  • 标题构成建议为「对象+动作+结果/状态」或「动作+结果/状态
  • 操作引导建议不超过 2 项,过多操作会对用户选择造成困扰
  • 轻量的反馈不建议使用结果页,可以使用全局提示、警告提示、通知提醒框等交互方式

关于异常页

  • 配图、异常代码/问题、异常描述、建议操作
  • 404、403、500
  • 加载失败:当页面因为网络等各种原因加载内容失败时展示,一般结合重试操作
  • 设计建议:设计页面时不能只关注理想状态,应完整考虑各类突发场景,已防止体验中断
    • 理想状态
    • 部分状态:部分模块不存在或部分内容为空状态
    • 加载状态:用 Spin 或 Skeleton
    • 错误状态:系统错误、无权限等
    • 空状态:内容完全为空的状态,建议使用引导类的空状态提示,如果是新用户参考使用新人引导页。

开放变量

关于变量命名规范

  • 颜色:object-[status]-color-[desc]-[mode]-[index]
  • 大小:object-[lg|md|base|sm|xs|xxs]

阅读 default.less 后总结几个东西

  • 并不是全部的组件都按照规范的定义来,也有一些组件的特殊情况,直接定义写了固定的大小和颜色
  • 关注相对值:比如很多值都是基于 @font-size-base 计算而来
  • antd 认为 border 的设置会占用 padding 的值,因此会看到一些针对水平或垂直的设定使用 @padding-md - 1px 计算的方式
  • antd 总结了三个高度规则,分别为 32/40/24,分别对应组件的 size 参数:default/lg/sm,但只是针对常驻 UI,比如一些通过交互展开的 UI,比如 Select 的下拉内容项,都是写死的 32 的高度(22 的行号 + 上下 5 的补白),其实 antd 有些地方为了满足高度的要求,垂直方向的 padding 是通过计算而来,公式为 (height - fontSize * relativeLineHeight) / 2 - borderWidth

严格来说,除了一些很特殊的情况,都必须使用规范中定义的变量,针对特殊情况,也建议在当前文件顶部先定义好有语义的变量使用

主题定制

修改原则

  • 如果 antd/es/styles/themes/default.less 提供了定制的变量,则优先选择此方式修改
  • 如果上述方式目的达不到,则通过全局样式覆盖的方式(应尽可能少,因为 antd 的迭代可能会改变 className 名称,导致无效。同时也不利于维护)

考虑到不同版本之间(哪怕是小版本更新)还是会有些许差别,直接统一个项目组使用同一个版本的 antd,要升级一起升级

参考统一规则

├── antd.less          # antd 全局样式覆盖
├── antdThemeConfig.js # antd 样式变量的覆盖
├── base.less          # 限定字体族、滚动条等基础样式
├── media.less         # 媒体查询工具,用于设置响应式
├── mixins.less        # 常用的工具:比如溢出省略号、清除浮动等
├── reset.less         # 用于抹平不同浏览器之间的差异
├── variables.less     # 规范定义的变量
├── global.less        # 汇总了对外输出的全局性样式,目前包括 antd.less/base.less/reset.less

总结

定制规范并不是一件难的事情,难的在于一个团队之间,如何保持意识统一并执行。每个成员都会有一些不同的看法,或者并没有严格执行,从而导致规范流于形式,最终草草收场,然后一直反复!



留言