从零基础到精通:B端设计规范和组件库搭建指南(二) 收藏
今天来分享关于规范应用中软件功能的具体介绍,发现用图文的形式解释软件功能实在是太难做了。这次算是爆肝来解释 自动布局 Autolayout 的使用,帮助还不理解,或者还在用 Sketch、XD 的同学搞清楚它到底是什么。
上期回顾:
从零基础到精通:B端设计规范和组件库搭建指南(一) 这是一篇酝酿了比较久的内容了,即讲解 B 端设计规范和组件库的分享。
阅读文章 >
一、样式功能 在软件中,记录样式就是在对应的属性面板上 “创建” 并 “命名”,就将对应设置数据转化成一个指定名称的记录,方便我们记忆和调用。
比如,填充色中使用了两种色彩相近的色彩和不同透明度,我们就可以使用中文命名来区分,其中 2B6DCF 80% 叫 辅助色,2B93CF 90% 叫 主色。
创建完成的填充色记录,就会在对应的属性样式列表中出现,之后就可以在对应图层的属性中关联该记录了。
之后,所有关联到该记录的图层属性,都可以快速应用该记录内的参数。如果我们在样式的列表中修改该记录的数值,那么所有关联到该记录的图层就会一起被修改。
一定要牢记,目前的主流 UI 工具中,样式是根据不同属性类型记录的。比如一个字体图层,它的填充、字体、描边、投影,是可以创建不同的样式记录的,各不影响。
而软件 Sketch 的样式逻辑,则是根据图层类型来记录的,比如矩形和字体,会记录该图层下所有样式属性的参数,且该记录只能应用在同类的图层上(而 XD 只能记录色彩和字体样式…)。
这种做法虽然理解起来容易,但是会导致样式数量大幅度增加。尤其是在字体上,变动填充、描边都要设置一个新的样式,这在实际项目中的灵活性是非常差的。
而即时设计、 Figma 则不考虑图层类型,只关注属性类型。类似前端的样式表中 “类(Class)” 的应用,每个类有不同的样式参数,只要定义了类的命名和属性、参数,那么不同 Div (即图层)就可以自由组合这些样式记录了。
比如色彩 color、阴影 shadow、描边 board 各定义了 1、2、3 三种样式类,那么就可以像下方案例中自由组合:
所以,样式功能可以帮助我们在前期快速搭建基础视觉规范内容,将规范中的配色、字体、投影、模糊等参数整理进样式表中,方便我们后续的快速调用和统一修改。
三、响应式功能 响应式是我们前面做过很多期分享的课题了,基于 BootStrap 的完整响应式功能确实非常强大,可以通过栅格布局来实现丰富的响应方式。
虽然 UI 软件中也提供了 ”响应式“ 这样的功能,但它可以实现的效果非常有限。用一句话概括就是:
“图层基于父级画板 Frame 的匹配逻辑”
比如我们先创建一个画板,然后再置入相关的图层,那么这些图层就可以启用响应式规则。包含间距固定、居中对齐、等比缩放这三种响应规则。
间距固定的意思,就是图层基于父级画板的某间距数值是固定的,不管画布尺寸怎么变动,图层和画布的对应间距都是保持一致的。比如常规的某一方向间距固定。
比如在模块上的标题栏,就可以将栏目设置成一个 Frame,然后标题相关元素左间距对齐,更多图标右间距对齐,之后变更标题栏的宽,图层的对齐关系就是不变的。
而设置左右、上下间距同时对齐,则是图层会随画布的尺寸变动修改自身的宽高来满足。
居中模式则是图层根据画布的大小进垂直、水平方向的对齐,忽略间距数值。
最后一个缩放的设置,用起来和两侧间距对齐很接近,也是放大缩小画布图层会跟着一起变动,但它响应的逻辑是依据比例,而不是间距。这个设置在实际项目中很难派上用场。
过往的设计软件中,父集尺寸变更,下级元素只能机械的执行缩放效果。而响应式设置就是避免这种僵硬的效果,向真实的网页适配方式看齐。
同时,这种父集对齐的逻辑是可以进行嵌套使用的,比如刚才的标题栏,可以将这个画板再置入到整个卡片画板之下,并对 “标题栏画板” 创建顶部对齐,左右间距对齐,那么该画板本身的尺寸不管怎么变动,头部标题栏顶部位置固定,宽度间距和父集统一,标题栏下方的元素也会左右对齐。
所以,将一个画板中的元素响应方式设置好,可以节省我们很多时间,不用再因为父集元素尺寸修改而一个图层一个图层修改下级元素的尺寸和位置。
在后续生成组件前,我们就要优先完成画板下方的响应设置,这样就能确保该组件支持灵活的调节和布局。比如用上方的卡片,就可以快速搭建一个表盘页面的基本框架,我们要做的就是拖拽画板到一个合适的尺寸即可,无需调节下级图层。
但需要注意的事,即时设计和 Figma 触发响应式的设置是元素需要处于画板 Frame 之下,而不是编组 Group 中,Sketch、XD 因为没有 Frame 的概念,所以使用编组就可以应用响应式设置,这个区别一定要牢记。
同时,响应式虽然可以完成很多高效的适配,但是它的局限性是无法打破的,例如无法实现 3 列以上的卡片列表等间距放大,或者随宽度增加生成新列下方卡片补位。
四、自动布局功能 自动布局 Autolayout 作为一个自动排版功能,使用场景包含两类,父子级响应和依序排列。它们有各自的生成条件。
首先需要一个矩形图层作为背景,并将其它下级图层置入到矩形背景中去,全选后点击 “自动布局“ 按钮即可生成父子级响应。如果图层没有完全置入矩形中或没有相交,那么就会生成一个依序排列的自动布局出来。
创建自动布局会生成一个新的 “特殊编组”,用来收纳下级图层,它在图层列表中会有新的图标。
1. 父子级响应布局
父子级响应布局中,背景的矩形图层会被自动移除,样式被继承到自动布局的编组上,针对该编组层的属性设置,就等同于原先的背景矩形设置(和画板 Frame 图层逻辑一样)。
这类布局最常应用于按钮控件上,可以让按钮的宽度随文本宽度变化。
但光靠创建这个效果显然是无法完整解释自动布局的,我们就必须从前端的逻辑,来理解这种包含父子层级的元素如何实现自动布局。
首先就是前端环境中,很多控件、组件本身的尺寸是无法直接写死的,它们是随内容自动调节的。而自动布局右侧的设置面板中的田字格一栏,旁边会有宽度和高度设置,默认都是 “自动 Auto”,这就是说它们会随内容宽高进行响应。
比如上方的按钮,它实现的逻辑就是:
按钮宽 = 元素内容宽 + 左右间距 按钮高 = 元素内容高 + 上下间距 这种情况是父层级基于子层级的响应,应用于无法确定父级图形尺寸的场景,如按钮、标签、单元格、瀑布卡片等。
但前端中的不确定性并不是只有这一种,还可以反过来,子图层大小不确定,需要它们去响应父级图层的尺寸变更。
比如一些文本卡片,会应用在不同的页面中,且根据应用的场景会有宽高的调节,所以需要下级的文本区域可以跟随上级尺寸响应。
我们就需要把父级布局设置成 “固定宽/高”。还要选中子图层,在它的自动布局选项中选择 “自适应”,来满足这个相反的需求。
如果子图层没有设置自适应,那么它就不会直接随着父级图层变更自己的尺寸。但还是有针对子元素的响应设置 —— 对齐模式。
在父级布局设置中,有一个网点模块,可以设置下级图层的对齐模式。当下级图层不处于自适应模式时,则对齐可以修改下级元素的对齐方向,即前面响应式设置中的 “间距固定”。
2. 依序排列布局
前面我们演示的案例都只有一个子图层,如果出现多个子图层的话,自动布局也可以帮我们进行调节,除对齐外还包含子图层排列方式、分布方式,而这就是依序排列的布局模式。
排列方式就是多个子图层横排还是竖排的设置。
分布方式,则是这些子图层布局的位置怎么定,默认包含固定间距和自适应两种。
固定间距即子元素排列的间距保持一致,在右侧的输入框中可以设置间距数值,也可以结合对齐模式来设置整体的对齐方向。
而自适应,则是在父级区域内进行等分,这个等分的逻辑比较特别,需要左右各有一个子图层靠到头,新增的图层在这个基础上进行 “等间距分布”。
依序排列的优势,除了把现有的子图层快速布局以外,还可以用拖拽、键盘调整元素顺序。或者从外部拖动某个图层到该区域中,就可以插入序列,成为下级图层之一。
3. 混合布局模式
前面两种布局模式,可以解决各种 UI 设计中的细节设置问题,理解起来也并不难,只要自己去操作一下就能学会。而真正让人头疼的,是自动布局可以相互嵌套,并混合这两种模式,在复杂的页面设计场景和组件模块中灵活应用。
下面我们通过一个模态对话框 Modal Dialog 案例来进行说明。这个对话框会包含 3 种不同的宽度规格,且对话内容不确定,可能会字数很多包含很多行的高度。
想要用自动布局实现一个满足需求的对话框,我的建议是先学会拆分里面的下级模块,通过完成下级模块的设置后再进行最终的合并调节。在这个对话框中,
包含三个模块,顶部标题栏、中间内容区域,底部操作栏。
首先从顶部标题栏开始,我们随意创建个 280px * 44px 的矩形,然后再置入标题和图标到矩形中。之后全选它们创建成自动布局,然后设置父层级内间距,且改成宽度固定、分布自适应,就可以获得一个可以随意修改宽度的标题栏了。
然后就是内容区域,本质上就是一个文本区域,所以我们拖拽一个文本区域出来,设置好对应的参数和填充一点文本即可。
而底部操作栏,则在一开始做好两个按钮(可以使用自动布局做)和背景以后,就可以进行合并,只是父级元素上的设置要改成固定宽度和右对齐,并设置布局间距(按钮间距)。
这三个模块完成以后,我们再选中它们进行自动布局合并,把它们设置成竖排模式,再添加背景色和排列间距,就可以实现出一个正常的对话框效果。
到这一步,如果我们修改对话框整体的宽度,或者输入多行的文本,都无法达到预期的效果,所以还要在这个基础上进一步的调整。
首先是宽度适应,我们要先将最上级的自动布局改成 “固定宽度”,然后将下级图层都改为 “自适应”,这样我们增加组件的宽,下方布局就会立即响应,且推导到更下级的图层中。
为了满足文字宽度随父级响应,高度影响父级高度,就要将顶部的自动布局改成 “高度适配”,再将下级的文本改成 “宽度自适应”、“自动高度”,然后,我们就可以随意拖动这个自动布局的宽,和添加任意的文本内容了。
完成这个基本的版本以后,我们再根据项目需要的三个宽度,直接将它复制成 3 份,每份直接设置对应的宽度出来,就可以作为后续的 “原始组件” 在项目中进行快速引用了。
在这个案例中,我们前后嵌套了若干层的自动布局,每层自动布局的上下级会有各自的响应关系,需要我们逐一进行确认。并且,细心的同学应该也发现,这里面有很多设置似乎和前面的响应式设置非常类似,那把一些下级布局从一开始就做成响应式的编组行不行?
答案是可以的……
响应式设置和自动布局,本质上都是为了节省我们操作时间而设计的功能,我们要从实际设计的对象出发,选择合理的功能来实现最终的效果。而不是只能使用自动布局,或者只能使用响应式。
也不要因为了解了响应式包含了非常强大的自适应功能,而认为项目中任何组件、页面,都要全由它们组成。在需要频繁优化页面内容、调整设计需求的项目里,过度嵌套的自动布局会让设计文件的 “熵” 值无限增加,会产生更多复杂的、没有效率的问题。
相信引用过 Ant、TDesign 等组件库文件进行设计的同学应该都深有体会……
至于怎么用才好,没有标准的答案,就需要未来大家自己去积累相关经验了。
今天的分享就写到这里。
欢迎关注作者的微信公众号:「超人的电话亭」