在这篇博文中,您将了解如何在 CodePen 上制作一些热门动画。 这些动画均使用本部分其他文章中介绍的高性能技术。
如需了解这些建议背后的理论,请参阅为什么某些动画运行缓慢?;如需获取实用提示,请参阅动画指南。
向导加载动画
此加载动画完全使用 CSS 构建而成。 图片和所有动画均使用 CSS 和 HTML 创建,不含图片或 JavaScript。如需了解其创建方式及其性能,您可以使用 Chrome 开发者工具。
使用 Chrome 开发者工具检查动画
动画运行时,打开 Chrome DevTools 中的“性能”标签页,并录制几秒钟的动画。 您应该会在“摘要”中看到,浏览器在运行此动画时未执行任何布局或绘制操作。
如需了解如何在不导致布局和绘制的情况下实现此动画,请在 Chrome 开发者工具中检查所有移动的元素。您可以使用“动画”面板查找各种动画元素,点击任何元素都会在 DOM 中突出显示该元素。
例如,选择三角形,观察元素在向空中转动的过程中是如何变形的,因为在旋转,然后回到起始位置。
保持选中该元素,查看“样式”面板。 您可以在此处看到用于绘制三角形形状的 CSS 和所使用的动画。
工作原理
该三角形是使用 ::after
伪元素添加生成的内容,并使用边框创建形状而创建的。
.triangle {
position: absolute;
bottom: -62px;
left: -10px;
width: 110px;
height: 110px;
border-radius: 50%;
}
.triangle::after {
content: "";
position: absolute;
top: 0;
right: -10px;
width: 0;
height: 0;
border-style: solid;
border-width: 0 28px 48px 28px;
border-color: transparent transparent #89beb3 transparent;
}
动画是通过以下 CSS 代码行添加的:
animation: path_triangle 10s ease-in-out infinite;
在 Chrome 开发者工具中,您可以向下滚动“样式”面板,找到关键帧。
您会发现,创建动画时使用的是 transform
来更改元素的位置并旋转元素。transform
属性是动画指南中所述的属性之一,该属性不会导致浏览器执行布局或绘制操作(这是导致动画运行缓慢的主要原因)。
@keyframes path_triangle {
0% {
transform: translateY(0);
}
10% {
transform: translateY(-172px) translatex(10px) rotate(-10deg);
}
55% {
transform: translateY(-172px) translatex(10px) rotate(-365deg);
}
58% {
transform: translateY(-172px) translatex(10px) rotate(-365deg);
}
63% {
transform: rotate(-360deg);
}
}
此动画的每个不同移动部分都使用了类似的技术。由此可以得到一个复杂的动画,该动画可以流畅地播放。
跳动的圆圈
此类动画有时用于吸引用户注意页面上的某些内容。如需了解动画,您可以使用 Firefox DevTools。
使用 Firefox 开发者工具检查动画
动画运行时,打开 Firefox DevTools 中的“性能”标签页,并录制几秒钟的动画。 停止录制,您应该会在广告瀑布流中看到没有 Recalculate Style 条目。现在,您已经知道此动画不会导致样式重新计算,因此也不会导致布局和绘制操作。
在 Firefox 开发者工具中,检查圆圈,了解此动画的运作方式。
类为 pulsating-circle
的 <div>
用于标记圆形的位置,但不会自行绘制圆形。
.pulsating-circle {
position: absolute;
left: 50%;
top: 50%;
transform: translateX(-50%) translateY(-50%);
width: 30px;
height: 30px;
}
可见圆和动画是使用 ::before
和 ::after
伪元素实现的。
::before
元素使用名为 pulse-ring
的动画(用于为 transform: scale
和 opacity
添加动画效果)创建延伸到白色圆圈之外的不透明圆环。
.pulsating-circle::before {
content: '';
position: relative;
display: block;
width: 300%;
height: 300%;
box-sizing: border-box;
margin-left: -100%;
margin-top: -100%;
border-radius: 45px;
background-color: #01a4e9;
animation: pulse-ring 1.25s cubic-bezier(0.215, 0.61, 0.355, 1) infinite;
}
@keyframes pulse-ring {
0% {
transform: scale(0.33);
}
80%, 100% {
opacity: 0;
}
}
如需查看哪些属性正在呈现动画效果,您还可以选择 Firefox 开发者工具中的动画面板。然后,您会看到正在使用的动画和正在添加动画的属性的可视化图表。
白色圆圈本身是使用 ::after
伪元素创建和呈现动画效果的。动画 pulse-dot
使用 transform: scale
在动画期间放大和缩小圆点。
.pulsating-circle::after {
content: '';
position: absolute;
left: 0;
top: 0;
display: block;
width: 100%;
height: 100%;
background-color: white;
border-radius: 15px;
box-shadow: 0 0 8px rgba(0, 0, 0, 0.3);
animation: pulse-dot 1.25s cubic-bezier(0.455, 0.03, 0.515, 0.955) -0.4s infinite;
}
@keyframes pulse-dot {
0% {
transform: scale(0.8);
}
50% {
transform: scale(1);
}
100% {
transform: scale(0.8);
}
}
此类动画可在应用的各个位置使用,请务必确保这些小细节不会影响应用的整体性能。
纯 CSS 3D 球体
此动画看起来非常复杂,但它使用的是我们在前面的示例中已经看到的技巧。为大量元素添加动画效果会带来复杂性。
打开 Chrome 开发者工具,然后选择一个类为 plane
的元素。
球体由一组旋转平面和辐条组成。
这些平面和辐条位于封装容器 <div>
中,并且正是此元素使用 transform: rotate3d
进行旋转。
.sphere-wrapper {
transform-style: preserve-3d;
width: 300px;
height: 300px;
position: relative;
animation: rotate3d 10s linear infinite;
}
@keyframes rotate3d {
0% {
transform: rotate3d(1, 1, 1, 0deg);
}
25% {
transform: rotate3d(1, 1, 1, 90deg);
}
50% {
transform: rotate3d(1, 1, 1, 180deg);
}
75% {
transform: rotate3d(1, 1, 1, 270deg);
}
100% {
transform: rotate3d(1, 1, 1, 360deg);
}
}
这些圆点位于 plane
和 spoke
元素内,它们使用动画,该动画使用转换来缩放和平移它们。这样就会产生脉动效果。
.spoke-15 .dot,
.spoke-21 .dot {
animation: pulsate 0.5s infinite 0.83333333s alternate both;
background-color: #55ffee;
}
@-webkit-keyframes pulsate {
0% {
transform: rotateX(90deg) scale(0.3) translateZ(20px);
}
100% {
transform: rotateX(90deg) scale(1) translateZ(0px);
}
}
制作此动画的工作就是要把时间安排得当,以便实现旋转和脉动效果。动画本身非常简单,并且使用效果非常出色的方法。
您可以打开 Chrome DevTools,并在动画运行时记录性能,以查看此动画的性能。 初始加载后,动画不会触发布局或绘制,并且会顺畅地运行。
总结
从这些示例中,您可以了解如何使用高性能方法为几个属性添加动画,从而创建一些非常酷的动画。 默认使用动画指南中介绍的高性能方法,您可以专注于创建所需的效果,而无需过多担心网页运行缓慢。