当前位置: 首页 > news >正文

基于组件的设计工作流与界面抽象

基于组件的设计工作流与界面抽象翻译自How we’re using Component Based Design,从属于笔者的Web 前端入门与工程实践。笔者觉得本文对于 UI 的六层抽象很适合于前端的代码分割与概念划分,可以参考笔者在2016-我的前端之路:工具化与工程化一文中的解构设计稿这一章节。

在很多大型复杂的项目中,基于组件的设计方案(Component Based Design)往往都会被提上讨论日程。而本文则是作者在很多小型项目中使用 CBD 的感悟与经验总结,项目无论大小皆可适用基于组件的设计方案。首先,我想引用下布拉德弗罗斯特在 Atomic Design 一书中的论述,我们在做设计的时候并不仅仅是设计某个网页或者应用交互,而是在设计一个设计系统。虽然这句话被很多人奉为圭臬,但是我发现不少的使用者在具体实践时却陷入混乱,特别是那些对于产品的不同抽象层级与相应的命名方法非常容易使得开发者手足无措。因此我们将自己团队中基于组件的设计的完整抽象流程与大家共享。

何谓 Component Based Design?

简而言之,Component Based Design 就是将整个 UI 切分为更小的、更可控的具有清晰命名的部分。而这些细小的部分又可以划分为如下 6 个不同的分组。

Identity:特性

首先是特性,即是项目的核心标志性元素,譬如字体、排版、主色与次生色等等。在某个项目中设计人员应该保持所有的设计都遵从同一套特性规范。

Elements:元素

第二个可复用的部分是元素,譬如按钮、链接、输入框、下拉列表等等这些都是属于元素。每个元素同时也会定义其不同状态下的显示,譬如悬浮状态的按钮、聚焦状态的按钮以及不可用的按钮。我们的口号是:Define Once,Reuse Throughout The Project.

Components:组件

第三个可复用的部分是组件,这也是用户屏幕当中展示的最多的块。组件即是使用了一到多个元素(Elements)的任何界面部分,典型的譬如卡片、导航栏等等。需要注意的是,组件并不一定需要模块化。

在设计组件的时候,我们同样需要根据项目的不同响应式尺寸来设计不同尺寸下的组件呈现方式。

Compositions:复合

我们逐步提高我们的着眼点,第四个分组即是复合。复合是任何包含了多个组件的 UI 部分,它们定义了内部组件的行为范式。下图就是简单的例子,下面的这个复合定义了组件的展示内容、组件的间距、整个标题等信息。

Layout:布局

第五大类,布局,是对于设计原则的更高层抽象,典型的譬如网格系统,定义了行列之间的间隔。定义统一的布局有助于其他设计者复用现有的样式规范。

Pages:页面

最后一组即是完整的呈现页面,每个页面包含了一系列的复合与组件的排列组合。所有超出设计预期的东西应该添加在页面这个层级,譬如如果市场的同学说我们的联系人页背景应该是蓝色的,那我们就该将这个特性添加到页面这个层级,而不应该污染上述五个层级。

实例

我们下面以一个简单的例子来阐述基于组件的设计流程。我们产品的某个重要服务就是进行门票售卖,因此我们需要展示三种不同风格的门票卡片、每个卡片的呈现方式是一致的,都会包含按钮和一些文字。换言之,这里的门票卡片就应该被设计为组件,即所谓的 Ticket-Component.

然后,我们需要将三种卡片编为一组同时展示在组件上,此时即就是设计出了所谓的复合,Tickets-Composition,定义了每个卡片之间的间距以及整个的标题。

项目上线的几天之后客户来消息说票卖完了,此时我们只需要更新下 Ticket-Component 中的文字即可,而不会影响更高或者更低层次的部分。

Sketch

毫无疑问 Sketch 已经正为了 UI 设计与 UX 设计的潮流,我们也是在 Sketch 中定义了很多的文本样式、符号等等,这样会大大有利于整个基于组件的设计工作流,使我们更为方便地启动新项目。

相关文章:

  • HDU 3783 ZOJ
  • Java 9进入第一轮问题修复阶段
  • N的倍数
  • shell脚本,根据字符串获取行号的
  • Linux script(录制) 命令
  • Golang升级到1.7后,之前正确的函数出现错误,分析原因及解决办法
  • 更新image的方法
  • Docker学习笔记 - Docker容器与外部网络的连接
  • proxy是什么
  • RIP路由配置实例V2
  • 前端开源项目周报0207
  • Codeforces Round #396 (Div. 2) D. Mahmoud and a Dictionary 并查集
  • 为你的网络传输加把锁(OpenSSL)
  • Java之戳中痛点 - (2)取余用偶判断,不要用奇判断
  • 如何才能弥补实际工作经验不足,而获得一份好工作?
  • JavaScript 如何正确处理 Unicode 编码问题!
  • bootstrap创建登录注册页面
  • golang中接口赋值与方法集
  • HTTP 简介
  • JavaScript设计模式系列一:工厂模式
  • Just for fun——迅速写完快速排序
  • Mysql优化
  • node和express搭建代理服务器(源码)
  • Odoo domain写法及运用
  • Sublime Text 2/3 绑定Eclipse快捷键
  • Webpack入门之遇到的那些坑,系列示例Demo
  • 初识 beanstalkd
  • 从tcpdump抓包看TCP/IP协议
  • 日剧·日综资源集合(建议收藏)
  • 原生js练习题---第五课
  • ​​​​​​​ubuntu16.04 fastreid训练过程
  • #HarmonyOS:软件安装window和mac预览Hello World
  • #vue3 实现前端下载excel文件模板功能
  • (42)STM32——LCD显示屏实验笔记
  • (done) NLP “bag-of-words“ 方法 (带有二元分类和多元分类两个例子)词袋模型、BoW
  • (八)Docker网络跨主机通讯vxlan和vlan
  • (附源码)springboot助农电商系统 毕业设计 081919
  • (附源码)ssm考试题库管理系统 毕业设计 069043
  • (十八)SpringBoot之发送QQ邮件
  • (十三)Maven插件解析运行机制
  • (实战)静默dbca安装创建数据库 --参数说明+举例
  • (转)EOS中账户、钱包和密钥的关系
  • (转)创业家杂志:UCWEB天使第一步
  • *++p:p先自+,然后*p,最终为3 ++*p:先*p,即arr[0]=1,然后再++,最终为2 *p++:值为arr[0],即1,该语句执行完毕后,p指向arr[1]
  • .net 按比例显示图片的缩略图
  • .NET 反射 Reflect
  • .NET简谈互操作(五:基础知识之Dynamic平台调用)
  • .NET序列化 serializable,反序列化
  • @KafkaListener注解详解(一)| 常用参数详解
  • @reference注解_Dubbo配置参考手册之dubbo:reference
  • []T 还是 []*T, 这是一个问题
  • [22]. 括号生成
  • [AAuto]给百宝箱增加娱乐功能
  • [APIO2012] 派遣 dispatching
  • [C/C++]_[初级]_[关于编译时出现有符号-无符号不匹配的警告-sizeof使用注意事项]