1. 先想清楚:CRM的UI到底在解决谁的什么问题
做CRM系统UI设计实战这件事,我前后跟过三个不同规模的项目,从十几个人的小团队到几百人销售队伍的中台系统都趟过一遍。标题里"从线索到订单的全流程可视化",听起来像一句产品口号,但真落到像素层面,它其实是在回答一个非常具体的问题:一个销售在早上九点打开系统,他能不能在三秒内知道今天该先打给谁、这条线索卡在哪、离成单还差哪一步。CRM系统UI设计的难点从来不在于界面好不好看,而在于信息密度和认知负荷之间的平衡——你要把二三十个字段塞进一屏,又不能让用户产生"我在填表格"的抗拒。
这套内容适合谁看?我大概分三类。第一类是刚接手B端产品界面设计的设计师,手上有一堆业务字段但不知道怎么组织;第二类是前端工程师,需要把"线索—商机—订单"这条链路的交互落地;第三类是做销售运营或者业务负责人,想搞清楚一个可用的CRM界面应该长什么样,好在评审会上提得出具体意见。不管你是哪一类,读完至少能拿到一套可以直接抄的页面骨架、几个关键的可视化参数算法,以及我踩过的那些坑。
1.1 三类角色的屏幕时间决定了布局优先级
我见过最常见的失败案例,是设计师把CRM当成一个"数据仓库"来做,所有字段平铺,所有功能入口都摆在导航栏里,结果谁用都别扭。正确的做法是先算一笔账:这个系统里每天在线时间最长的是谁。
通常有三类人。销售代表,一天里可能打开系统十几次,每次停留几十秒到两分钟,动作集中在查线索、记跟进、推进阶段;销售主管,一天看两三次,每次十几分钟,动作集中在看团队漏斗、看异常、分配线索;运营或财务,一天一次甚至一周一次,动作是导出、核对、做报表。这三类人的屏幕时间比例大概是 7:2:1,但很多系统把界面资源平均分配了,导致销售代表最常用的"记录一次跟进"要点四次才能完成。
我的处理方式是把首页做成"今日待办驱动"而不是"数据展示驱动"。销售代表进来先看到的是今天需要跟进的线索列表、即将超时未跟进的红标条目、以及自己本周的成单进度条,而不是一张华丽的团队业绩大屏。大屏留给主管,放在二级入口。这个取舍听起来简单,但它直接决定了首屏的信息架构。
注意:不要因为老板喜欢看大屏,就把大屏放到所有人默认首页。我做过一次这样的妥协,结果销售代表的日均操作步数从 6 步涨到 11 步,两周后投诉量翻倍。
1.2 "可视化"不是画图表,是降低状态查询成本
很多人一看到"全流程可视化",第一反应就是加图表:漏斗图、折线图、饼图、仪表盘全上。但我实际用下来发现,真正让用户觉得"清晰"的,往往不是图表,而是那些把状态直接摆在眼前的小设计。
举个具体例子。一条线索处在"已联系但未确认需求"这个阶段,传统做法是在表格里放一个下拉框显示阶段名,用户得点开才知道下一步该干什么。我改进的做法是在阶段标签后面直接跟一个灰度的"下一步:确认预算"提示,鼠标悬停能看到这个阶段的停留时长和团队平均时长对比。就这么一个小改动,测试里销售代表判断"这条线索该不该催"的时间从平均 8 秒降到了 2 秒。
所以说,可视化的本质是把隐藏的状态变成可见的信号。漏斗图当然有用,但它是给管理者看趋势的;对一线来说,真正管用的是那些嵌在列表行里的进度条、超时标红、阶段小圆点。这两类可视化的服务对象完全不同,不能混为一谈。
1.3 我给自己定的四条设计约束
在动手画任何一个页面之前,我会先把这四条约束写在文档最上面,后面所有设计决策都拿它们来校验。
第一条,单屏信息量上限。列表页默认展示不超过 8 列,详情页首屏不超过 3 个信息区块。超出的字段一律折叠进"更多信息"或者侧边抽屉。这条约束逼着我做优先级排序,而不是把所有字段堆上去。
第二条,核心动作三步内完成。从看到一条线索到完成一次跟进记录,点击次数不超过三次。这个指标我会在原型阶段就数一遍,超了就重做。
第三条,状态永远可见。任何一个页面,用户都应该能一眼看出"我现在在哪条线索的哪个阶段",不需要返回列表去确认。这条催生了后面要讲的顶部流程条设计。
第四条,颜色只表达状态,不表达装饰。整个系统的主色只用在主按钮和当前选中态,红黄绿灰四色只用于业务状态标识,其余地方一律用中性灰阶。这条约束是最容易被破坏的,尤其是当业务方说"这个页面太素了",但只要破一次,状态色的语义就会被稀释。
2. 从线索到订单:先把业务流程拆成可点击的节点
UI设计如果脱离业务流程,画出来的东西一定是散的。我在做这套界面之前,花了整整两天时间跟着销售团队旁听电话、看他们记笔记、看他们在旧系统里怎么绕路操作。这一步不能省,因为它能暴露出文档里永远不会写的真实路径。
2.1 一条线索的完整生命周期
一条线索从进入到成单,中间会经过哪些状态?不同类型的业务差别很大,但通用的骨架大致是这样:线索进入(可能是表单、可能是导入、可能是某个渠道自动进来)→ 初步触达 → 需求确认 → 转为商机 → 报价与谈判 → 赢单或输单 → 转订单履约。
这里有个关键的设计判断:线索和商机到底要不要分成两个对象。有些团队为了简化,把商机当成线索的一个阶段;有些团队坚持拆开,因为两者的字段、权限、统计口径完全不同。我的经验是,如果你们的销售周期超过两周、客单价超过一定量级,就应该拆开。因为线索阶段关注的是"有没有需求",商机阶段关注的是"能不能赢、什么时候赢、赢多少",字段重合度其实不高。拆开之后,界面上就多了一个"转化"动作,这个动作恰好是可视化流程里最需要被强调的节点。
2.2 五个核心页面的职责边界
我把整个链路落成了五个核心页面,每个页面的职责必须单一,否则就会变成"什么都能干但什么都不好用"。
| 页面 | 主要职责 | 关键交互 | 常见误区 |
|---|---|---|---|
| 线索列表 | 批量浏览与筛选 | 筛选、排序、批量分配 | 塞入过多字段导致横向滚动 |
| 线索详情 | 单条线索的完整档案 | 跟进记录、阶段推进、转化 | 信息区块平铺无主次 |
| 商机看板 | 阶段推进的全局视图 | 拖拽换阶段、卡片展开 | 卡片信息过载 |
| 商机详情 | 报价与决策链管理 | 关联联系人、上传附件 | 与线索详情重复建设 |
| 订单确认 | 从商机到订单的落地 | 明细核对、金额校验 | 表单过长无分段 |
这张表我一般会直接放进设计规范的第一页,用来对齐产品和开发的预期。它最大的价值是防止"详情页里再加一个列表"这种惯性思维——每个页面只解决一个问题,用户在哪个页面就该干哪件事。
2.3 状态机设计:让流转规则看得见
流程可视化里最容易被忽略、但最影响体验的,是状态机。什么叫状态机?简单说就是"哪些状态可以跳到哪些状态,跳过去需要满足什么条件"。这件事在代码里是一个枚举加一堆 if,但在界面上,它必须变成用户能看懂的东西。
我的做法是在详情页顶部放一条横向流程条,五个节点:线索、已触达、需求确认、商机、成单。当前节点高亮,已完成的节点打勾,未到达的节点灰显。关键点在于:不允许跳级推进。如果当前是"已触达",用户点"商机"节点是点不动的,鼠标悬停会提示"需先完成需求确认"。这个细节看起来是在限制用户,实际上是在帮他避免数据混乱——我见过太多系统允许随意改阶段,最后漏斗数据全是错的,因为大家为了图省事都直接拖到最后。
流程条下面还要跟一行小字,写清楚"当前阶段已停留 5 天,团队平均 3 天"。这就是前面说的状态可见原则,用户不需要自己去算时间差。
提示:流程条的节点数量控制在 5 到 7 个之间。少于 5 个颗粒度太粗,看不出卡点;多于 7 个用户记不住,反而增加认知负担。如果业务阶段确实很多,用主流程条加子阶段下拉的方式分层展示。
3. 核心页面实操:布局、组件与参数
前面讲的是思路,这一节全是能直接落地的布局和参数。我会把每个页面的栅格、间距、组件尺寸都写清楚,你拿去改改就能用。
3.1 线索列表页:表格优先,卡片兜底
列表页到底用表格还是卡片,这个问题我被问过无数次。结论是:默认表格,移动端或线索数量少的时候用卡片。原因是表格的横向对比效率远高于卡片,销售在扫列表的时候,本质是在做"哪条更值得先跟"的对比决策。
表格的具体参数我是这么定的:行高 56px,这个高度能舒服地放下两行文字(主标题加副信息),又不会让一屏只能看到五六行。列宽采用弹性布局,主列(线索名称加公司)固定最小 240px,状态列固定 100px,其余列按比例分配,最小不低于 80px。表头固定在顶部,横向滚动时左两列冻结,这样用户滚到最右边看"最后跟进时间"时,还能知道自己在看哪条线索。
状态列的呈现我不用纯文字,而是用"色点加文字"的组合:绿色圆点配"已成交",黄色圆点配"跟进中",灰色圆点配"待触达",红色圆点配"已超时"。色点直径 8px,和文字基线对齐。为什么用色点不用整行变色?因为整行变色会破坏表格的阅读节奏,眼睛在彩色块之间跳会累。
还有一个细节值得说:超时条目的处理。我不用红色背景,而是在行首加一条 3px 宽的红色竖条,同时在"最后跟进时间"那一列把数字标红。两个信号叠加,既醒目又不刺眼。测试下来,这种方式比整行标红的识别速度快 40%,而且用户长时间盯着列表不容易疲劳。
批量操作栏怎么放?我的做法是选中任意一行后,表格顶部浮现一条操作条,包含"批量分配""批量打标签""导出"三个动作,右侧显示"已选 3 条"。不选中的时候这条操作条隐藏,把空间还给数据。这是典型的渐进式披露,避免常驻工具栏占地方。
3.2 线索详情页:三段式信息架构
详情页是整个系统里信息最密集的页面,也是最容易做砸的。我用的结构是"顶部流程条 + 左侧主信息 + 右侧辅助信息"的三段式。
顶部流程条高 72px,包含阶段节点、当前阶段停留时长、以及一个主行动按钮。这个主按钮是动态的,当前在"已触达"阶段时显示"记录跟进",在"需求确认"阶段时显示"转化为商机"。按钮只有这一个,颜色用主色,其余次要动作全部收进右上角的"更多"菜单。这是为了强制执行前面定的"核心动作三步内完成"约束。
左侧主信息区占 65% 宽度,从上到下依次是:基本信息卡(公司、联系人、来源、负责人)、跟进记录时间线、附件与报价。右侧 35% 是辅助区:关联联系人列表、标签、以及一个小的"阶段停留对比"条形图,用来说明这条线索在当前阶段比团队平均快还是慢。
跟进记录时间线是我花时间最多的地方。每条记录包含时间、操作人、类型(电话、邮件、拜访、备注)、内容摘要。类型用不同的小图标区分,但颜色统一用中性灰,只有"关键节点"(比如首次报价、合同发送)用主色标注。时间线默认只展示最近 5 条,下面是"查看全部"链接。为什么不默认全展开?因为线索跟了三个月之后,时间线可能有四五十条,全展开会把整个页面撑得没法看。
这里有个实操心得:时间线的倒序还是正序。我一开始用正序(最早的在上),结果用户每次都要滚到底才能看到最新动态。改成倒序之后体验好很多,但会带来另一个问题——新用户不理解为什么最上面是昨天的事。解决办法是在时间线顶部加一个"最新动态"的小标签,明确告诉用户这是倒序。这个小标签成本极低,但解决了认知歧义。
3.3 商机看板:拖拽交互的实操细节
看板是流程可视化里最直观的一块。每一列代表一个阶段,卡片代表商机,用户拖拽卡片就能推进阶段。看起来简单,但做起来坑不少。
先说列宽。我的经验是每列固定 280px,列间距 16px,这样在 1440px 的屏幕上刚好能放下四列多一点,用户能感知到"右边还有内容",自然产生横向滚动的预期。如果列宽做成弹性的铺满全屏,用户反而不知道还有没有更多列。
卡片的信息量要严格控制。我一开始把客户名、金额、预计成交日期、负责人、标签全放上去,结果卡片高得像一堵墙,一屏只能看三四张。后来砍到只剩三行:第一行客户名加金额(金额右对齐,用等宽数字),第二行预计成交日期加负责人头像,第三行是一到两个关键标签。卡片高度固定在 96px,这样一列能放七八张,全局感就出来了。
拖拽交互有几个必须处理的边界情况,我在实际项目里都踩过:
第一个是拖拽后的状态校验。用户把卡片从"需求确认"拖到"成单",系统要不要直接接受?我的做法是拖过去之后弹一个轻量的确认浮层,让用户补填成单金额和成交日期,填完才真正落库。如果不拦,数据里会凭空多出一堆金额为空的订单。
第二个是拖拽的视觉反馈。拖动时原位置留一个虚线占位框,被拖的卡片降低透明度并轻微放大(1.02 倍),目标列高亮边框。这三件事必须同时做,否则用户会觉得"我拖了但不知道拖到哪了"。
第三个是乐观更新与失败回滚。拖拽松手的瞬间界面立刻更新,同时在后台发请求。如果请求失败,卡片要平滑地滑回原位,并弹一个提示。这里最忌讳的是等请求回来再更新界面,那半秒的延迟会让用户以为操作没生效,然后重复拖拽。
注意:看板拖拽在触屏设备上的体验很差,手指滑动容易误触滚动。如果要做移动端适配,建议改成"点开卡片、在弹层里选择新阶段"的方式,而不是硬做拖拽。
3.4 订单转化页:把"确认"做成一次呼吸
从商机到订单这一步,是整条链路上风险最高的动作——金额、明细、折扣、付款方式,任何一项错了都要走复杂的逆向流程。所以这个页面的设计目标不是"快",而是"稳"。
我把页面分成三步,用顶部步骤条展示:第一步核对客户与联系人信息,第二步核对商品明细与金额,第三步确认付款与交付条款。每一步只展示相关内容,用户点"下一步"才进入下一段。这样做的好处是单屏信息量可控,用户不会因为看到一张巨长的表单而产生"随便点点算了"的心态。
商品明细部分用可编辑表格,每行包含商品名、数量、单价、折扣、小计。关键参数是:数量输入框宽度 80px,单价和金额右对齐,小计自动计算且不可编辑,折扣用百分比输入并实时显示折后金额。底部固定一个汇总条,显示商品总额、折扣总额、应付金额,金额用加粗等宽字体,字号比正文大两号。
这里有个我坚持要做的细节:金额的二次校验提示。如果应付金额和商机阶段记录的预计金额偏差超过 15%,页面顶部出现一条黄色提示条,写"当前订单金额与商机预计金额差异较大,请确认"。这不是拦路,只是提醒。上线之后,因金额填错导致的返工单量下降了一半多。
第三步确认页我特意做得"慢"一点:所有关键信息以只读形式再列一遍,主按钮文案写"确认并生成订单",而不是简单的"提交"。同时在按钮下方加一行小字说明"生成后可在订单列表查看并修改履约信息"。这几句文案的作用是降低用户的不确定感,让他知道点下去之后会发生什么。
4. 全流程可视化:漏斗、时间轴与仪表盘
前面三节讲的都是单页面,这一节讲跨页面的可视化。这部分是给管理者看的,但设计不好会反噬一线,所以同样要认真对待。
4.1 销售漏斗的画法与转化率计算
漏斗图几乎是CRM的标配,但我见过太多画错的漏斗。最常见的错误是把漏斗画成"数量堆叠",各层宽度按数量比例缩放,看起来很直观,实际上会误导人——如果第一层是 10000 条线索,第二层是 200 条,那第二层在图上几乎看不见,用户会以为这一层不存在。
我的做法是每层用等高条形,长度按对数比例或者固定分段,同时在每层右侧标注三个数字:本层数量、相对上一层的转化率、相对首层的累计转化率。这样即使数量差距悬殊,每一层都清晰可读,转化率的真实情况也一目了然。
转化率怎么算?我举个具体的例子。假设某月进入线索 1200 条,完成首次触达 720 条,确认需求 360 条,转为商机 180 条,最终成单 54 条。那么相邻转化率分别是 60%、50%、50%、30%,从线索到成单的累计转化率是 4.5%。这四个数字里,最有诊断价值的是"转化率最低的那一环"。上面这个例子里,商机到成单只有 30%,说明报价或谈判环节有问题,而不是线索质量问题。如果反过来,首次触达转化率只有 40%,那就要去看线索来源渠道了。
所以漏斗图不只是展示,它应该带环比对比。我在每层旁边加一个小三角,红色向下表示比上月差,绿色向上表示比上月好,鼠标悬停显示具体数值。这个设计让主管在三十秒内就能定位问题环节,而不需要导出数据再做透视表。
还有一点:漏斗的时间口径必须写清楚。是按"本月新增线索在本月的流转"算,还是按"本月所有发生流转的线索"算?这两种算法结果差很多。我在漏斗图右上角固定放一个口径说明的小问号,点开有详细定义。这件事看着琐碎,但它是数据可信度的基础。
4.2 客户时间轴的信息排布
时间轴这个组件,我建议每个CRM都做一个统一版本,而不是每个页面各画各的。统一版本的好处是用户可以形成肌肉记忆:知道时间在左、内容在右、图标代表类型、主色代表关键节点。
具体的排布参数:时间轴主线在左侧,距离容器左边缘 24px,线宽 2px,颜色用浅灰。节点圆点直径 12px,普通节点是空心圆,关键节点是实心圆加主色。每条记录的内容区距离主线 24px,第一行是标题(操作类型加操作人),第二行是内容摘要,第三行是时间。记录之间的垂直间距 16px,如果两条记录间隔超过一天,中间插入一个日期分隔标签,背景用极浅的灰,文字写"3 月 12 日"。
信息密度上,摘要最多两行,超出部分截断加省略号,点击展开。这个限制很重要,因为销售记的备注有时候是一大段话,全展开会把时间轴撑得乱七八糟。
另外一个容易被忽略的点是时间轴的筛选。客户跟了半年,时间轴上有上百条记录,用户想找"上次报价是什么时候"就得很费劲。我在时间轴上方加了一排筛选标签:全部、通话、邮件、拜访、报价、合同。点击即过滤,选中态用主色下划线。这个功能实现成本不高,但使用频率极高。
4.3 仪表盘指标卡与图表选型
主管的仪表盘我一般放四类内容:核心指标卡、趋势折线、漏斗、以及团队排行。指标卡放最上面一排,四张,分别是本月新增线索、本月成单金额、当前商机总数、平均成交周期。每张卡片的结构是:指标名(小字灰色)、数值(大字加粗,等宽字体)、环比变化(小三角加百分比)。数值字号我用 32px,这是在一屏放四张卡的前提下还能保证可读性的上限。
图表选型上,我有几条自己的规矩。趋势看时间序列,用折线图,不用面积图,因为面积图的填充色会让人误以为是在看累计量。阶段分布用横向条形图,不用饼图,因为饼图在类别超过五个之后就很难比较大小。团队排行用横向条形图加头像,不用柱状图,因为横向排列能放下较长的姓名。
颜色方面,图表里最多用三个色系:主色表示"本期",浅灰表示"上期",橙色表示"预警"。绝对不要在同一个图表里用五种以上颜色,那是给设计稿看的,不是给决策看的。
提示:所有图表都要有"无数据"状态的设计。我见过太多系统在没数据的时候显示一片空白,用户以为是加载失败。正确做法是显示一个灰度的空状态插画加一句"本月暂无数据,可切换时间范围查看"。
5. 设计交付与前端落地:那些评审会上吵不完的细节
设计稿画得再漂亮,落地走样了也是白搭。这一节讲的是怎么让前端把你的想法还原出来,以及怎么处理那些设计稿上体现不出来的问题。
5.1 组件库与设计令牌
我的建议是:不要从零画组件,先盘一遍现有组件库能覆盖多少。大部分企业级前端组件库已经提供了表格、表单、弹层、步骤条、时间轴这些基础件,你要做的是在其上做业务封装,而不是重新发明。
但直接用也不行,因为原生组件的默认样式往往偏"通用",缺少业务语义。所以我会先定义一套设计令牌,也就是颜色、间距、圆角、字号的变量表,然后让前端把这些令牌映射到组件库的主题配置里。这样做的好处是,后面改一次主色,全站同步生效,不用一个个页面去调。
令牌的数量要克制。我一般定 12 个颜色(主色三档、中性灰六档、状态色四个)、6 个间距(4、8、12、16、24、32)、3 个圆角(2、4、8)、5 个字号(12、14、16、20、32)。就这些,够用了。令牌一多,前端记不住,最后还是会写死数值。
业务组件我会额外封装四个:状态标签、金额展示、时间轴条目、流程条。这四个在系统里复用率最高,封装好了能省大量重复工作。特别是金额展示,要处理千分位、货币符号、负数标红、空值显示横杠这些细节,每个页面各写一遍必然会不一致。
5.2 屏幕密度与响应式适配
CRM是典型的重度桌面端系统,但用户屏幕尺寸差异很大,从 1366 到 2560 都有。我的适配策略是以 1440 为基准,做三档断点。
1440 及以上,完整布局,侧边导航展开,详情页左右分栏。1280 到 1439,侧边导航收成图标模式,详情页右栏折叠成抽屉。1280 以下,进入紧凑模式,列表列数减少,看板改成单列纵向滚动。这三档之外不再细分,因为再细分维护成本会失控。
还有一个常被忽略的点:高密度屏幕下的表格行高。在 2K 屏上,56px 的行高看起来会偏矮,因为像素密度高了,视觉上会觉得挤。我的处理是用相对单位而不是固定像素,或者干脆在 2K 以上把行高提到 64px。这个细节不影响功能,但直接影响长时间使用的舒适度。
打印和导出也得考虑。销售经常要把订单详情打印出来给客户签字,如果页面布局是响应式的,打印出来很可能错位。我的做法是单独做一套打印样式,隐藏导航和操作按钮,把关键信息重排成 A4 宽度的两栏,字号统一调大。这套样式写起来不难,但一定要在开发初期就提,不要等上线前才想起来。
6. 常见问题与排查实录
这一节全是我在项目里真实遇到的问题,按出现频率排序,每条都附上排查思路。
6.1 状态不同步:列表显示"跟进中",详情却是"已成交"
这是最高频的问题,本质是缓存和刷新机制没做好。用户从列表点进详情,改完阶段返回列表,列表还是旧数据。排查的时候先看列表是否做了本地缓存,如果做了,返回时有没有触发失效重取。
我的解决方案是三层。第一层,详情页修改成功后,通过一个全局的状态管理把对应条目的数据标记为脏,列表监听到脏标记就静默重取这一条。第二层,列表页在窗口重新获得焦点时做一次轻量刷新,只拉当前页。第三层,给用户一个手动刷新的按钮,虽然大部分时候用不上,但它是兜底的心理安慰。
| 现象 | 可能原因 | 排查步骤 | 解决方向 |
|---|---|---|---|
| 列表与详情数据不一致 | 详情修改后列表缓存未失效 | 检查是否有全局状态同步机制 | 加脏标记与静默重取 |
| 切换标签页后数据不更新 | 页面未监听焦点事件 | 在控制台手动触发焦点看是否重取 | 加焦点刷新 |
| 修改后短暂显示旧值再跳新值 | 乐观更新与请求回填冲突 | 看网络面板请求时序 | 统一以服务端返回为准 |
6.2 权限导致的界面混乱:按钮时有时无
CRM的权限粒度通常很细,谁能看金额、谁能改阶段、谁能导出,都不一样。问题是很多实现是"没权限就隐藏按钮",这会导致不同角色的界面布局完全不同,培训和沟通成本极高。
我的处理原则是:有权限看但没权限操作的,显示为禁用态并给出原因提示;完全没权限看的,才隐藏。比如一个销售助理没有改阶段的权限,流程条照样显示,但节点不可点击,悬停提示"该操作需要主管权限"。这样界面结构稳定,用户也知道自己缺什么权限,而不是一脸茫然地发现"我的界面怎么跟别人不一样"。
按钮的禁用态要做得明显:透明度降到 40%,鼠标指针变成禁止符号,点击时不弹任何东西,只有悬停时出提示。千万不要做成"能点但点了报错",那是最糟糕的体验。
6.3 大数据量下的卡顿:列表滚动像幻灯片
线索量上到几万条之后,列表页如果不做虚拟滚动,浏览器会直接卡死。排查的时候先看 DOM 节点数量,如果一次渲染了上千行,那肯定是没做虚拟化。
解决方案是引入虚拟滚动,只渲染视口内加缓冲区的行,通常 20 到 30 行就够。配套要注意两件事:一是行高必须固定,否则虚拟滚动算不准位置;二是如果表格有合并单元格或者展开行,虚拟滚动的实现会复杂很多,这时候要考虑分页而不是无限滚动。
看板页面的性能问题通常来自拖拽库。如果每张卡片都绑定了完整的拖拽事件监听,卡片一多就会卡。解决办法是用事件委托,在容器上监听一次,通过坐标计算判断拖的是哪张卡。另外卡片内的图片和头像要做懒加载,不要一次性全加载。
还有图表。仪表盘上如果同时放了五六个图表,初始化时会有明显的白屏。我的做法是图表懒加载加骨架屏,进入视口才初始化,初始化前显示一个灰色占位块。这个改动让首屏可交互时间从四秒多降到了一秒出头。
7. 几段踩坑之后才明白的经验
最后说几条不太像"方法论"、但确实是我用真金白银的返工换来的体会。
第一条,不要在设计阶段就追求字段齐全。我第一个CRM项目,光是线索详情页就设计了 47 个字段,觉得"业务可能需要"。结果上线后使用率最高的只有 9 个,其余全是空着。后来我改成先上 15 个核心字段,剩下的通过自定义字段功能让业务自己加,反而用得更顺。字段这件事,永远是少了可以加,多了很难删。
第二条,流程条上的节点名称要用业务的话,不要用系统的词。我们内部把状态叫"stage_2""stage_3",设计稿上直接写"阶段二""阶段三",业务方一看就懵。后来改成"已联系""已报价""待签约",沟通成本立刻降下来。命名这件事看着小,但它是设计和业务之间的翻译层,翻不好后面全是误解。
第三条,一定要做一次真实的跟访。坐在销售旁边看他用一个小时系统,比开十次需求评审会有用。我就是在跟访时发现,销售在打电话的时候根本没法腾出手来点鼠标,全靠键盘快捷键和语音输入。这个发现直接推动我们加了一套快捷键方案,后续的满意度调研里,快捷键是被提到最多的好评点。
第四条,留一个"备注"的万能出口。任何结构化的字段体系都不可能覆盖所有情况,总有一些信息是临时的、非标的。在每个详情页底部留一个大文本备注框,不限制格式,让用户想写什么写什么。这个框看起来很不"设计",但它是用户安全感的来源,也是你后续发现新字段需求的金矿——定期翻一遍备注内容,你就知道下一个版本该加什么字段了。
这套东西没有终点。业务在变,销售的打法在变,界面的重点也会跟着变。我现在做新项目,第一件事还是去旁听电话,而不是打开设计工具。毕竟界面是业务的影子,影子画得再漂亮,也得先有光。