本文利用CCS相关代码,完成了小狗滑梯动画效果。并详细了讲解如何实现
效果图
第一部分
首先,先来解释CSS的变量定义部分。
在这部分代码中,使用了:root
选择器来定义全局的CSS变量,它将用于控制小狗和滑梯的样式。
:root {
--dog-color: #f9c197;
--background-color: #e9f7f6;
--slide-color: #fdbf88;
}
在上面的代码中,定义了三个变量:--dog-color
表示小狗的颜色,--background-color
表示背景色,--slide-color
表示滑梯的颜色。这样,我们可以通过修改这些变量的值,来改变小狗和滑梯的外观颜色。
接下来,继续设置body
元素的样式定义。
body {
background-color: var(--background-color);
}
代码将页面的背景颜色设置为之前定义的变量--background-color
的值。这样,页面的整体背景色将与该变量的值保持一致。
然后找到.box-canvas
类的样式定义部分。这部分代码将负责定义一个容器,用于包裹小狗和滑梯的元素。
.box-canvas {
position: relative;
width: 600px;
height: 600px;
margin: 0 auto;
}
在上面的代码里,使用了类选择器.box-canvas
来选中这个容器元素。通过设置position
属性为relative
,使得这个容器内部的元素可以使用相对于该容器的位置进行定位。同时,设置了容器的宽度和高度为600像素,并使用margin: 0 auto;
将容器水平居中显示。
来看一下.dog
类的样式定义部分。这部分代码负责定义小狗元素的样式。
.dog {
position: absolute;
right: 50px;
top: 100px;
width: 120px;
height: 150px;
animation: dogSlide 5s infinite linear;
}
上面代码里,使用了类选择器.dog
来选择小狗元素。通过设置position
属性为absolute
,使得小狗元素可以相对于其父元素进行定位。使用right
和top
属性来将小狗定位在容器的指定位置。然后,还定义了小狗元素的宽度和高度为120像素
和150像素
。最后,应用了一个名为dogSlide
的动画效果,并设置其持续时间为5秒,循环播放并且采用线性的时间函数。
第二部分
来看一下关键帧动画dogSlide
的定义部分。这个动画控制小狗元素在不同关键帧位置之间的变化。
@keyframes dogSlide {
0% {
transform: translate(0, 0) rotate(0);
}
50% {
transform: translate(200px, 0) rotate(30deg);
}
100% {
transform: translate(400px, 0) rotate(0);
}
}
在上代码里,使用了@keyframes
关键字来定义了一个名为dogSlide
的关键帧动画。该动画包含三个关键帧:0%、50%和100%。在每个关键帧中使用transform
属性来定义小狗元素的位移和旋转效果。
在动画的开始(0%关键帧)时,小狗元素的偏移量为(0, 0),不进行旋转。在动画进行到一半(50%关键帧)时,小狗元素的偏移量变为(200px, 0),并向顺时针方向旋转30度。最后,在动画结束时(100%关键帧),小狗元素的偏移量恢复到(400px, 0),并且不再旋转。
再看看.heart
类的样式定义部分。该部分代码负责定义心形图案元素的样式。
.heart {
position: absolute;
top: 50%;
left: 50%;
width: 30px;
height: 30px;
background-color: red;
transform: translate(-50%, -50%);
animation: heartAppear 1s infinite ease-in-out;
}
在上面代码里,使用.heart
选择器来选中心形图案元素。通过设置position
属性为absolute
,使心形图案元素可以相对于其父元素进行定位。接着,使用top
和left
属性将心形图案元素定位在其父元素的正中心。然后还定义了心形图案元素的宽度和高度为30像素,并设置背景色为红色。
通过使用transform
属性和translate
函数,将心形图案元素在其父元素内部进行居中定位。应用了一个名为heartAppear
的动画效果,该动画持续时间为1秒,采用缓入缓出的时间函数,并且无限循环播放。
第三部分
.slide类的样式定义部分,该部分代码负责定义滑梯元素的样式。
.slide {
position: absolute;
bottom: 0;
left: 50%;
transform: translateX(-50%);
width: 240px;
height: 300px;
background-color: var(--slide-color);
}
上面代码我们使用.slide
选择器来选中滑梯元素。通过设置position
属性为absolute
,使得滑梯元素可以相对于其父元素进行定位。然后使用bottom
属性将滑梯元素定位在其父元素的底部。通过left: 50%
和transform: translateX(-50%)
来将滑梯元素在水平方向上居中定位。
同时定义了滑梯元素的宽度和高度分别为240像素和300像素。使用变量--slide-color
指定了滑梯的背景颜色,这样可以通过修改变量的值来改变滑梯的外观。
继续看看.slide::before
伪元素的样式定义部分。该部分代码用于创建滑梯的左侧把手。
.slide::before {
content: '';
position: absolute;
top: 50%;
left: -20px;
transform: translateY(-50%);
width: 20px;
height: 60px;
background-color: var(--slide-color);
}
上面代码里使用.slide::before
选择器来选中滑梯的伪元素。通过设置content
属性为空字符串,创建了一个空的伪元素。使用position
属性将伪元素相对于滑梯元素进行定位。
通过top: 50%
和left: -20px
将伪元素定位在滑梯元素的左侧并垂直居中。然后,使用transform: translateY(-50%)
将伪元素在垂直方向上进行偏移,使其保持垂直居中。
最后定义了伪元素的宽度和高度分别为20像素和60像素,并且使用变量--slide-color
指定了把手的背景颜色。
全部代码
下面就是整合了我们此次教程的全部代码:
HTML
<body>
<div class="box-canvas">
<div class="dog">
<div class="heart"></div>
<div class="body"></div>
<div class="nose"></div>
<div class="ear"></div>
<div class="eye"></div>
<div class="tail"></div>
</div>
<div class="slide">
<div class="slide-end"></div>
<div class="slide-main"></div>
<div class="slide-start"></div>
</div>
</div>
</body>
CSS
:root {
--dog-color: white;
--dog-accent-color: #333642;
--background-color: #25A9FC;
--slide-color: #FEDF01;
--ladder-color: #0185B5;
--heart-color: #E81C23;
}
body{
background: var(--background-color);
}
.box-canvas{
position: relative;
margin: auto;
display: block;
margin-top: 8%;
margin-bottom: 8%;
width: 600px;
height:600px;
}
/* Convenience wrapper for easy positioning */
.dog {
position: absolute;
right: 170px;
top: 70px;
width: 58px;
height: 75px;
animation: dogSlide 2s infinite ease-in-out;
}
@keyframes dogSlide {
10% {
transform: translateX(-25px);
}
70% {
transform: rotate(-20deg) translate(-185px, 50px);
}
90% {
transform: translate(-205px, 125px);
}
100% {
transform: translate(-205px, 125px);
}
}
.heart {
opacity: 0;
position: absolute;
background: var(--heart-color);
width: 15px;
height: 15px;
border-radius: 50%;
top: -50px;
left: 60%;
transform: translateX(-60%);
animation: heartAppear 2s infinite ease-in-out;
}
.heart::before {
content: '';
position: absolute;
left: 10px;
background: var(--heart-color);
width: 15px;
height: 15px;
border-radius: 50%;
}
.heart::after {
content: '';
position: absolute;
top: 10px;
left: 0;
background: var(--heart-color);
width: 25px;
height: 10px;
clip-path: polygon(50% 100%, 0 0, 100% 0);
}
@keyframes heartAppear {
0% {
opacity: 0;
}
50% {
opacity: 0;
}
70% {
opacity: 1;
}
90% {
opacity: 1;
}
100% {
opacity: 0;
}
}
.body {
position: absolute;
left: 13px;
width: 44px;
height: 75px;
border-radius: 25% 10% 20% 20%;
background: var(--dog-color);
}
.body::before{
content: '';
position: absolute;
top: 5px;
left: -3px;
background: var(--dog-color);
border-radius: 20%;
width: 20px;
height: 30px;
transform: rotate(45deg);
}
/* Snout section */
.body::after {
content: '';
position: absolute;
background: var(--dog-color);
width: 25px;
height: 15px;
top: 20px;
left: -12px;
border-radius: 20% 20% 50% 20%;
border-bottom: 2px solid var(--dog-accent-color);
animation: dogSmile 2s infinite ease-in-out;
}
@keyframes dogSmile {
0% {
border-radius: 20% 20% 20% 20%;
border-bottom: none;
}
70% {
border-radius: 20% 20% 50% 20%;
border-bottom: 2px solid var(--dog-accent-color);
}
}
.nose {
position: absolute;
background-color: var(--dog-accent-color);
width: 8px;
height: 5px;
border-radius: 30%;
top: 20px;
}
.ear {
position: absolute;
left: 35px;
width: 20px;
height: 30px;
background: var(--dog-accent-color);
border-radius: 0 0 30% 30%;
}
.eye {
position: absolute;
left: 22px;
top: 10px;
background: var(--dog-accent-color);
width: 5px;
height: 5px;
border-radius: 50%;
}
.tail {
position: absolute;
bottom: 0;
right: -8px;
width: 10px;
height: 55px;
background: var(--dog-color);
transform: rotate(25deg);
}
.tail::before {
content: '';
position: absolute;
top: -15px;
width: 15px;
height: 25px;
background: var(--dog-color);
clip-path: polygon(12% 0, 0% 100%, 100% 100%);
}
.tail::after {
content: '';
position: absolute;
top: 5px;
left: 5px;
width: 12px;
height: 25px;
background: var(--dog-color);
clip-path: polygon(12% 0, 0% 100%, 100% 100%);
}
/* Convenience wrapper for positioning */
.slide {
position: absolute;
width: 270px;
height: 200px;
left: 50%;
transform: translateX(-50%);
top: 100px;
}
.slide-main {
position: absolute;
bottom: 64px;
left: 53px;
width: 200px;
height: 50px;
background: var(--slide-color);
transform: rotate(-45deg);
}
.slide-end {
position: absolute;
height: 50px;
width: 100px;
background: var(--slide-color);
bottom: 0;
border-radius: 50% 0 0 0;
}
.slide-start {
position: absolute;
height: 50px;
top: 23px;
width: 63px;
background: var(--slide-color);
right: 0px;
}
/* Ladder */
.slide-start::after {
content: '';
position: absolute;
height: 177px;
width: 10px;
background: var(--ladder-color);
right: 0;
}