用代码还原迪士尼片头动画

425 阅读2分钟

final.gif

GitHub: github.com/icochi/disn…

Gitee: gitee.com/icochi/disn…

Bilibili: www.bilibili.com/video/BV14N…

概述

利用一些 Web 特性,可以在网页中还原迪士尼电影的经典片头动画,首先可以将整体分成城堡、文字和流星三个部分。

castle.003.jpeg

一、 城堡动画

castle.004.jpeg

城堡背景可以用 clip-path 属性实现,clip-path 使用裁剪的方式创建元素的可显示区域。

castle.014.jpeg

castle.015.jpeg

castle.016.jpeg

castle.017.jpeg

前景的发光效果首先会想到使用 box-shadow 元素阴影

castle.020.jpeg

但是 box-shadow 只能作用于容器轮廓

castle.021.jpeg

而在我们想要实现的动画中阴影需要作用于图像本身

castle.022.jpeg

而使用 drop-shadow 滤镜,我们可以创建一个符合图像本身形状的阴影

castle.024.jpeg

使用多个 drop-shadow 强化发光效果

castle.025.jpeg

叠加模糊滤镜消除硬边缘

castle.026.jpeg

完成前景的光照还需要再进行裁剪

但是 clip-path 是在滤镜效果之后发生的,边缘的发光又被截断了

castle.030.jpeg

只能先逐帧制作城堡画面再叠加 drop-shadow

castle.033.jpeg

castle.032.jpeg

用 JavaScript 加载城堡图片

castle.036.jpeg

用 Canvas 执行裁剪并调用 API 生成 dataURL 位图

castle.038.jpeg

castle.040.jpeg

castle.042.jpeg

把生成的位图设置为元素背景,再循环执行裁剪更新

二、文字动画

pictures 文字及迪士尼文字比较简单,大家可以参考源码自行分析

castle.050.jpeg

castle.053.jpeg

闪光动画中光晕的基础形状并不规则,需要借助 SVG 形状和 drop-shadow 属性

castle.059.jpeg

castle.060.jpeg

path 元素的 d 属性能以 css 属性形式存在,于是光晕的变形动画可以用 css 关键帧动画来实现

castle.061.jpeg

castle.062.jpeg

路径变形动画是否生效关键在于,两个关键帧的形状坐标数量必须一致

castle.065.jpeg

三、流星动画

对流星动画进行拆解,我们要绘制两段弧线以及一个圆点

castle.069.jpeg

使用 SVG circle 元素绘制圆环

castle.079.jpeg

并设置 stroke-dasharray 和 stroke-dashoffset 制作弧线

castle.082.jpeg

关于这两个属性的详细说明,可以参考我的另一个视频

castle.083.jpeg 一笔画皮卡丘:SVG 路径生长/画线动画

翻转元素并调整角度,就得到了第一段圆弧

castle.089.jpeg

重复这一过程生成第二段圆弧

castle.092.jpeg

castle.093.jpeg

使用关键帧动画更新 stroke-dashoffset 属性实现画线动画

castle.098.jpeg

castle.097.jpeg

而最后的圆点动画有很多方法都能实现

castle.100.jpeg

castle.101.jpeg

castle.102.jpeg

所有分解动画都完成后,将它们合成并调整先后顺序

castle.103.jpeg

final.gif