惊!半年实践血泪史,3000 字深度好文,一个爱树的设计师手把手教你如何设计「树 」!


树形控件是种常见的设计模式,几乎与图形化用户界面同时诞生,通过结构化的组织方式逐级展示内容,让整体信息架构一目了然,非常适合以网页或桌面端为载体的 B 端产品和生产力工具,比如电脑文件管理系统。

使用场景

树形控件通常有以下 4 种表现形式:

树列表
树导航
树选择
思维导图

可以把它们进一步总结为 2 个使用场景:

1. 查看为主,编辑为辅2. 编辑为主,查看为辅

其中,树列表、思维导图在 2 个场景中都有应用,而树导航和树选择多以查看为主。不同的使用场景,在设计上会有不同取舍。

结合树形控件的使用场景,对其的操作也如此分类。显然,「查看为主」时,对查看类操作的体验要求更高,而「编辑为主」时则相反。

新增节点

以新增节点为例,不同场景下用户有不同的诉求:

  • 查看为主:快速建出一个节点,以进行后续操作
  • 编辑为主:快速搭建出整棵树的结构

查看为主

可以考虑鼠标悬停到节点出现相关操作。但此时较难预测的是用户到底是想增加一个子节点还是同级节点。一个完备的解法就是让用户选择。但实际业务中,此处可能还要选择节点类型,比如语雀要选择文档还是表格。所以「节点类型 x 层级选项」有可能导致选项过多。此时可以有两种处理方式:

只允许新增子节点, 提供节点类型的选择
提供同级/子级的选择,将节点类型的选择/修改放在后续流程中

针对第一种方法,我们需要额外思考一个问题:新建的子节点应该放在第一位还是最后一位?

我的第一反应是第一位,因为它离操作区域最近,从操作到反馈都很自然,也避免目录发生大幅度滚动,所以在语雀目录中是这样设计的。但是实际也有很多用户反馈希望是最后一个子节点,类似于1,2,3…… 的顺序从老到新排列。我没有办法去验证如果真的是加为最后一个子节点,会不会又有另一波反馈声音。后来我发现思维导图新增子节点就是新增在末尾,以及绝大多数产品也是加在末尾,所以下次我大概会选择放在最后试试。或者索性选择上述第二种方法来避免这个问题。

此外,界面上还需要提供一种方式,允许用户创建最顶层的一级节点。当界面较大时,可以放置在顶部,让用户更易发现。

编辑为主

相较于上述方法,可以给出更明确直接的界面操作和添加位置示意或快捷键。

语雀在进行目录改版时,本想统一「阅读页面」和「编排目录页面」的交互方式——采用「查看为主」的添加方式,却忽略了两个页面的用户诉求不一样。此时这里其实还可以借鉴思维导图的创建方式,使用Enter/Tab 键快速添加节点。

修改节点属性

结合实际业务,节点可能有不同属性,比如名称、类型、状态、优先级等。「查看为主」时,修改操作使用不多,可以考虑放入「…」中。

而「编辑为主」时,除了单个节点修改属性方便,还需要考虑连续修改多个属性,甚至是批量修改。如下图,树列表可以支持连续修改属性节点。

如下图,思维导图可以通过多选然后在格式面板统一修改属性。

调整结构

树形控件最有价值的部分就是其所表达的层级关系,常用调整结构的操作总结如下:

  • 拖拽调整:适用于小范围调整结构顺序
  • 非拖拽调整:适用于需要跨屏调整结构顺序

无论采用那种方式,都遵循以下设计原则:

  • 所见即所得
  • 高效精准

拖拽调整
简单而言,设计上要解决以下问题:

1. 如何让用户知道可以拖拽?

增加意向符号
改变光标样式

2. 如何让用户知道可以怎么拖拽到哪里?
可以在拖拽中采用「插入位置符号」暗示用户,通常是一条彩色线条。应尽可能增加「插入位置符号」出现的机率,减少用户的困惑。设计时可以考虑上下左右两个方向的拖拽运动分别可以触发什么结果。

比如按以下方式简单把拖拽规则分为 3 大类,

当然在「插入位置符号」尽可能多出现的同时,也要让其出现的位置符合用户预期且易理解。比如向左移动「非末尾子节点」,如果强行给以一个符合逻辑的响应,「插入位置符号」可能离当前光标很远,甚至在屏幕外,且放手后可能引起目录结构较大变化,那么不如选择此时拖拽无响应。

这里再介绍「把一个节点调整为另一个的子节点」的两种拖拽规则,分别适用于不同场景。

文件夹式:树的父节点只能是类似于「文件夹」这样的虚拟分组,可以采用文件夹式交互,因为它比较符合用户把子节点放入一个容器中的心智
思维导图式:当树的父节点可能是一个真实存在的对象,可以采用思维导图式交互,因为用户比较难以想象:一篇文档叠到另一篇之上=成为它的子文档?

3. 如何让用户快速拖拽到目标位置?

当用户掌握了拖拽规则后,就需要帮助用户快速实现自己的调整目标。拖拽过程中注意以下几点:

  • 被拖拽节点可以半透明显示,以尽量少遮挡树形控件,方便用户定位目标位置。
  • 被拖拽节点的原始位置可以以较弱的视觉效果展示,提示用户节点从哪里被拖拽。
  • 整棵树的结构不要发生变化,以免原先确定的目标位置发生位移。
  • 结构层级较深时,通过辅助示意帮助用户确定会将节点拖拽到哪一层级。

4. 如何让用户确定拖拽结果满足自己的期望?

当以上问题都解决后,这个也许就不成问题。当然也可以增加二次确认的微交互。

选中被拖拽对象
增加临时性底色

非拖拽调整

调整结构也可以通过非拖拽的方式完成。拖拽是一种直观,但不轻松的操作,尤其是当树很庞大需跨屏拖拽时。此时可以增加按钮操作,直接指定目标位置,精确且快速。

当「编辑为主」时,调整结构也需要考虑批量操作。如下图,支持多选节点同时调整,被调整结构的节点有可能在原处于不同分支的不同等级,批量调整后会成为同一个字节的同级节点。

删除节点

不让用户疑惑:我的内容去哪儿了?

删除是个比较慎重的操作,所以此处应该询问用户是只删除本节点,还是本节点及其下所有节点。

如果只删除本节点,首先本节点需要从树形控件中消失,以代表删除成功,然后其子节点可以上移一级,保证用户不会误以为内容丢失。

缩放视图

查看时,思维导图可视化效果更好。针对思维导图,需要考虑视图的放大缩小,适应视口/真实大小切换。比如下图语雀思维导图的「缩放视图」功能(不过这个设计把回到中心和适应画布藏的有点深)。

折叠层级

当树形控件庞大时,需要能够快速折叠/展开层级,包括全部层级或者某一层级。如果是一棵「私人树」,记住用户折叠的展示层级,并且在下次进来时仍旧保持。如果是一棵「公开树」,可以增加默认展开设置,比如下图语雀中编排目录的操作。

值得注意的是,折叠层级和缩放视图的操作都应该提供快捷键,会比通过界面操作更加高效,也不会打断查看过程。可以想象一下你正在一个会议中展示一张思维导图,在界面上操作「缩放视图」耗费更多时间,也会在夺走走观众的注意力。

附上常见查看操作快捷键,仅供参考:

查看操作 快捷键
折叠/展开子节点 ctrl /
实际大小 ctrl 0
放大 ctrl +
缩小 ctrl -
缩放画布 ctrl + 鼠标中键滚动
移动画布 space + 鼠标拖拽

上述部分快捷键会和浏览器自带快捷键冲突,使用时需要覆盖浏览器快捷键。

搜索和筛选

当节点数量很多时,树形控件应该支持搜索查找节点,搜索关键词可以高亮显示;或按条件筛选展示节点及其上级节点路径。

使用列表时,还有一个常见的操作是「排序」,但是整棵树「排序」和树形控件本身的层级顺序是相矛盾的。所以「树列表」基本没有「排序」功能。

写在最后

2020 上半年做了很多和「树形控件」相关的项目,想把踩过的坑都记录下来,分享给大家。在这里要感谢一下 Ant Design 的「Tree 树形控件」,如果不是它我还不知道树能玩出这么多花样呢 ‍♀️。更多系列文章可以移步语雀阅读。

树形控件在生产力工具中的设计 · 语雀​www.yuque.com

—— 来自一个爱树的设计师

参考资料

文件目录树设计小记 - 吴嘉豪的博客​blog.ngkaho.info

https://zhuanlan.zhihu.com/p/59354929​zhuanlan.zhihu.com

https://zhuanlan.zhihu.com/p/27055366​zhuanlan.zhihu.com

Human Interface Guidelines​developer.apple.com

autojs遍历当前页面所有控件_树形控件在生产力工具中的设计相关推荐

  1. treeview控件怎么使用修改发育树_树形控件在生产力工具中的设计

    惊!半年实践血泪史,3000 字深度好文,一个爱树的设计师手把手教你如何设计「树 」! 树形控件是种常见的设计模式,几乎与图形化用户界面同时诞生,通过结构化的组织方式逐级展示内容,让整体信息架构一目了 ...

  2. VS2010/MFC编程入门之三十(常用控件:树形控件Tree Control 上)

    前面两节为大家讲了列表视图控件List Control,这一节开始介绍一种特殊的列表--树形控件Tree Control. 树形控件简介 树形控件在Windows系统中是很常见的,例如资源管理器左侧的 ...

  3. autojs遍历当前页面所有控件_自定义控件(引入布局)

    系统给我们提供了许多功能强大的控件,我们在需要时可以直接在布局中添加使用,但是有时候我们程序想要实现的功能往往因人而异,如:我们的程序需要在内个Activity的标题栏左侧有一个返回按钮(类似于iPh ...

  4. autojs遍历当前页面所有控件_HTML5表单和表单控件的使用

    哈喽大家好,我是作者"未来",本期分享的内容是Web前端系列课程,本系列总共29个阶段,坚持学习3个月蜕变为Web前端高手哦! 志同道合的小伙伴跟我一起学习交流哦! 第一阶段 HT ...

  5. autojs遍历当前页面所有控件_PyQT5控件:容器(Containers Widgets)

    QWidget主窗体容器 在Qt设计师中新建文件,选择QWidget QWidget属性 enabled 窗口部件是否有效 geometry 窗口部件相对于其父窗口的几何图形,并排除窗口框架 size ...

  6. elemtnui select控件结合树形控件 实现自定义搜索方法

    业务需求: 可以从下拉框中选择数据,也可以自定义搜索. 前端效果: 1:从下拉框中选择 2:自定义搜索 3:单选并赋值:也就是选中那个就回显那个 代码实现: 1.首先需要用到select控件和tree ...

  7. Sentinel流控规则_流控等待_分布式系统集群限流_线程数隔离_削峰填谷_流量控制_速率控制_服务熔断_服务降级---微服务升级_SpringCloud Alibaba工作笔记0037

    技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 然后再看一下流控等待这个流控的规则 其实就是,如果流量来了很多,然后,请求,会进行排队,如果超时了 ...

  8. ipad一直卡在白苹果_苹果或将推出带触控板的 iPad 键盘,距离生产力工具还有多远?...

    这是苹果将 iPad 推向 MacBook 的又一举措. iPad 是很多人眼中的大号 iPhone,但苹果却一直想让它变成生产力工具,配件上推出了 Smart Keyboard.Apple Penc ...

  9. autojs遍历当前页面所有控件_纯前端表格控件SpreadJS V14.0发布:组件化编辑器+数据透视表 - 葡萄城开发工具...

    SpreadJS 是一款基于 HTML5 的纯前端表格控件,兼容 450 种以上的 Excel 公式,具备"高性能.跨平台.与 Excel 高度兼容"的产品特性,可为用户提供高度类 ...

最新文章

  1. 【组队学习】【24期】Datawhale组队学习内容介绍
  2. Theano2.1.1-基础知识之准备工作
  3. UNIX网络编程——TCP/IP简介
  4. P2184 【贪婪大陆】
  5. 线性代数---矩阵的各种问题求解方法
  6. 【离散数学中的数据结构与算法】五 排列与组合一
  7. 机器视觉【基础】什么是机器视觉?
  8. python 哈希表_数据结构-7 哈希表
  9. ARMLINUX学习笔记(3)---安装交叉编译器
  10. C++_类和对象_C++运算符重载_加号运算符重载_实现两个对象相加_对象和int类型相加_通过成员函数重载+号_全局函数重载+号_以及重载_运算符重载函数实现---C++语言工作笔记055
  11. Oracle收购Talari,第一家SD-WAN公有云提供商出现
  12. java json 转map_JAVA | 基于Fastjson的JSON串序列化和反序列化模板总结
  13. DFA算法实现 敏感词过滤
  14. HashMap的put方法
  15. Flink SQL CDC 13 条生产实践经验
  16. 无线mesh网络路由协议分类
  17. 无人驾驶车辆运动规划方法综述
  18. JavaScript定时器-限时秒杀
  19. 754. 到达终点数字
  20. 什么是bypass?什么是旁路交换机?为什么需要旁路交换机?

热门文章

  1. 基于java社区疫情防控系统计算机毕业设计源码+系统+lw文档+mysql数据库+调试部署
  2. 关闭钩子(shutdown hool)
  3. 8月,Github 最热开源项目排行榜来啦
  4. 从零开始研发GPS接收机连载——11、电文解析
  5. IE盒模型和标准盒模型的区别
  6. <Java>根据身高体重计算BMI指数
  7. Ubuntu16成功安装QQ2012国际版(wine1.6.2)
  8. Linux下常用软件,Linux下开发工具下载地址
  9. java list 循环 更改_Java List遍历修改
  10. Google adwords新手必读,3个步骤让你的回报率快速提升!