做了多年Axure高保真原型,我最大的一个感受是:Web开发日常用到的组件,翻来覆去其实就那几十个——导航、按钮、表单、弹窗、表格、分页、下拉菜单。真正的差距不在会不会炫技动画,而是手上有没有一套能反复调用的高保真组件库。这篇文章想聊的就是这件事:怎么在Axure里沉淀一套贴合Web开发实际场景的常用组件,让原型从“画得像”进化到“用起来像”,顺便把团队评审、前端对接的沟通成本降下来。适合产品经理、交互设计师,以及想往交互方向进阶的前端同学。
我见过太多团队,每个人一个Axure文件,各自画各自的风格。同一个“确定”按钮,有人用蓝色渐变,有人用灰色圆角,还有人直接放一张截图。到了评审会,大家讨论的不是业务流程,而是“这个按钮到底啥颜色”。这套问题不是设计能力问题,是组件库缺位的问题。下面我把自己搭建Axure Web组件库的思路、做法和踩过的坑,拆开来讲清楚。
1. 为什么要在Axure里沉淀一套高保真Web组件库
1.1 高保真,保的不只是“像”
很多新手对高保真的理解,停留在“视觉上接近最终网页”。但你做的是Web开发原型,不是静态设计稿。一个画得再像的按钮,如果按下去没有任何反馈,在评审里依然会被当成“示意图”。我把高保真拆成了三个层次:
第一层,视觉标准。颜色、字号、间距、圆角都和前端实际落地页面基本一致,不能用默认的灰扑扑样式交差。第二层,交互反馈。悬停变色、按下状态、选中高亮、加载旋转、禁用置灰,这些状态在真实Web页面里都是标准动作,原型里必须能演示出来。第三层,逻辑联动。表单校验、选城市联动的区县列表、购物车角标数字变化,这些是“数据流”层面的高保真。
用生活类比来说:一张汽车海报当然画得很像,但高保真的“概念车”是能开门、能亮灯、能踩油门的。你在Axure里做的每个组件,都应该能“开一下门”。
1.2 组件库和零散画图的本质区别
零散画图是“一次性”思路:这页需要一个下拉框,就拖一个下拉框元件改一改;下个页面又需要,再拖一个重新改一遍。看起来也不慢,但问题出在改版。
真实项目里,视觉风格调整太常见了。主色从蓝变绿、圆角从4px变8px、按钮文案从“提交”变“保存”。如果组件是零散分布在几百个页面里的,你只能挨个页面找、挨个改。那场面我用四个字形容:原地崩溃。
组件库思路正好反过来:先定义标准形态,再做页面组装。把导航、按钮、表单、弹窗这些高频元件做成母版(Master)或样式库,页面上需要用到就直接拖进来。以后想改主色,改组件库源头,所有引用页面自动同步。这不是效率问题,是工程质量问题——你不想让团队在一个按钮的颜色上反复吵架,就得把标准定在前面。
1.3 先定参照系:让组件贴近真实Web开发
动手画组件前,我建议先问一句:这个产品的前端团队,实际用的是哪套UI框架?国内Web开发最常见的几套是Ant Design、Element Plus、Bootstrap,再不济也是自己封装的内部组件库。
解决方案很简单:组件库的风格朝着他们用的那套框架靠拢。Ant Design的按钮就偏正经,圆角4px,主色是科技蓝;Element的用户更喜欢清爽的白色卡片风;Bootstrap则要兼顾栅格和响应式断点。你在Axure里规定的栅格宽度、间距倍数、色板,最好和前端代码里的设计变量一一对应。
这一点很多设计师会忽略,结果就是原型很漂亮,开发说“这个圆角没法做,按钮组件不支持灰色禁用态”。最后原型变成空中楼阁。反过来,如果你的Axure组件命名就叫“Ant Btn Primary”,开发拿到手就知道对应代码里哪个组件,效率翻倍。
2. 高频Web组件的制作思路与细节拆解
2.1 导航栏与菜单:最难的不是下拉,是边界判断
顶部导航栏几乎每个Web系统都有。视觉上无非是Logo、菜单项、用户信息、退出登录。但高保真的难点不在画,而在状态切换。
一级导航至少要做三套状态:默认态、鼠标悬停态、当前选中态。Axure里每个菜单项放两个文本状态,用交互样式里的“鼠标悬停”和“选中”来驱动。再配合一个变量记录“当前选中的菜单编号”,点击A菜单,A加选中样式,B、C重置为默认。这样一来,前端在写路由高亮逻辑时,可以直接照搬你的判断规则。
麻烦的是二级下拉菜单。很多人在Axure里做下拉,用“鼠标移入某项时显示下拉面板”。但实际总会出现一个问题:鼠标从一级菜单往下移向二级菜单的过程中,会先离开一级菜单的触发区域,触发“鼠标移出时隐藏下拉”,结果子菜单还没点中,就缩回去了。
这个问题的解法,我后面在排查章节里专门讲。这里先记住一个原则:下拉菜单不是一个菜单项的“子级”,而是一个独立的动态面板,二级菜单项自己也要有鼠标悬停保持显示的逻辑。
2.2 按钮与操作反馈:五个状态一个都不能少
按钮是Web页面里出现频率最高的组件。我一般的标准是,每个按钮样式至少做五个状态:默认、悬停、按下、禁用、加载中。
默认和禁用最简单,就是置灰和正常。悬停和按下用交互样式就能实现:鼠标悬停时背景色加深,鼠标按下时再加深并稍微位移2px,模拟物理按压感。加载中是很多原型的空白区——真实前端点击“保存”按钮后,按钮会变成转圈的loading,同时禁止重复提交。Axure里怎么做?我给按钮做一个“加载中”的图标(一个转圈的弧形或Spinner),点击后显示Icon、隐藏按钮文字,同时设置按钮为禁用,处理完业务逻辑后再恢复。
千万别小看这个状态。评审时老板问“用户连点两次保存会不会重复下单”,你直接演示一个被禁用的loading按钮,比你说一万句“我们前端会做防抖”都有说服力。
2.3 表单校验:别等用户填完才告诉他错了
Web后台的表单页面是组件库的重头戏。输入框、下拉选择、单选复选、日期选择、滑块、上传。高保真要求你至少把“报错”这个交互做出来,而不是画一个红色的提示文字摆在那里。
我的做法是:每个输入项,做四个视觉状态衔接。默认态:灰边框、浅灰占位符。获得焦点态:边框变主题色,有时候周围加一道浅色光晕。校验失败态:边框变红,下方出现红色错误提示。禁用态:整体置灰。然后给输入框设置事件:获得焦点时,切换到焦点状态,并且隐藏错误提示;失去焦点时,用条件判断当前内容是否满足校验规则,不满足就切换到错误状态并显示提示文案。
校验规则也不用太复杂。手机号用11位数字判断,邮箱用必须包含“@”和“.”判断,必填项用“非空”判断。这就是高保真和废稿的区别——用户还没失焦就已经知道填错了,前端开发做校验时也有了一个明确参照。
2.4 弹窗、抽屉与轻提示:消失逻辑比出现逻辑更重要
弹窗和抽屉看着简单,就是把一个面板从无到有显示出来。但一旦较真,麻烦全在“消失”这件事上。
关闭弹窗有几种途径:点右上角X、点取消按钮、点确定按钮、点遮罩层、按ESC键。每一种都牵涉到关闭之后要不要重置弹窗里的内容。比如弹窗里有个输入框,用户填了一半点X关掉,下次打开是应该保留内容还是清空?组件库里必须定一个统一规则,我习惯默认清空,并且在弹窗显示时用“设置文本”把输入框重置为初始值。
轻提示Toast也别忽略。Axure里做Toast不复杂:一个动态面板,先隐藏;触发后显示,同时“等待”2000毫秒,再隐藏。关键在于,如果用户在这2秒内又触发了第二次,上一个Toast还没消失怎么办?实际项目里我通常会在显示新Toast前先隐藏旧的,防止叠字。
2.5 表格、中继器与分页:让原型“有数据”
静态表格用Axure自带的表格元件画,几分钟搞定。但高保真表格必须考虑三个数据场景:加载中状态、空数据状态、真实数据渲染状态。很多团队画表格只画第2种,评审时一讨论“列表为空时界面长什么样”,会议室就沉默了。
真实数据渲染这一步,我强烈建议用中继器(Repeater)而不是手动画行。中继器可以把后台数据结构真实地放进去,配合筛选和分页公式,做一个能搜索、能翻页、能排序的表格。这个工作前期多花一点时间,但一旦做完,就等于有了一套动态数据列表模板,以后任何系统里的列表页面都能直接套。
3. 实操过程:把组件做成高保真级别的核心手段
3.1 动态面板:所有“切换”类交互的基石
如果只允许我教别人Axure的一个功能,我选动态面板。Web开发里的Tab切换、轮播图、抽屉、弹窗、下拉菜单、步骤条,本质上都是“同一块区域,在不同状态之间切换”。
动态面板的关键操作是“添加状态”。给一个面板创建State1、State2、State3,每个状态放不同的内容。然后用事件去“设置面板状态”,就能实现切换。
以Tab切换为例:上方三个Tab按钮,下方一个动态面板,面板里放了三个状态对应三块内容。给Tab1加“点击时,设置面板状态为State1,同时给自己加选中样式,并取消另外两个Tab的选中样式”。Tab2、Tab3同理。这个逻辑前端同学一看就懂——这本来就是这个页面最终要实现的前端行为。
轮播图也用它。做法是:一个动态面板里建4个状态,每张图一个状态;设置第一个状态显示时,等待3秒,再“向后翻页”。Axure的动态面板支持循环播放,状态到底自动回第一个。这样演示出来的轮播,和真实网页几乎一模一样。
3.2 中继器:数据表格的筛选与翻页怎么实现
中继器是我见过最多人一听到就想放弃的功能,但想清楚之后,它其实就是“一个有数据源的可重复列表”。我可以给你一个能直接抄作业的表格分页方案。
第一步,中继器里放一行数据模板,列布局对齐“序号/姓名/状态/操作”。在中继器的数据集里手动填充20行假数据。
第二步,实现分页逻辑。假设每页显示5条,需要两个全局变量:当前页数curPage,每页条数pageSize(直接写死5)。中继器在“每项加载时”,用添加筛选(Add Filter)条件:[[Item.index]] > (curPage-1) * pageSize 且 [[Item.index]] <= curPage * pageSize。这个公式很好理解——第1页加载索引1到5条,第2页加载索引6到10条,以此类推。
第三步,分页器放“上一页”“下一页”和页码按钮。点击“下一页”时,先用条件判断curPage + 1不能超过总页数,再把当前页数更新,最后重新加载中继器数据。总页数用公式[[Math.ceil(数据集总行数 / pageSize)]]计算。
这套方案本质上是把“后端分页查询”的逻辑搬到了Axure里。你做完这个组件,前端做分页接口对接时,看你的交互说明都能少问半小时。
3.3 变量与函数:让原型真正“记住”用户操作
光有动态面板和中继器还不够,做高保真项目一定会碰到跨页面联动的需求:登录之后右上角显示用户名;加购物车后角标数字+1;填了总价自动算合计金额。这些靠Axure的变量和函数。
变量分全局变量和局部变量。全局变量整个文件通用,适合存登录状态、当前用户、购物车数量。局部变量则在一个交互用例内部临时取用,比如做合计金额时,把“单价”和“数量”两个元件的文本取出来做乘法。
拿购物车角标来说:角标本身是一个文本元件,初始显示0;点击“加入购物车”按钮时,设置文本的值为[[变量名 + 1]],同时这个交互里要把变量自身也更新。得益于Axure支持JavaScript表达式,你还可以写复杂一点:[[Item.单价 * Item.数量]]这种计算式。做完这些,你的原型就不再是死页面,而是一个能自己算账、自己记住状态的小型应用。
3.4 命中区域与交互样式:高保真的最后一公里
高保真原型和普通原型还有一个肉眼可见的差距:鼠标滑过组件,到底有没有反馈。
Axure虽然没有前端CSS里那种直接改cursor: pointer入口,但你可以用两个东西弥补:一个是交互样式,一个是透明的命中区域。交互样式我在按钮那节已经提过,鼠标悬停时变色、鼠标按下时位移,这些反馈会让原型“活”起来。命中区域是指,如果组件本身的可点击范围太小(比如一个只有10x10的图标),你在它上面再盖一层透明矩形,把这层透明矩形绑定所有点击事件,用户实际点击的体验就会好很多。
我通常还会在可点击组件的悬停样式里加一点“高亮暗示”——比如给带下划线的链接菜单,悬停变成主色;给卡片加一点阴影。用户看到这些变化,自然知道这块能点,这和Web页面的可用性原则是完全一致的。
4. 组件库的命名、维护与前端交付
4.1 母版化:一处修改,全局同步
组件库能不能发挥作用,落点在于“母版(Master)”用得好不好。选中一个画好的组件,右键“转换为母版”,之后这个组件就在母版库里。任何页面需要它,直接拖进去。
母版最大的价值是“一处修改,全部同步”。比如产品团队决定把系统主色从蓝色改成绿色,你只需要进入母版编辑器,把按钮、导航、选中的配色全部换掉。所有页面里引用这个母版的地方,刷新之后全部生效。如果没有母版,你得在几百个页面里手动校对颜色,那画面我不敢想。
不过母版也不是没有坑。母版内部的交互事件写完之后,不能像普通元件那样在页面层单独加事件。如果你遇到“同一个弹窗,在A页面点确定跳转A流程,在B页面点确定跳转B流程”这种需求,全局变量就派上用场了。在母版里写“点击确定时,判断当前页面标志变量,按条件跳转到对应页面。”这一点想清楚了,母版才能灵活起来。
4.2 命名规范:组件库能不能用三年,就靠这一条
组件库做得越久,命名越重要。我在第三年回头看自己第一年建的Axure文件,看到一堆“元件1”“元件2”“动态面板3”的时候,头都是大的。命名混乱的组件库,最后只会被团队弃用。
我现在用的命名格式是“类型_业务_状态”,比如:
Btn_Primary_Default:主按钮默认态Btn_Primary_Loading:主按钮加载态Nav_Menu_Selected:导航菜单选中态Table_List_Empty:表格空数据状态Modal_Confirm_Normal:确认弹窗默认态
动态面板的状态命名也同样重要。不要用State1、State2这种,直接用内容含义,比如Dropdown_Open、Dropdown_Close、Tab_Content_A。当你的团队超过一个人操作这个文件时,命名规范就是最低级的沟通成本。
4.3 交付物:高保真原型如何让前端开发“不骂人”
很多原型到最后沦为“仅供参考”,核心原因是前端开发拿不到足够的信息。高保真组件库的意义,就是要让前端拿到原型后能直接对应到代码。
我建议在组件库页面里,给每个组件加一个“开发备注”区域。用文本框写清楚这组件的功能说明、数据来源、边界条件。比如表格组件旁边写:“数据来自用户列表接口,分页参数为page和size,空数据时显示‘暂无数据’。”你不用写代码,但这些信息能帮开发省下大量猜测时间。
另外,交付时除了生成HTML原型包,我习惯再出一份交互清单。每个页面用什么组件、组件有哪些状态、点击后触发什么行为,整理成表格。这份东西在需求澄清会上会非常有价值——所有交互细节在编码前就被讨论清楚,开发阶段改需求的比例会明显下降。
5. 常见问题与排查技巧实录
5.1 高保真组件做不出来?先查这几个地方
我在搭建组件库和项目复用的过程中,踩坑不少,下面这几个是频率最高的。
| 现象 | 常见原因 | 排查思路与解法 |
|---|---|---|
| 二级菜单移出就消失,根本点不到子菜单 | 子菜单的触发区域没有连接到一级菜单的鼠标悬停状态 | 不要把隐藏逻辑只写在父级上,子菜单本身也要有“鼠标移入时保持显示”的事件 |
| 动态面板切换后内容显示空白 | 切换到的状态里没有内容,或状态位置发生偏移 | 双击动态面板逐状态检查;看看是不是开了自适应视图导致状态尺寸不同 |
| 中继器分页数据乱跳 | 筛选条件叠加后没重置当前页变量 | 每次切换搜索条件时,先把curPage变量重置为1,再刷新数据 |
| 按钮点击后重复触发多次交互 | 一个元件上写了多个用例,单击被同时执行 | 检查交互面板,确认是“鼠标单击时”而不是“鼠标按下时”;必要时拆分事件 |
| 原型很大,预览卡到不想动 | 大量高清图片直接拖入,没有压缩 | 图片提前转成Web格式并压缩(宽度1200px以内);能画出来的图标不要用图 |
其中最值得展开说的是二级菜单。Axure里的鼠标移出事件有个经典陷阱:鼠标从一级菜单移到二级菜单的路径上,会先离开一级菜单的矩形区域,于是“鼠标移出时隐藏”被触发,下拉面板立刻收回。解决办法不复杂:一级菜单负责“显示”下拉面板,子菜单本身再追加一条“鼠标移入时显示、鼠标移出时隐藏”的规则。这样鼠标只要进入了子菜单区域,哪怕父级的移出事件已经触发,子菜单也能通过自己的保持显示事件把局面救回来。
5.2 几个能让工作流顺滑的独家技巧
最后分享几个非官方文档里写得不多的做法。
第一,用AI辅助生成原型素材。组件库里缺头像、缺商品图、缺横幅图,别再花时间从网上抠图了。让AI画一组统一风格的UI插图,或者直接用AI批量生成假人名、假手机号、假文案。高保真原型的数据真实感一下就上来了,评审时的代入感完全不同。
第二,需要用现成的技术组件做参考时,可以把一个真实的HTML页面塞进Axure的内联框架里。想做一个“借鉴某后台管理界面的布局”时,直接用内联框架嵌入静态HTML页面,和旁边自己画的Axure组件做对比。虽然它不算传统意义上的组件制作方法,但在调研阶段非常省事。
第三,把“组件库”单独建一个Axure文件。不要和业务页面混在一起。我用的是独立组件库文件作为母版源,新项目直接复制一份,然后在不影响原文件的前提下做项目定制。万一改到一半发现方向错了,拿原文件重新复制一份,成本几乎为零。
做过几轮完整的项目之后,我会建议每个人都以“常用组件库”为单位来做原型沉淀,而不是以单页面为目标。这其实是在给自己建一套可复用的思考模板。你每画一个组件,都会被迫去想它的边界状态、极端情况和交互细节,这些东西想多了,你判断一个产品方案是否靠谱的眼力,也会跟着长起来。下一次当有人再问“这个原型能做成什么样”的时候,你可以直接拖出导航、按钮、弹窗、表格给他演示一遍,而不是打开PS慢慢地描边。