前端工程师 x 设计师
的基本职责:还原设计还原"活"的设计。
"活"的设计(Living Design, 简称LD)
活相对于死。PRD是“死”的、设计稿是“死”的、规格说明是“死”的。实现一个“死”的东西毫无价值
还原设计,并不是还原设计稿!最终目标是实现一个活的产品
LD vs. 生命体基本特征:
- 体内平衡 ············ 这种自动调节指适配性。适配内容变化(文字长度、图片尺寸)、屏幕等各种情况
- 组织性 ············ UI可解构为UI元素的系统构成(如原子设计、卡片设计)
- 新陈代谢 ············ 新的UI元素不断替代旧的元素。保持整体设计的活力
- 生长 ············ 从最小可用形态(MVP),跟随需求、不断迭代、持续完善
- 适应性 ············ 能适应用户的使用环境(如响应式设计)
- 反应性 ············ 能响应用户的各种操作,反馈各种状态
- 繁殖 ············ 基于现有的生态体系,快速孵化新产品
定义:LD是由有组织的UI元素构成,能适应不同的使用环境,响应用户的行为,灵活适配内容,可以扩展和继承的设计。
LD的基本特征: 1.组织性、2.扩展性、3.适配性、4.响应性。
还原LD的前提 - 做出转变
"不变则罔,不进则退"
- 协作关系的转变:设计师和前端工程师关注点不同,为了同一个目标
- 传统实现流程的转变:设计师非形而上
- 传统设计实现理念的转变:迭代设计和系统设计
"可以说,转变是由问题倒逼而产生,又在不断解决问题中而深化" -- 习大大
打破传统的产品实现流程
1.产品目标 > 2.设计问题 > 3.构思模型 > 4.设计实现(IDxVD) > 5.代码实现 > 6.真实的产品
PM
交付PRD
Designer
交付设计稿
FE
交付模板
BE
交付上线
User
- 交付物驱动
- 沉浸在各自的专业圈子里,交集越来越小
- 效率低,加人?人多不是协作,沦为劳动密集型,问题没解决导致恶性循环
- 只对上面负责
改进:回到产品实现的根本目标上,产品实现的"黑盒"。
LD的实现思路(1) - 迭代设计
简而言之,围绕目标 • 边验证 • 边设计 • 边开发
迭代1:验证结构调整
迭代2:基于前面,强化视觉
如何让迭代转的更快?
例子:
如果简单按设计稿还原,会在开发最后阶段甚至上线后暴露出一些问题(有些时候可能颠覆设计):
- 大多数时候商品名会很长拆行
- 真实图片的比例多样,现有缩略图的尺寸不符
- 左边button有的是链接,有的带交互
- 有些情况下没有评论内容
- 时间显示规则:一小时内?一天内?一年内?
设计是设计某种秩序,秩序是总体和局部的构成
纵向解构,分开考虑元素的属性和行为:
小结 - 面向设计师
提出一个观念:"活"的设计(LD)
LD的概念和如何理解它
实现LD的前提: 建立协作关系,流程的转变,思路的转变
LD的实现思路:迭代设计和系统设计
还原LD - 再造协作流程
案例分析: A项目(项目名称不便透露)的协作过程。
- PM写了一份简要的PRD,PM x Designer x Engineer Review
- 确定M1的目标,M1定义了MVP,Engineer准备基础服务
- 根据M1,Designer出Wireframe,PM x Designer Review
- 根据Wireframe,FE x BE做出第1版原型。(有测试数据,无样式,尽可能少写JS/CSS,同步的流程)
- 基于原型,VD x ID开始系统设计。分块递交。PM能看到“生长”过程
- M1的开发着重架构设计,分层、分块实现
- 不陷在某个复杂的设计实现里,前面所述的迭代设计
- 阶梯式进展
- 好的协作:多种角色间,不断抛出问题,解决问题的过程
还原LD - 组件化的静态文件管理系统(1)
必备的基础设施。把"细胞"组织在一起,健康与否取决"新陈代谢"(后期维护)
组件化,不单纯是模块化
A项目(不便透露)中最复杂的部分......其实是一个"button"
可简单部署到任何场景(page)下:
<%include file="/widgets/btn_publish.html" args="gallery=gallery" />
内部:完整的组件不单单是JS、CSS、HTML
<%block filter="collect_css">
/* 1. 依赖的CSS */
${istatic('/css/ui/overlay.css')|n}
${istatic('/css/mod_publish.css')|n}
${istatic('/css/tips.css')|n}
...
</%block>
<%block filter="collect_js">
// 2. 依赖的Javascript
Do.ready(function() {
${istatic('/js/upload_pic.js')|n}
});
</%block>
<script type="text/template" id="tmpl-publish-picture">
// 3. 依赖的Javascript模板
</script>
<!-- 4. HTML -->
% if request.user:
% if not gallery.is_member(request.user):
<a href="#" class="btn a_show_tips">发图</a>
${self.tips('只有xxx才能发图。')}
% else:
<a href="${url()}add_picture" class="btn btn-publish-picture">发图</a>
% endif
% else:
<a href="${url()}add_picture" class="btn a_show_login">发图</a>
% endif
%block>
还原LD - UI的组织性
CSS的结构化组织思想,参考OOCSS、SMACSS、BEM等。原则:取其精华,弃其糟粕。
A项目的CSS组织:兼容层 + 抽象UI层 + 组件层 + 业务层
兼容层x抽象UI层
|-- libs.scss 基本的mixin库
|-- reset.scss 为这个应用订制的css reset(你会发现通用文件越来越难hold住全站,原则是拆解、定制)
组件层
|-- buttons.scss 通用UI元素-button
|-- font_icons.scss 通用UI元素-字体icon。适配性更强
|-- item.scss 通用UI元素-条目。
|-- progress_bar.css 通用UI元素-进度条
|-- tips.scss 通用UI元素-Tips
|-- list.scss 通用UI元素-列表
|-- layout_col2.scss 结构
|-- ui JS组件的样式文件
| |-- overlay.scss
| `-- tag_input.scss
业务层
|-- mod_create.scss 通用业务模块: mod_开头
|-- mod_edit_desc.scss
|-- mod_gallery_info.scss
|-- mod_gallery_intro.scss
|-- mod_gallery_list.scss
|-- mod_nav_list.scss
|-- mod_picture_list.scss
|-- mod_picture.scss
|-- mod_publish.scss
|-- mod_upload.scss
|-- member_list.scss 特定页面用到的业务代码
|-- user_profile_head.scss
`-- ui.scss 这个应用的全局css文件
还原LD - 响应式设计
响应式设计(Responsive Web Design, WD)不仅仅局限于响应屏幕。本质上更好适应用户的使用环境。
比如:上传图片
Sorry! 暂不支持你的浏览器,请用Chrome打开...