使用CSS实现一个吃豆人的Loading加载效果

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加载效果。

希望本文能够对大家有所帮助!

免责声明:本文来自互联网,本站所有信息(包括但不限于文字、视频、音频、数据及图表),不保证该信息的准确性、真实性、完整性、有效性、及时性、原创性等,版权归属于原作者,如无意侵犯媒体或个人知识产权,请来电或致函告之,本站将在第一时间处理。猿码集站发布此文目的在于促进信息交流,此文观点与本站立场无关,不承担任何责任。