如何使用纯CSS完成一个可爱炫酷的动画效果

简介: 本文利用CCS相关代码,完成了小狗滑梯动画效果。并详细了讲解如何实现

本文利用CCS相关代码,完成了小狗滑梯动画效果。并详细了讲解如何实现

效果图

y38tx-72rcv.gif

第一部分

首先,先来解释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,使得小狗元素可以相对于其父元素进行定位。使用righttop属性来将小狗定位在容器的指定位置。然后,还定义了小狗元素的宽度和高度为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,使心形图案元素可以相对于其父元素进行定位。接着,使用topleft属性将心形图案元素定位在其父元素的正中心。然后还定义了心形图案元素的宽度和高度为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;
}

本文同步我的技术文档

相关文章
|
2月前
|
前端开发 内存技术
CSS动画示例(上一篇是CSS过渡…)
CSS动画示例(上一篇是CSS过渡…)
25 1
|
2月前
|
资源调度 前端开发 CDN
纯css动画库animate.css的用法
纯css动画库animate.css的用法
50 0
|
3月前
CSS3滑动轮播动画
CSS3滑动轮播动画
33 8
|
8天前
|
前端开发 UED
【专栏:CSS 进阶篇】CSS3 新特性:过渡、动画与变形
【4月更文挑战第30天】CSS3的过渡、动画和变形三大特性为网页设计注入活力,创造生动丰富的用户体验。过渡提供平滑效果,常用于按钮点击等;动画实现复杂动态效果,适用于滚动字幕等;变形允许元素几何变换,如旋转和缩放。实际应用包括动态导航菜单、图片轮播和加载动画。然而,需注意浏览器兼容性、性能优化和设计平衡。掌握这些特性,将为网页设计带来更多创新可能。
|
9天前
|
XML 前端开发 JavaScript
CSS中动画、过渡、定位、浮动的作用
CSS中动画、过渡、定位、浮动的作用
|
9天前
|
前端开发 UED 开发者
【专栏】CSS3 动画卡顿性能优化解决方案
【4月更文挑战第29天】本文探讨了CSS3动画卡顿的原因,包括复杂动画效果、过多元素参与、低效代码结构和硬件资源限制,并提出优化措施:简化动画路径、控制元素数量、优化代码结构、利用硬件加速及性能监测。通过实际案例展示了优化效果,强调了性能优化对提升用户体验的重要性。在开发中,应持续关注并优化动画性能,以适应网页应用的需求。
|
12天前
|
前端开发 JavaScript UED
绚丽多彩的网页世界:深入探讨CSS动画的艺术与技巧
绚丽多彩的网页世界:深入探讨CSS动画的艺术与技巧
20 3
|
15天前
|
前端开发 JavaScript 容器
JavaScript、CSS像素动画特效代码
此示例创建一个带有像素粒子的容器,每隔300毫秒就会动态添加一个新的像素粒子,然后通过CSS的关键帧动画(`@keyframes`)使它们产生上升和逐渐消失的动画效果。你可以根据需要修改像素粒子的颜色、大小、动画效果和创建速度。
14 0
|
19天前
|
前端开发 JavaScript UED
《CSS 简易速速上手小册》第5章:CSS 动画与过渡(2024 最新版)
《CSS 简易速速上手小册》第5章:CSS 动画与过渡(2024 最新版)
27 1
|
23天前
|
编解码 前端开发 iOS开发
前端开发入门笔记(八)CSS3属性详解:动画详解+Flex布局图文详解+Web字体
前端开发入门笔记(八)CSS3属性详解:动画详解+Flex布局图文详解+Web字体
61 1