问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何设计出最完美的动画技术架构

发布网友 发布时间:2024-09-17 10:47

我来回答

1个回答

热心网友 时间:2024-09-29 11:59

动画在前端领域中的作用是提升用户体验、吸引用户注意力。在互联网行业中,它也是一个永久的热点话题。一般在电商平台或者娱乐类项目(快手、拼多多、淘宝、腾讯视频、抖音等)中会出现很多的动画场景。那么通过本文,大家可以提高哪些方面的认知呢?

1.前端人员实现动画的技术有哪些?2.每种动画的实现技术有什么特点,适合什么样的场景?2.拿到需求稿或者动画demo的时候,如何选择最合适的技术栈?(选择合适的技术栈在任何时候都是对程序员非常重要的一个考验)3.制作一系列的动画,各岗位的人该如何配合,每个人分别做什么快手今年在业内比较成功的项目——春节系列项目

整个系列的项目动画元素非常多,但是每个地方都需要根据动画的特点去选择最合适的技术去实现才能达到性能以及展示的最高标准,才能演绎出最高级的动画。那么研发人员和设计人员在接到需求的时候就要去合作沟通去设计出最完美的动画技术架构。

前期考虑

兼容性、稳定性、体积、性能、用户设备(低端机测试)。

技术栈

APNG、cssAnimation、SVG、Lottie、Canvas、WebGL、cocos、webp、TransparentVideo......

APNG

apng动画传送门

介绍:全称AnimatedPNG,诞生于2004年。

特征:

支持透明动画的png(本质也是位图),是png的一个拓展。所以在不支持apng的设备上时,能降级显示一个png静图。虽然gif和apng都是动图,但是apng的画质比gif好很多,需要由设计师来产出(下图为gif图和apng图对比)。前端这边的使用方法和用其他格式的图片一样,可以直接作为图片插入到网页中去。

优点:

(1)24位真彩色(gif是8位色,这里的位可以理解为2的多少次方,8位色就是2的8次方,即256种颜色,也就是说gif最多可以展示256种颜色,所以gif的色阶过渡会比apng差很多),

(2)8位alpha透明通道(gif格式不支持alpha通道,即不支持半透明,但是我们都知道位图中图形边缘的那部分像素是半透明的,如下图,所以gif因为不支持半透明,图的边缘会有锯齿)。

一个图像的每个像素都有RGB(红色、绿色、蓝色)三个通道,后来又出现了一个通道alpha通道。一个使用32个比特存储的位图,每8个比特表示红(8)、绿(8)、蓝(8)、alpha(8)通道。

在这种情况下,alpha通道就可以表示256(2的8次方)级的半透明度,就可以把透明度控制得比较顺滑,而gif没有alpha通道,所以它只能展示为透明或者不透明,就没有控制半透明度的余地。

缺点:兼容性暂时不是很好,但是现在有一些工具会支持制作AnimatedPNG图片。

cssAnimation

前端人员应该都会比较熟悉CSSAnimation。

如果大家深入地去了解CSS,你会发现:万物皆可CSS。

优点:浏览器对CSS3动画做了很多优化,比如专门新建一个图层用来跑动画、强制硬件加速。

缺点:可以从头到尾完成动画,但是比较难以在动画过程中按照我们的意愿去做交互控制。

大家可以一起试做这个小demo感受下CSSAnimation的编写特点,肚皮抖动的效果:

<divclass="belly"></div>/*第一步:画个肚皮*/.belly{/*第二步:给DOM元素选择器里设置属性animation*/width:80px;height:90px;position:absolute;background:#eeeeee;border-radius:10%20%40%40%;animation:wave20.08sinfinitealternate;}@keyframeswave2{/*第三步:写@keyframes+动画名描述动画*/from{top:76px;left:8px;border-radius:10%20%40%60%;}to{top:74px;left:12px;border-radius:10%20%30%30%;}}

目前比较成熟的css动画库:Animate.css

灵感爆棚的CSS动画博主:chokcoco

适合调试css动画的在线编辑工具:CodePen

SVG动画

上图所示的动画需要用多种技术栈去实现,还需要用JavaScript去控制发光块旋转的生命周期(旋转前期、旋转倒计时阶段、旋转到最后一格等)以及在固定的卡点及时做数据的清除。

部分代码:

<svg><clipPathid="svgTextPath">/*这里可以定义不规则形状的动画容器(带阴影的魔盒外形)*/<pathclass="box"d="..."/></clipPath></svg>.out-motion{clip-path:url(#svgTextPath);/*在有动画的元素上做个剪切蒙版,镂空的部分就是刚刚的svg图形*、.......inner-light{will-change:transform;animation:sun4slinearinfinite;......}}

优点:svg描述的形状可以完全自定义,也就是说我们可以任意地凹这个动画容器的造型,就像烧纸陶瓷那样(亏我想得出来)。

我们也可以先描述形状,再在里面添加animate元素来制作动画:

<rectx="10"y="10"width="200"height="20"stroke="black"fill="none"><animateattributeName="width"attributeType="XML"from="200"to="20"begin="0s"dur="5s"fill="freeze"/></rect>

特征:(1)矢量图,可伸缩,在不同的平台或者媒体下表现良好,无锯齿无模糊。(2)其DOM结构可以被其特定语法或者Javascript控制,从而轻松的实现动画。

位图和矢量图位图:如左图,由一个格子一个格子组成,每个格子里只有一种颜色,很多个单色的格子拼接成的一个图片(这里的一个格子就是一个像素)。

矢量图:如右图,由二维坐标通过连线形成的图片,所以无论它图片的面积多大,它都没有锯齿,因为它相当于是通过数学公式算出坐标然后连接起来的图片。

Lottie

Lottie官网

使用方式:设计师在AE上完成动画后,通过AE的插件BodyMovin导出一个json文件给到前端,前端再拿这个json文件去做渲染(具体的使用细节可以看下Lottie的官网)。

优点:动效柔和、过渡自然。

缺点:插件BodyMovin待完善,有部分AE效果无法导出。

Echarts动画

大家都知道Echarts是图标库,但是它其实可以做动画。我们在文章的开头说,动画的技术选型要结合具体场景和需求,这确实需要我们脑袋里要有个储存库。

比如我们要做一个风控用户的展示页面,每个用户都有一个风险值,需要在动画中展示这个风险用户的风险程度(即处理此风险用户的急迫程度),我们就可以使用echart中的liquid水球图(即数字越大,水流越湍急)。图表不仅可以做数据的可视化,也可以展示情绪的可视化,因为最终看这个页面的人还是想要快速地感知两个东西:一个是情绪,另一个是已经量化好的东西。这样展示可以最大化地产生共情。

liquild水球图代码示例:

constliquidChart=echarts.init(document.getElementById("liquidChart"));constliquidOpt={series:[{type:'liquidFill',radius:'95%',label:{show:false},shape:'path://M367.855,428.202c-3.674-1.385-7.452-1.966-11.146-1.794c0.659-2.922,0.844-5.85,0.58-8.719c-0.937-10.407-7.663-19.864-18.063-23.834c-10.697-4.043-22.298-1.168-29.902,6.403c3.015,0.026,6.074,0.594,9.035,1.728c13.626,5.151,20.465,20.379,15.32,34.004c-1.905,5.02-5.177,9.115-9.22,12.05c-6.951,4.992-16.19,6.536-24.777,3.271c-13.625-5.137-20.471-20.371-15.32-34.004c0.673-1.768,1.523-3.423,2.526-4.992h-0.014c0,0,0,0,0,0.014c4.386-6.853,8.145-14.279,11.146-22.187c23.294-61.505-7.689-130.278-69.215-153.579c-61.532-23.293-130.279,7.69-153.579,69.202c-6.371,16.785-8.679,34.097-7.426,50.901c0.026,0.554,0.079,1.121,0.132,1.688c4.973,57.107,41.767,109.148,98.945,130.793c58.162,22.008,121.303,6.529,162.839-34.465c7.103-6.893,17.826-9.444,27.679-5.719c11.858,4.491,18.565,16.6,16.719,28.643c4.438-3.126,8.033-7.564,10.117-13.045C389.751,449.992,382.411,433.709,367.855,428.202z',/*这里可以用svg设置自定义的形状(水流容器的形状),也有一些预设选项如矩形rect、钻石菱形diamond*/amplitude:0,/*波的振幅*/waveAnimation:false,/*水波动画*/outline:{show:false},backgroundStyle:{borderColor:'#156ACF',borderWidth:1,shadowColor:'rgba(0,0,0,0.4)',shadowBlur:20},data:[0.6,{value:0.5,direction:'left',itemStyle:{normal:{color:'red'}}},0.4,0.3]/*这个数组里有几个元素,就有几层水波,每层水波可以设置自己的属性*/}]};liquidChart.setOption(liquidOpt);Canvas

优点:擅长做像素处理,动态渲染和大数据量绘制。

缺点:画布较大时候性能较低,依赖于像素。

特点:注重描绘动画的感觉,像在白色的画布上用笔自由地画出东西的感觉。

适用场景:刮刮乐、汽车表盘、绘制图表(百度Echarts就是基于htmlCanvas的图标库)、小游戏。

webGL

基于html5webGL的3d科幻风机

优点:1.擅长做数据可视化;2.利用底层的图形硬件加速功能进行的图形渲染,所以它可以流畅地展示3D场景和模型;3.和它比较相似的Flash是需要浏览器下载插件的,但是webGL不需要下载插件就可以直接看;

缺点:入门比较困难,它的语言风格比较像C++,前端人员可能有一定的学习成本。

介绍:三维动图渲染技术,本质是JavaScriptAPI。如果用最通(庸)俗(俗)的话来讲就是:创建一个着色器,然后把数据data传到GPU,然后GPU在根据两边传来的内容输出成动画。

步骤:

1.初始化

2.编译着色器

shader=gl.createShader(gl.VERTEX_SHADER);

shader=gl.createShader(gl.FRAGMENT_SHADER);

3.将输入的数据传到GPU

constbuffer=gl.createBuffer();

gl.bindBuffer(gl.ARRAY_BUFFER,buffer);

gl.bufferData(gl.ARRAY_BUFFER,positionsData,gl.STATIC_DRAW);

4.绘制

gl.clear(gl.COLOR_BUFFER_BIT);

gl.drawArrays(gl.TRIANGLES,0,3);

当然现在前端涉及的知识面很广,实现动画的技术不仅仅局限于以上这几种,而且未来也会有更多新技术的出现。但是每当一个新的技术出来的时候,我们还是要保持独立思考的能力以及自己的批判思维,切记不能盲目跟风。大部分情况下,作为一名前端,技术栈的选择还是要从性能和用户的角度出发。

引用:

1.快手春节活动设计背后的故事

热心网友 时间:2024-09-29 11:58

动画在前端领域中的作用是提升用户体验、吸引用户注意力。在互联网行业中,它也是一个永久的热点话题。一般在电商平台或者娱乐类项目(快手、拼多多、淘宝、腾讯视频、抖音等)中会出现很多的动画场景。那么通过本文,大家可以提高哪些方面的认知呢?

1.前端人员实现动画的技术有哪些?2.每种动画的实现技术有什么特点,适合什么样的场景?2.拿到需求稿或者动画demo的时候,如何选择最合适的技术栈?(选择合适的技术栈在任何时候都是对程序员非常重要的一个考验)3.制作一系列的动画,各岗位的人该如何配合,每个人分别做什么快手今年在业内比较成功的项目——春节系列项目

整个系列的项目动画元素非常多,但是每个地方都需要根据动画的特点去选择最合适的技术去实现才能达到性能以及展示的最高标准,才能演绎出最高级的动画。那么研发人员和设计人员在接到需求的时候就要去合作沟通去设计出最完美的动画技术架构。

前期考虑

兼容性、稳定性、体积、性能、用户设备(低端机测试)。

技术栈

APNG、cssAnimation、SVG、Lottie、Canvas、WebGL、cocos、webp、TransparentVideo......

APNG

apng动画传送门

介绍:全称AnimatedPNG,诞生于2004年。

特征:

支持透明动画的png(本质也是位图),是png的一个拓展。所以在不支持apng的设备上时,能降级显示一个png静图。虽然gif和apng都是动图,但是apng的画质比gif好很多,需要由设计师来产出(下图为gif图和apng图对比)。前端这边的使用方法和用其他格式的图片一样,可以直接作为图片插入到网页中去。

优点:

(1)24位真彩色(gif是8位色,这里的位可以理解为2的多少次方,8位色就是2的8次方,即256种颜色,也就是说gif最多可以展示256种颜色,所以gif的色阶过渡会比apng差很多),

(2)8位alpha透明通道(gif格式不支持alpha通道,即不支持半透明,但是我们都知道位图中图形边缘的那部分像素是半透明的,如下图,所以gif因为不支持半透明,图的边缘会有锯齿)。

一个图像的每个像素都有RGB(红色、绿色、蓝色)三个通道,后来又出现了一个通道alpha通道。一个使用32个比特存储的位图,每8个比特表示红(8)、绿(8)、蓝(8)、alpha(8)通道。

在这种情况下,alpha通道就可以表示256(2的8次方)级的半透明度,就可以把透明度控制得比较顺滑,而gif没有alpha通道,所以它只能展示为透明或者不透明,就没有控制半透明度的余地。

缺点:兼容性暂时不是很好,但是现在有一些工具会支持制作AnimatedPNG图片。

cssAnimation

前端人员应该都会比较熟悉CSSAnimation。

如果大家深入地去了解CSS,你会发现:万物皆可CSS。

优点:浏览器对CSS3动画做了很多优化,比如专门新建一个图层用来跑动画、强制硬件加速。

缺点:可以从头到尾完成动画,但是比较难以在动画过程中按照我们的意愿去做交互控制。

大家可以一起试做这个小demo感受下CSSAnimation的编写特点,肚皮抖动的效果:

<divclass="belly"></div>/*第一步:画个肚皮*/.belly{/*第二步:给DOM元素选择器里设置属性animation*/width:80px;height:90px;position:absolute;background:#eeeeee;border-radius:10%20%40%40%;animation:wave20.08sinfinitealternate;}@keyframeswave2{/*第三步:写@keyframes+动画名描述动画*/from{top:76px;left:8px;border-radius:10%20%40%60%;}to{top:74px;left:12px;border-radius:10%20%30%30%;}}

目前比较成熟的css动画库:Animate.css

灵感爆棚的CSS动画博主:chokcoco

适合调试css动画的在线编辑工具:CodePen

SVG动画

上图所示的动画需要用多种技术栈去实现,还需要用JavaScript去控制发光块旋转的生命周期(旋转前期、旋转倒计时阶段、旋转到最后一格等)以及在固定的卡点及时做数据的清除。

部分代码:

<svg><clipPathid="svgTextPath">/*这里可以定义不规则形状的动画容器(带阴影的魔盒外形)*/<pathclass="box"d="..."/></clipPath></svg>.out-motion{clip-path:url(#svgTextPath);/*在有动画的元素上做个剪切蒙版,镂空的部分就是刚刚的svg图形*、.......inner-light{will-change:transform;animation:sun4slinearinfinite;......}}

优点:svg描述的形状可以完全自定义,也就是说我们可以任意地凹这个动画容器的造型,就像烧纸陶瓷那样(亏我想得出来)。

我们也可以先描述形状,再在里面添加animate元素来制作动画:

<rectx="10"y="10"width="200"height="20"stroke="black"fill="none"><animateattributeName="width"attributeType="XML"from="200"to="20"begin="0s"dur="5s"fill="freeze"/></rect>

特征:(1)矢量图,可伸缩,在不同的平台或者媒体下表现良好,无锯齿无模糊。(2)其DOM结构可以被其特定语法或者Javascript控制,从而轻松的实现动画。

位图和矢量图位图:如左图,由一个格子一个格子组成,每个格子里只有一种颜色,很多个单色的格子拼接成的一个图片(这里的一个格子就是一个像素)。

矢量图:如右图,由二维坐标通过连线形成的图片,所以无论它图片的面积多大,它都没有锯齿,因为它相当于是通过数学公式算出坐标然后连接起来的图片。

Lottie

Lottie官网

使用方式:设计师在AE上完成动画后,通过AE的插件BodyMovin导出一个json文件给到前端,前端再拿这个json文件去做渲染(具体的使用细节可以看下Lottie的官网)。

优点:动效柔和、过渡自然。

缺点:插件BodyMovin待完善,有部分AE效果无法导出。

Echarts动画

大家都知道Echarts是图标库,但是它其实可以做动画。我们在文章的开头说,动画的技术选型要结合具体场景和需求,这确实需要我们脑袋里要有个储存库。

比如我们要做一个风控用户的展示页面,每个用户都有一个风险值,需要在动画中展示这个风险用户的风险程度(即处理此风险用户的急迫程度),我们就可以使用echart中的liquid水球图(即数字越大,水流越湍急)。图表不仅可以做数据的可视化,也可以展示情绪的可视化,因为最终看这个页面的人还是想要快速地感知两个东西:一个是情绪,另一个是已经量化好的东西。这样展示可以最大化地产生共情。

liquild水球图代码示例:

constliquidChart=echarts.init(document.getElementById("liquidChart"));constliquidOpt={series:[{type:'liquidFill',radius:'95%',label:{show:false},shape:'path://M367.855,428.202c-3.674-1.385-7.452-1.966-11.146-1.794c0.659-2.922,0.844-5.85,0.58-8.719c-0.937-10.407-7.663-19.864-18.063-23.834c-10.697-4.043-22.298-1.168-29.902,6.403c3.015,0.026,6.074,0.594,9.035,1.728c13.626,5.151,20.465,20.379,15.32,34.004c-1.905,5.02-5.177,9.115-9.22,12.05c-6.951,4.992-16.19,6.536-24.777,3.271c-13.625-5.137-20.471-20.371-15.32-34.004c0.673-1.768,1.523-3.423,2.526-4.992h-0.014c0,0,0,0,0,0.014c4.386-6.853,8.145-14.279,11.146-22.187c23.294-61.505-7.689-130.278-69.215-153.579c-61.532-23.293-130.279,7.69-153.579,69.202c-6.371,16.785-8.679,34.097-7.426,50.901c0.026,0.554,0.079,1.121,0.132,1.688c4.973,57.107,41.767,109.148,98.945,130.793c58.162,22.008,121.303,6.529,162.839-34.465c7.103-6.893,17.826-9.444,27.679-5.719c11.858,4.491,18.565,16.6,16.719,28.643c4.438-3.126,8.033-7.564,10.117-13.045C389.751,449.992,382.411,433.709,367.855,428.202z',/*这里可以用svg设置自定义的形状(水流容器的形状),也有一些预设选项如矩形rect、钻石菱形diamond*/amplitude:0,/*波的振幅*/waveAnimation:false,/*水波动画*/outline:{show:false},backgroundStyle:{borderColor:'#156ACF',borderWidth:1,shadowColor:'rgba(0,0,0,0.4)',shadowBlur:20},data:[0.6,{value:0.5,direction:'left',itemStyle:{normal:{color:'red'}}},0.4,0.3]/*这个数组里有几个元素,就有几层水波,每层水波可以设置自己的属性*/}]};liquidChart.setOption(liquidOpt);Canvas

优点:擅长做像素处理,动态渲染和大数据量绘制。

缺点:画布较大时候性能较低,依赖于像素。

特点:注重描绘动画的感觉,像在白色的画布上用笔自由地画出东西的感觉。

适用场景:刮刮乐、汽车表盘、绘制图表(百度Echarts就是基于htmlCanvas的图标库)、小游戏。

webGL

基于html5webGL的3d科幻风机

优点:1.擅长做数据可视化;2.利用底层的图形硬件加速功能进行的图形渲染,所以它可以流畅地展示3D场景和模型;3.和它比较相似的Flash是需要浏览器下载插件的,但是webGL不需要下载插件就可以直接看;

缺点:入门比较困难,它的语言风格比较像C++,前端人员可能有一定的学习成本。

介绍:三维动图渲染技术,本质是JavaScriptAPI。如果用最通(庸)俗(俗)的话来讲就是:创建一个着色器,然后把数据data传到GPU,然后GPU在根据两边传来的内容输出成动画。

步骤:

1.初始化

2.编译着色器

shader=gl.createShader(gl.VERTEX_SHADER);

shader=gl.createShader(gl.FRAGMENT_SHADER);

3.将输入的数据传到GPU

constbuffer=gl.createBuffer();

gl.bindBuffer(gl.ARRAY_BUFFER,buffer);

gl.bufferData(gl.ARRAY_BUFFER,positionsData,gl.STATIC_DRAW);

4.绘制

gl.clear(gl.COLOR_BUFFER_BIT);

gl.drawArrays(gl.TRIANGLES,0,3);

当然现在前端涉及的知识面很广,实现动画的技术不仅仅局限于以上这几种,而且未来也会有更多新技术的出现。但是每当一个新的技术出来的时候,我们还是要保持独立思考的能力以及自己的批判思维,切记不能盲目跟风。大部分情况下,作为一名前端,技术栈的选择还是要从性能和用户的角度出发。

引用:

1.快手春节活动设计背后的故事

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
青海摇什么时候火的 宋庄镇都有哪些村 唐山多地解除封控管理、静态管理,市民仍需做好哪些防护? 拼多多上面的旗舰店是正品吗 ...尺是20:1的图纸上,应画多少厘米,在比例尺是1:200的图纸上测_百度知... 4x2=8,4x20=8,4x200=800,我发现了:一个因数不变,另外一个因数乘以几,积... 小学三年级数学上册4X2=8,4X20=80,4X200=800我发现:一个因数不变,另... 描写雪的段落优选好句60句 程序员最低学历是多少 电脑不识别独显了怎么办? 南稍门的长鑫领先国际里面中介多不多 太原市尖草坪区长鑫栋副食便利店招聘信息,太原市尖草坪区长鑫栋副食便... 上海长鑫汽配有限公司招聘信息,上海长鑫汽配有限公司怎么样? 碑林南门站(地铁2号线永宁门B口)长鑫领先国际1612A,这个是不是中介... 吃沙梨的好处是什么 苹果沙梨无花果川贝雪耳元肉冰糖水 苹果和沙梨做水果羹,对感冒、微发烧有效么?如题 谢谢了 苹果沙梨猪骨汤基本步骤 MySQL如何建立一对多关系表mysql一对多表建立 MySQL自动创建新表方法详解mysql不存在则新建 C语言编程MySQL中新建表的操作步骤cmysql新建表 如何在MySQL中创建表及列的详细教程mysql中创建表列 MySQL中简单快速创建数据表的语句示例cmysql创建表语句 无需代码快速创建MySQL表格mysql不用代码创建表 中财和联塑哪个好 联塑排水管和中财排水管哪个质量好? 联塑排水管与中财排水管,质量对比如何? 为什么青早起来回一柱擎天拜托各位大神 可视化拖拽布局框架? css行内样式hover(css行内样式写法) 17世纪中国用哪种文字 教师节学生给了几个数字17 12 19 10 18 17 12换成文字是什么 中国已经停止使用的17种文字是哪些 奢侈情侣装品牌排行榜,高档点的情侣装牌子_情侣装品牌推荐有哪些... 什么牌子的情侣服装口碑好? 哪些植物传播种子 梦见全家赶着去小姨的坟墓的预兆 家具喷了遍乳胶漆能再做油漆吗? 2024张雪峰谈护理学说了什么 特味锡纸烤茄子怎么做好吃 锡纸茄子的做法烧烤烧烤锡纸茄子怎么做 怎么做味道好吃的锡纸茄子? 哥哥姐姐们 邢台清河到石家庄的距离是多少哇! 黄疸多少算正常的 我朋友在上海偷了快递几件衣服关了50天了,怎样才能问了到要关多久啊... 我朋友在上海偷了快递几件衣服关了37天了难道还要判刑吗? 懂你的经典句子 假如你爸爸是个爱喝酒的人,他开车出门吃饭,你会怎么对他说呢?_百度知... 搅拌车轮胎有泥巴被城管扣了怎么办 为什么手机老是提示粘贴自