通过创建纯 CSS 加载器来学习 CSS 动画
你一直想学习 CSS 动画的基础知识吗?我也是!让我们一起在 5 分钟内创建一些纯 CSS 加载动画。
在我们开始之前
CSS 动画已有多年历史。所有主流浏览器的最新版本均已完全支持 CSS 动画。本教程的最后,我们将介绍如何回退到旧版浏览器。
语法
让我们直接查看以下示例:
<!-- HTML -->
<div class="simple-spinner"></div>
/* CSS */
.simple-spinner {
height: 48px;
width: 48px;
border: 5px solid rgba(150, 150, 150, 0.2);
border-radius: 50%;
border-top-color: rgb(150, 150, 150);
animation: rotate 1s 0s infinite ease-in-out alternate;
}
@keyframes rotate {
0% { transform: rotate(0); }
100% { transform: rotate(360deg); }
}
// 结果
看起来已经很酷了!这里发生了什么?首先,我们创建一个圆环,<div>
宽度和高度相同,边框颜色不同,并且设置了 50% 的 border-radius 半径。要应用动画,我们会看到两件事:
- 定义
animation
我们想要动画的元素的属性 - 定义
@keyframes
规则
动画属性
animation
是一个简写属性,用于一次性设置多个动画属性。让我们以上面的例子为例,详细地看一下:
例子 | 财产 | 描述 |
---|---|---|
旋转 | animation-name |
要使用的动画的名称 |
1秒 | animation-duration |
一个动画周期持续多长时间 |
0秒 | animation-delay |
等待动画开始需要多长时间 |
无限 | animation-iteration-count |
动画应重复多少次 |
缓入缓出 | animation-timing-function |
动画如何在一个周期内进行 |
备用 | animation-direction |
向前、向后或来回交替进行动画。 |
这意味着,我们指定了一个名为“旋转”的动画,一个循环(360°)持续一秒,没有启动延迟,动画本身永远持续下去,动画进度不是线性的,而是来回交替(每秒循环一次都是向后)。
注意:为了完整起见,还有animation-fill-mode
和animation-play-state
,但我们不会在本教程中介绍这两个属性。
@keyframes 规则
现在让我们进入动画实际创建的部分。借助@keyframes
,您可以指定动画时间轴上的状态。对于每个状态,您可以定义何时出现(动画时间的百分比)以及要应用哪些样式声明。
上面的示例动画从 0% transform: rotate(0);
(无旋转)到 100% transform: rotate(360deg);
(一次完整旋转)。
当然,同一条@keyframes
规则可以被多个元素使用。以下是两个元素使用不同animation
规则但使用相同@keyframes
声明的示例:
<!-- HTML -->
<div class="double-spinner"></div>
/* CSS */
.double-spinner {
height: 48px;
width: 48px;
border: 5px solid rgba(150, 150, 150, 0.2);
border-radius: 50%;
border-top-color: rgb(150, 150, 150);
animation: rotate 1s 0s infinite linear normal;
}
.double-spinner::after {
content: '';
height: 40%;
width: 40%;
display: block;
margin: 10px auto;
border: inherit;
border-radius: inherit;
border-top-color: inherit;
animation: rotate .5s 0s infinite linear reverse;
}
@keyframes rotate {
0% { transform: rotate(0); }
100% { transform: rotate(360deg); }
}
// 结果
对于开始和结束状态(0%
和100%
),您还可以使用关键字from
和 ,to
如下所示:
@keyframes rotate {
from { transform: rotate(0); }
to { transform: rotate(360deg); }
}
让我们看一个包含更多状态的示例:
<!-- HTML -->
<div class="flip-walker"></div>
/* CSS */
.flip-walker {
width: 64px;
height: 64px;
}
.flip-walker::before {
content: '';
display: block;
width: 50%;
height: 50%;
background: rgba(150, 150, 150, .5);
animation: flip 2s 0s infinite ease normal;
}
@keyframes flip {
0% { transform: translate(0, 0) rotateX(0) rotateY(0); }
25% { transform: translate(100%, 0) rotateX(0) rotateY(180deg); }
50% { transform: translate(100%, 100%) rotateX(-180deg) rotateY(180deg); }
75% { transform: translate(0, 100%) rotateX(-180deg) rotateY(360deg); }
100% { transform: translate(0, 0) rotateX(0) rotateY(360deg); }
}
// 结果
这里我们应用了五种不同状态下的CSS 转换,以制作翻转正方形的动画。
多个动画
可以将多个动画应用于同一元素。如果我们想让上方翻转的正方形同时发光,只需添加另一个动画,并以逗号分隔即可:
/* CSS */
.flip-walker::before {
/* ... */
animation:
flip 2s 0s infinite ease normal,
glow 2s 0s infinite linear normal;
}
@keyframes flip {
/* ... */
}
@keyframes glow {
to { background: white; box-shadow: 0 0 15px white; }
}
// 结果
注意:我只使用了to
规则,而省略了from
规则。这是可能的,因为浏览器会使用元素的现有/初始样式来处理缺失的开始或结束状态。
自定义计时功能
如果您对默认的计时函数不满意,可以借助三次贝塞尔曲线自定义计时函数。有很多工具可以定义这样的曲线,我主要使用Matthew Lein 提供的这个。
这是本教程的最后一个例子:
<!-- HTML -->
<div class="pulse"></div>
/* CSS */
.pulse {
width: 64px;
height: 64px;
background: white;
border-radius: 50%;
animation: pulse 1s 0s infinite cubic-bezier(0.000, 1.010, 0.5, 1.200) normal;
}
@keyframes pulse {
from { transform: scale(0); opacity: 1; }
to { transform: scale(1.0); opacity: 0; }
}
// 结果
计时功能刚刚被cubic-bezier(0.000, 1.010, 0.5, 1.200)
我创建的取代。
后备方案
如果您希望特别支持老版本浏览器,可以使用@supports
@ 规则进行功能查询,并提供后备选项,例如 GIF。以下是一个简单的示例:
/* CSS */
.animated {
background: url(animation-as.gif);
}
@supports (animation-name: test) {
.animated {
background: none;
animation-name: test;
/* ... */
}
@keyframes test {
/* ... */
}
}
不支持该animation-name
属性甚至不支持该@supports
规则的浏览器将简单地将 GIF 图像显示为元素的背景。
总结
借助一些简单的 CSS 加载动画示例(单个元素),我们了解了如何创建 CSS 动画、定义不同的动画状态、使用多个动画以及创建自定义时间函数。这就是您创建精彩 CSS 动画所需的一切!🔥
如果你想尝试一下上面的例子,我把它们都整理在这支笔里了。如果你有任何疑问,或者想分享你的创作,欢迎留言。
发布日期:2019 年 11 月 26 日
封面图片:https://codepen.io/devmount/full/NWWZKEN