「本文已参与好文召集令活动,点击查看:后端、大前端双赛道投稿,2万元奖池等你挑战!」
介绍
在此之前啊,看到一个吃豆豆的游戏。那我们今天就用css3来搞一个吃豆豆的动画啊。
其实实现的方法也很简单。使用CSS3 @keyframes 动画和rotate() 属性进行一个旋转的控制,再加上一个box-shadow属性基本是就差不多了。
效果图
我们可以看到啊,小圆点一直做从右往左的动作,左边一个圆球又开又闭合,看起来就行往嘴里送东西的样子。
实现步骤
- 简单写个布局样式
- 圆球的上下闭合动画
- 小圆点动画
布局样式
布局
我们这里只需要一个圆球和小圆点组成就够了
<div class="demo">
<div class="pacman"></div>
<div class="dot"></div>
</div>
圆球样式
接下来搞点样式,这里我们用伪元素来写。注意这里给它加上绝对定位(absolute),因为要做上下闭合的动画,我们先给加上。
body .pacman:before {
content: '';
position: absolute;
background: #fb07ff;
width: 100px;
height: 50px;
/*保持居中位置*/
left: 50%;
top: 50%;
/*保持居中位置*/
margin-left: -50px;
margin-top: -50px;
/*上半圆效果*/
border-radius: 50px 50px 0 0;
}
然后就长这样啊
然后给after也加上
body .pacman:before,
body .pacman:after
{
content: '';
position: absolute;
background: #fb07ff;
width: 100px;
height: 50px;
/*保持居中位置*/
left: 50%;
top: 50%;
/*保持居中位置*/
margin-left: -50px;
margin-top: -50px;
/*上半圆效果*/
border-radius: 50px 50px 0 0;
}
圆点样式
这里喜欢啥颜色就搞啥颜色就完事了,也要加绝对定位哦
body .dot {
position: absolute;
left: 50%;
top: 50%;
width: 12px;
height: 12px;
margin-top: -5px;
margin-left: 30px;
border-radius: 50%;
background: #02ec2a;
}
圆球动画
在此之前先搞个上下会动的效果先,用到我们的 @keyframes 动画配合上transform: rotate() 来完成。
@keyframes是什么?
@keyframes
:以百分比来规定改变发生的时间,或者通过关键词 "from
" 和 "to
",等价于 0% 和 100%。0% 是动画的开始时间
,100% 动画的结束时间
。
注意
-
Internet Explorer 10、Firefox 以及 Opera 支持 @keyframes 规则和 animation 属性。
-
Chrome 和 Safari 需要前缀 -webkit-。
-
Internet Explorer 9,以及更早的版本,不支持 @keyframe 规则或 animation 属性。
上半球动画(up)
所以我们这里做一个适配
,然后rotate
的旋转角度搞到合适即可。是一个向下咬合
的效果。代码如下:
/* up */
@-webkit-keyframes up {
0%,
100% {
transform: rotate(0);
}
50% {
/*咬合张开的角度*/
transform: rotate(-30deg);
}
}
@-moz-keyframes up {
0%,
100% {
transform: rotate(0);
}
50% {
transform: rotate(-30deg);
}
}
@-o-keyframes up {
0%,
100% {
transform: rotate(0);
}
50% {
transform: rotate(-30deg);
}
}
@keyframes up {
0%,
100% {
transform: rotate(0);
}
50% {
transform: rotate(-30deg);
}
}
接下来给上半圆球
加上无限循环的动画
body .pacman:before{
content: '';
position: absolute;
background: #fb07ff;
width: 100px;
height: 50px;
/*保持居中位置*/
left: 50%;
top: 50%;
/*保持居中位置*/
margin-left: -50px;
margin-top: -50px;
/*上半圆效果*/
border-radius: 50px 50px 0 0;
/**** 添加动画 ****/
-webkit-animation: up 0.6s infinite;
/* 0.6s 动画的速度,越大越慢 infinite --- 无限循环 */
-moz-animation: up 0.6s infinite;
-o-animation: up 0.6s infinite;
animation: up 0.6s infinite;
}
再看看效果
下半球动画(down)
/* down */
@-webkit-keyframes down {
0%,
100% {
transform: rotate(0);
}
50% {
transform: rotate(30deg);
}
}
@-moz-keyframes down {
0%,
100% {
transform: rotate(0);
}
50% {
transform: rotate(30deg);
}
}
@-o-keyframes down {
0%,
100% {
transform: rotate(0);
}
50% {
transform: rotate(30deg);
}
}
@keyframes down {
0%,
100% {
transform: rotate(0);
}
50% {
transform: rotate(30deg);
}
}
body .pacman:after {
/*下半圆效果*/
border-radius: 0 0 50px 50px;
-webkit-animation: down 0.6s infinite;
-moz-animation: down 0.6s infinite;
-o-animation: down 0.6s infinite;
animation: down 0.6s infinite;
}
上下动画都写完了,我们来看看现在的效果先,激动人心的时候到了,上才艺
!
那我们只需给 :after 加上一个margin-top即可,这才是最终时刻
。
来人!给我上图!上代码!
body .pacman:after {
/*为了使两个半圆咬合时不出现缝隙*/
margin-top: -1px;
}
接下来搞点正经的,圆点动画,简直不要太简单!
圆点动画
这里是一个从左到右的动画,我们要改变的是margin-left
值,改变当前的位置。到了这你就应该明白之前我们为什么要设置绝对定位
了
/* r-to-l */
@-webkit-keyframes r-to-l {
100% {
margin-left: -1px;
}
}
@-moz-keyframes r-to-l {
100% {
margin-left: -1px;
}
}
@-o-keyframes r-to-l {
100% {
margin-left: -1px;
}
}
@keyframes r-to-l {
100% {
margin-left: -1px;
}
}
给小圆点加上,效果就出来了
body .dot {
-webkit-animation: r-to-l 0.6s infinite;
-moz-animation: r-to-l 0.6s infinite;
-o-animation: r-to-l 0.6s infinite;
animation: r-to-l 0.6s infinite;
}
我们可以明显的看到小圆点是从右到左的一个动作啊!
上才艺!咋们给它加上box-shadow就完事了啊,然后再加上z-index让小圆点在圆球的下方,这时候再来看看效果的话,就像是无限产生的小圆点。
body .dot {
/*层级关系 越大越在上层*/
z-index: -1;
/*实际上只有一个圆点,用了box-shadow的阴影属性。*/
box-shadow: 30px 0 0 #02ec2a, 60px 0 0 #02ec2a, 90px 0 0 #02ec2a, 120px 0 0 #02ec2a, 150px 0 0 #02ec2a;
}
不着急,咋先解释一波啊!
box-shadow
-
box-shadow: offset-x | offset-y | blur-radius | spread-radius | color ()
(1)
<offset-x>
<offset-y>
: 这是头两个<length>
值,用来设置阴影偏移量。<offset-x>
设置水平偏移量,如果是负值则阴影位于元素左边。<offset-y>
设置垂直偏移量,如果是负值则阴影位于元素上面。可用单位请查看<length>
。如果两者都是0,那么阴影位于元素后面。这时如果设置了<blur-radius>
或<spread-radius>
则有模糊效果。(2)
<blur-radius>
: 这是第三个<length>
值。值越大,模糊面积越大,阴影就越大越淡。 不能为负值。默认为0,此时阴影边缘锐利。(3)
<spread-radius>
: 这是第四个<length>
值。取正值时,阴影扩大;取负值时,阴影收缩。默认为0,此时阴影与元素同样大。(默认为 0 ,所以这里只设置了前3个值)(4)
<color>
: 相关事项查看<color>
。如果没有指定,则由浏览器决定——通常是color的值,不过目前Safari取透明。 -
这里用的
border-style
: type(类型)是outset
而不是inset(定义 3D outset 边框。其效果取决于 border-color 的值);
效果
到这里,我们的代码编写就全部完成啦!
完整代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>吃豆豆</title>
</head>
<style>
/* up */
@-webkit-keyframes up {
0%,
100% {
transform: rotate(0);
}
50% {
transform: rotate(-30deg);
}
}
/*咬合张开的角度*/
@-moz-keyframes up {
0%,
100% {
transform: rotate(0);
}
50% {
transform: rotate(-30deg);
}
}
@-o-keyframes up {
0%,
100% {
transform: rotate(0);
}
50% {
transform: rotate(-30deg);
}
}
@keyframes up {
0%,
100% {
transform: rotate(0);
}
50% {
transform: rotate(-30deg);
}
}
/* down */
@-webkit-keyframes down {
0%,
100% {
transform: rotate(0);
}
50% {
transform: rotate(30deg);
}
}
@-moz-keyframes down {
0%,
100% {
transform: rotate(0);
}
50% {
transform: rotate(30deg);
}
}
@-o-keyframes down {
0%,
100% {
transform: rotate(0);
}
50% {
transform: rotate(30deg);
}
}
@keyframes down {
0%,
100% {
transform: rotate(0);
}
50% {
transform: rotate(30deg);
}
}
/* r-to-l */
@-webkit-keyframes r-to-l {
100% {
margin-left: -1px;
}
}
@-moz-keyframes r-to-l {
100% {
margin-left: -1px;
}
}
@-o-keyframes r-to-l {
100% {
margin-left: -1px;
}
}
@keyframes r-to-l {
100% {
margin-left: -1px;
}
}
body {
background: #d44747;
overflow: hidden;
margin: 0;
}
body .pacman:before,
body .pacman:after {
content: '';
position: absolute;
background: #fb07ff;
width: 100px;
height: 50px;
/*保持居中位置*/
left: 50%;
top: 50%;
/*保持居中位置*/
margin-left: -50px;
margin-top: -50px;
/*上半圆效果*/
border-radius: 50px 50px 0 0;
/*动画*/
-webkit-animation: up 0.6s infinite;
/* 0.6s 动画的速度,越大越慢 infinite --- 无限循环 */
-moz-animation: up 0.6s infinite;
-o-animation: up 0.6s infinite;
animation: up 0.6s infinite;
}
body .pacman:after {
/*为了使两个半圆咬合时不出现缝隙*/
margin-top: -1px;
/*下半圆效果*/
border-radius: 0 0 50px 50px;
-webkit-animation: down 0.6s infinite;
-moz-animation: down 0.6s infinite;
-o-animation: down 0.6s infinite;
animation: down 0.6s infinite;
}
body .dot {
position: absolute;
left: 50%;
top: 50%;
width: 12px;
height: 12px;
margin-top: -5px;
margin-left: 30px;
border-radius: 50%;
background: #02ec2a;
/*层级关系 越大越在上层*/
z-index: -1;
/*实际上只有一个圆点,用了box-shadow的阴影属性。*/
box-shadow: 30px 0 0 #02ec2a, 60px 0 0 #02ec2a, 90px 0 0 #02ec2a, 120px 0 0 #02ec2a, 150px 0 0 #02ec2a;
/*
1、box-shadow: offset-x | offset-y | blur-radius | spread-radius | color ()
(1)<offset-x> <offset-y>: 这是头两个 <length>值,用来设置阴影偏移量。<offset-x> 设置水平偏移量,如果是负值则阴影位于元素左边。 <offset-y> 设置垂直偏移量,如果是负值则阴影位于元素上面。可用单位请查看 <length>。如果两者都是0,那么阴影位于元素后面。这时如果设置了 <blur-radius> 或 <spread-radius> 则有模糊效果。
(2)<blur-radius>: 这是第三个 <length> 值。值越大,模糊面积越大,阴影就越大越淡。 不能为负值。默认为0,此时阴影边缘锐利。
※(3)<spread-radius> : 这是第四个 <length> 值。取正值时,阴影扩大;取负值时,阴影收缩。默认为0,此时阴影与元素同样大。(默认为 0 ,所以这里只设置了前3个值)
(4)<color> : 相关事项查看 <color> 。如果没有指定,则由浏览器决定——通常是color的值,不过目前Safari取透明。
2、这里用的border-style:type(类型)是outset而不是inset(定义 3D outset 边框。其效果取决于 border-color 的值);
*/
-webkit-animation: r-to-l 0.6s infinite;
-moz-animation: r-to-l 0.6s infinite;
-o-animation: r-to-l 0.6s infinite;
animation: r-to-l 0.6s infinite;
}
</style>
<body>
<div class="demo">
<div class="pacman"></div>
<div class="dot"></div>
</div>
</body>
</html>
效果图
结尾
今天就先到这里啦!我们下期再见!码字不易,觉得不错的可以动动小指头点点赞哟~
常见问题FAQ
- 免费下载或者VIP会员专享资源能否直接商用?
- 本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
- 提示下载完但解压或打开不了?
- 找不到素材资源介绍文章里的示例图片?
- 模板不会安装或需要功能定制以及二次开发?
发表评论
还没有评论,快来抢沙发吧!