1. 简介
在网站开发过程中,常常需要用到loading效果来提醒用户等待。本文将介绍如何使用CSS实现一个小巧可爱的吃豆人(Pac-Man)的loading加载效果。
2. 实现思路
要实现一个吃豆人的loading效果,我们需要用到CSS动画、transform属性、伪元素、z-index属性等技术。
2.1 CSS动画
CSS动画可以让元素在浏览器中显示的时候产生动态效果,实现方式包括使用@keyframes和animation两个关键字。其中@keyframes用于声明一个动画序列,animation用于将刚才声明的动画序列应用于元素。
下面是一个使用CSS动画使一个方块从左到右移动的例子:
.box {
width: 50px;
height: 50px;
background-color: red;
animation: move 2s linear infinite;
}
@keyframes move {
0% {
transform: translateX(0);
}
100% {
transform: translateX(200px);
}
}
在上面的例子中,我们通过animation属性将move动画应用在.box元素上,并设置动画时间为2秒,执行方式为线性运动,并且让动画无限循环。
接下来,我们将运用这个知识来实现我们的loading效果。
2.2 transform属性
transform属性可以用于对元素进行旋转、平移、缩放、斜切等变换操作。其中translate()函数可以实现元素在水平或垂直方向上的平移。例如,下面的代码实现了一个垂直方向上移动的方块:
.box {
width: 50px;
height: 50px;
background-color: red;
animation: move 2s linear infinite;
}
@keyframes move {
0% {
transform: translateY(0);
}
100% {
transform: translateY(200px);
}
}
运行效果见下图:
2.3 伪元素
伪元素是指一些不能在HTML文档中找到的元素,如::before和::after。通过伪元素,我们可以在元素的前面或后面插入一些内容,从而实现一些特殊效果。
在本文中,我们将使用::before伪元素来实现吃豆人的头。
2.4 z-index属性
z-index属性用于设置元素的堆叠顺序。如果两个元素重叠在一起,那么z-index较高的元素将显示在上面。
在本文中,我们将使用z-index属性来控制吃豆人的左右移动。
3. 实现过程
现在我们开始实现我们的吃豆人loading效果。
3.1 HTML代码
我们需要在HTML中添加一个div元素,作为我们的loading效果的容器。接下来,我们使用::before伪元素来添加吃豆人的头。
<div class="loading"></div>
3.2 CSS代码
首先,我们来定义loading容器的样式:
.loading {
width: 50px;
height: 50px;
position: relative;
}
我们设置宽度和高度均为50px,将position属性设置为relative,让后面的绝对定位元素相对于该元素进行定位。
接下来,我们来定义吃豆人头部的样式:
.loading::before {
content: '';
display: block;
width: 50%;
height: 50%;
border-radius: 50% 50% 0 0;
background-color: yellow;
position: absolute;
top: 0;
left: 0;
transform-origin: center bottom;
animation: mouth 0.2s ease-in-out infinite;
}
@keyframes mouth {
0% {
transform: rotate(0);
}
50% {
transform: rotate(25deg);
}
100% {
transform: rotate(0);
}
}
我们给::before伪元素设置一个empty content,display属性为block,这表示该元素的宽度和高度将会被设置为父元素的50%。同时,我们将其设置为绝对定位,并且定位到loading容器的左上角。
我们给吃豆人头部添加了一个动画效果,通过将transform-origin属性设置为中心底部来设置旋转基准点,以实现嘴巴的张合效果。
接下来,我们来定义吃豆人身体部分的样式:
.loading::after {
content: '';
display: block;
width: 50%;
height: 50%;
border-radius: 0 0 50% 50%;
background-color: yellow;
position: absolute;
top: 50%;
right: 0;
transform-origin: center top;
animation: move 0.5s ease-in-out infinite;
z-index: 1;
}
@keyframes move {
0% {
transform: translateY(-50%) translateX(0);
}
25% {
transform: translateY(-60%) translateX(15%);
}
50% {
transform: translateY(-50%) translateX(0);
}
75% {
transform: translateY(-40%) translateX(-15%);
}
100% {
transform: translateY(-50%) translateX(0);
}
}
我们同样给::after伪元素设置了empty content和block display。由于我们需要将其定位在loading容器的右上角,我们在这里将其right属性设置为0。同时,我们将transform-origin属性设置为中心顶部,以便后面实现身体部分的左右移动效果。
我们给吃豆人身体部分添加了一个move动画,从而实现了左右摆动的效果。其中,我们通过translateY()和translateX()函数来控制吃豆人的左右移动,通过z-index属性来控制身体部分在头部的上方。
最终的代码如下所示:
.loading {
width: 50px;
height: 50px;
position: relative;
}
.loading::before {
content: '';
display: block;
width: 50%;
height: 50%;
border-radius: 50% 50% 0 0;
background-color: yellow;
position: absolute;
top: 0;
left: 0;
transform-origin: center bottom;
animation: mouth 0.2s ease-in-out infinite;
}
@keyframes mouth {
0% {
transform: rotate(0);
}
50% {
transform: rotate(25deg);
}
100% {
transform: rotate(0);
}
}
.loading::after {
content: '';
display: block;
width: 50%;
height: 50%;
border-radius: 0 0 50% 50%;
background-color: yellow;
position: absolute;
top: 50%;
right: 0;
transform-origin: center top;
animation: move 0.5s ease-in-out infinite;
z-index: 1;
}
@keyframes move {
0% {
transform: translateY(-50%) translateX(0);
}
25% {
transform: translateY(-60%) translateX(15%);
}
50% {
transform: translateY(-50%) translateX(0);
}
75% {
transform: translateY(-40%) translateX(-15%);
}
100% {
transform: translateY(-50%) translateX(0);
}
}
4. 结语
通过本文的介绍,我们了解了如何使用CSS动画、transform属性、伪元素和z-index属性来实现一个吃豆人的loading加载效果。
希望本文能够对大家有所帮助!