用SVG动画重现布尔运算的设计过程

这是在作图时突然迸发的灵感(是的,偶尔也会有那么一瞬间头脑开窍),作为设计师小伙伴们,平时用的最多的应该是布尔运算吧,基础图形的加加减减,得到任意的形状。就不说经典的Apple了,比如网易云音乐图标,你如果直接放上这个,似乎没什么。


但放上布尔运算过程的设计稿(所有基础图形的轮廓),瞬间高大上起来,满满的设计感。


所以在做矢量图的过程就突然想到如果能用SVG结合CSS3的动效来还原这个设计过程,也不失为一个好玩的效果,当然了,不会那么巧刚好用到所有的四种运算,只是用动画过程演示一遍,此为目的。因为自己的底子就很弱,所以选了一个临摹的图形,众位客官凑合看吧。

1.准备工作——图形分层

每次在做SVG动效之前,都会给自己一点时间思考一下动画完成的思路,以及用什么属性来实现,正所谓多点思考,少点劳作,或者换句话说,“不能用战术的勤奋来代替战略的懒惰”。
先放一张成品的效果图,如下,就是这只萌萌的小象


AI中做布尔运算虽然用路径查找器极其方便,且能切割,任意玩,但是修改起来却没有PS那么方便,给做完运算后的调整不是很方便的说。比如十几甚至更多个形状的布尔运算在PS里玩起来还算轻松,左挪右挪上层下层的调节么有压力,在AI里那要被玩坏了。所以第一步,要在AI里做好分层。注明一点,这些是要在作图之前就确定的。
我把小象分成三个部分,身体、头部和尾巴,目的就是为了减少每个部分的基本形状的数量。
AI中进行过布尔运算后的形状导出后是得到的结果的路径,这就不欢乐了,举个简单的例子:


上面两个圆形,相交之后得到的形状,导出后是<path d="">,完全不见两个圆形<circle>的踪迹,既然我们是还原过程,过程,就需要把原运算前的路径保留,怎么破?在进行运算之前原位复制到新的图层中呗。以小象的身体为例,我保留了两个图层,运算后和运算前的,这些路径都是我需要用到的。

2.创建图形过程的动画

鉴于自己这渣渣一般的水平,图形加减那一套过程就不拿出来嘚瑟了,还是留着自家珍藏吧,这里只说如何用动画表现出来。各位设计师回想一下自己的创建基本形状的过程,是不是选择形状后在画布进行鼠标拖动就可以了,嗯,这里我们主要实现的就是鼠标拖动的动画过程。来看下面这张图(不要给我讲你是按着alt键巴拉巴拉的,不管,要不这动画没法做了 ~~~(>_<)~~~):


从左上角到右下角的拖动过程就是图形的创建过程,而且在创建的过程中,图形是逐渐从无到有,从小到大的。好了,废话了半天,不不,是抛砖引玉,这就是我们实现创建图形过程的动画思路。

@keyframes draw{
0%{transform:scale(0,0);transform-origin:left top}
100%{transform:scale(1,1);transform-origin:left top}
}  
/*通用绘制过程的动画定义*/

经过分析我们得出,缩放变形transform:scale()是实现这种效果的最佳方案,这里唯一要注意的是关于变形的基点,前面在涉及旋转动画中,更多的定义是transform-origin:center center,也就是以圆心为基点,而这里定义的是左上角,也就是left top,其实CSS的一些语法真的算是很简单了,英语入门级。另外这里对应的left和top的值是相对位置,这也是为什么能把draw定义成通用的原因。
下面这张图形虚线部分是为了得到身体部分创建的所有基础图形,实色填充的部分即为最后需要的身体部分。

基础图形是由5个圆形和1个矩形共同组成的。我进行了标号。


对于身体部分,是4个圆形和1个矩形与1个基础圆形进行相减得到的。为了让动画过程更形象,让基础圆形进行了实色填充,其他形状用虚线来表示。根据上面动画的定义,先来实现基础图形的创建过程,CSS部分如下:

<style>
@keyframes draw{
0%{transform:scale(0,0);transform-origin:left top}
100%{transform:scale(1,1);transform-origin:left top}
} 
#circle0{animation:draw 1s ease;fill:#414c68;}/*基础形状用实色填充*/
#circle1{animation:draw 1s ease 1s backwards;}
#circle2{animation:draw 1s ease 2s backwards;}
#circle3{animation:draw 1s ease 3s backwards;}
#circle4{animation:draw 1s ease 4s backwards;}
#rect1{animation:draw 1s ease 5s backwards;}
.sketch{stroke:#c0f1ff;stroke-width:2;fill:none}/*其他形状用描边*/
</style>

SVG部分简化如下(去掉了和形状尺寸位置相关的属性定义):

<circle id="circle0"/> <!--基础形状-->
<g class="sketch">  <!--其他形状-->
<circle id="circle1" />
<circle id="circle2" />
<circle id="circle3"/>
<circle id="circle4"/>
<rect id="rect1"/>
</g>

简单解释一下,动画属性定义那里拿这个#circle1{animation:draw 1s ease 1s backwards;}为例,第一个1s是绘制时间,第二个1s是延迟时间,为了让图形呈现出依次创建的过程,所以延迟时间是递增的。backwards这个属性一定要定义,当我们给动画定义了延迟时,我们需要定义动画时间之外对象的状态(animation-fill-mode),backwards表示动画开始前应用开始属性值,也就是我们定义的scale(0,0),换句话说,是不显示的,这里也可以定义成both,对这个动画效果而言,没有区别。
现在看一下动画效果:


嗯,基本重现了创建了基础图形的过程。那么下一部分来了,怎么才能过渡到运算之后的形状呢?

3.运算过程的动画

在做这个动画伊始,我想到的是把相减的图形转化成蒙版,能行不?绝对能行,但实在是太麻烦了。记得我们还保留了运算后的图形放到了单独的图层中吧?这时,需要它粉墨登场了,然后其他的图形怎么办?集体消失!
关于消失的方法也有很多种,随便来个顺手的就行了,我准备用蒙版。为了实现组合图形消失以及运算后的图形出现的过程,不得已,又定义了两个动画,其实做到这里的时候,已经很后悔了,远不如好好学学AE,在AE里实现,但自己挖的坑,含着泪也要跳进去再努力爬出来啊,善始善终,硬着头皮继续做吧。流着泪补充了下面的动画定义:

@keyframes skip{
0%{opacity:0}
100%{opacity:1}
} /*这是为要登场的图形准备的*/
@keyframes combine{
0%{fill:#FFFFFF}
100%{fill:#000000}
}/*这是为要退出舞台的图形准备的*/

.skip{animation:skip 1s  6s both; fill:#414c68}
.combine{animation:combine 1s 6s both;}

以及:

<mask id="shade"><rect x="0" y="0" width="800" height="600" id="combine"/></mask> <!--蒙版定义-->
<g mask="url(#shade)">……</g>
<path class="skip" d=""/><!--组合后的形状-->

<g mask="url(#shade)">是把所有的图形又组合后,使用这个蒙版。唯一值得欣慰的是skip和combine这两个动画可以被复用。
插播一个小知识点,关于利用蒙版的渐隐动画,是不能用0%{opacity:0} 100%{opacity:1} 然后填充黑色fill:#000000这种表面上看上去是蒙版渐现的方式来实现,是因为当不给蒙版定义颜色时,蒙版会被默认为黑色,因此即使开始定义了透明度为0,也会被当做黑色处理。如果实在要用的话,就套两层蒙版,一层黑色的透明度改变,下面一层白色实色底。我只截变化的那一部分动画来看一下:


似乎衔接的还不错哟。

剩下的工作就是体力活了呃,需要把头部的动画和尾巴的动画补充上,没有什么特殊的,延迟的时间别弄错了就行,这里就不说了吧。最后得到的统一的动画是这个样子的:


与理想中那种满满的设计感有差异,不过还好。下面试着来优化一下,上个色吧。

4.颜色填充过程

颜色填充的过程,与这个展示绘制动画过程没有什么毛线关系,就是为了好看!好看!我还能说什么呢?说什么显示填色的过程,鬼,对于怎么展示渐变填充完美没有思路,我就利用了一下蒙版,把已经填充好的图形先用蒙版盖起来,让你们看不见看不见,然后在适当的时间,蒙版逐渐移动,露出填充好颜色图形。为了让蒙版显示的效果更加自然,这里我用渐变色对蒙版进行了填充。图示如下:

<defs>
<linearGradient id="gradient3"  x1="0" y1="0" x2="0" y2="600">
  <stop offset="0" stop-color="#ffffff"/>
  <stop offset="0.1" stop-color="#000000"/>
</linearGradient>
</defs> <!--定义的渐变类型-->

最后得到的效果如下:

另外,狠狠的告诫自己,下次再也不做这种费劲巴拉但不酷炫的效果了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 161,780评论 4 369
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,424评论 1 305
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 111,397评论 0 254
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,576评论 0 218
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,997评论 3 295
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,945评论 1 224
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,107评论 2 317
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,850评论 0 208
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,625评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,804评论 2 253
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,285评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,613评论 3 261
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,291评论 3 242
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,164评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,963评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,096评论 2 285
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,886评论 2 278

推荐阅读更多精彩内容

  • 在iOS中随处都可以看到绚丽的动画效果,实现这些动画的过程并不复杂,今天将带大家一窥iOS动画全貌。在这里你可以看...
    F麦子阅读 5,008评论 5 13
  • 在iOS中随处都可以看到绚丽的动画效果,实现这些动画的过程并不复杂,今天将带大家一窥ios动画全貌。在这里你可以看...
    每天刷两次牙阅读 8,326评论 6 30
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 170,594评论 25 707
  • 在前面两篇文章中,虽然完整描述了任意图形的变形动画实现方法,但最大的局限性显而易见,那就是都是一个图形变形成另一个...
    泱泱悲秋阅读 1,332评论 0 0
  • 开学的第一天,因为不适应在家以外的地方,花颜很早就醒了,但她看了看白亦可和刘零零,发现她们睡得很香,没有丝毫要睡醒...
    欢言欢语阅读 815评论 0 0