本文利用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;
}
本文同步我的技术文档