第11章 CSS动画与微交互

四道竞赛真题带你通关CSS动画 | 课型:实习课 | 建议课时:4节

🏠 返回总目录 / 第11章

🎯 学习目标

知识目标

  • 掌握transition过渡的属性、时长、缓动
  • 掌握@keyframes与animation八属性
  • 掌握transform的位移/旋转/缩放
  • 掌握stroke-dasharray描边动画与clip-path

能力目标

  • 能为按钮卡片添加自然微交互
  • 能独立完成竞赛任务2/3/4/8四个动画真题
  • 能读懂并调优缓动曲线

德育目标

  • 通过竞赛真题培养标准意识与时间管理
  • 理解"动画服务体验"而非炫技的克制设计观

教学重点

  • transition四要素
  • @keyframes定义与animation应用
  • 四道真题的评分点

教学难点

  • animation复合属性的书写顺序
  • stroke-dasharray描边原理
  • cubic-bezier缓动曲线

💻 实例演示3个实例 · 可在线运行

▶ 竞赛任务3:黄色正方形变红圆圈

3秒内正方形缩小变形成红色圆圈再复原,cubic-bezier缓动。

新窗口运行 下载源码

操作步骤

  1. 打开demo1.html,观察完整动画循环
  2. 用开发者工具动画面板(Animations)录制并慢放
  3. 修改cubic-bezier参数,对比线性linear的生硬感
  4. 把50%改为33%/66%两个关键帧,观察节奏变化
  5. 对照评分点:居中/3秒/缓动/循环逐条自查

效果观察点

  • 0%与100%合并书写保证无缝循环
  • border-radius:50%使方变圆
  • scale(.2)实现缩小
查看核心代码
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>Task 3 - 正方形变圆</title>
<style>
  * { margin: 0; padding: 0; }
  body { height: 100vh; display: flex; justify-content: center; align-items: center;
         background: #29303b; }
  #block { width: 400px; height: 400px; border: 2px solid white; background-color: yellow;
           animation: animate 3s cubic-bezier(.25, .5, .25, 1) infinite; }
  @keyframes animate {
    0%, 100% { border: 2px solid white; transform: scale(1); border-radius: 0%; background-color: yellow; }
    50% { transform: scale(.2); border: 8px solid red; border-radius: 50%; background-color: transparent; }
  }
</style>
</head>
<body><div id="block"></div></body>
</html>

▶ 竞赛任务2:Hello World描边动画

SVG文字先描边后填充的经典开场动画。

新窗口运行 下载源码

操作步骤

  1. 打开demo2.html,观察"先描边再填充"两阶段
  2. 注释掉fill动画,观察只有轮廓的效果
  3. 修改1.7s延迟,理解两动画的时序衔接
  4. 把stroke-dasharray改为400观察虚线化
  5. 对照评分点:SVG/黑色背景/白色容器/动画时序

效果观察点

  • dasharray与offset相等时描边完全隐藏
  • 动画将dasharray推到2400产生"描绘"感
  • 第二个动画用延迟1.7s等待描边完成
查看核心代码
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>Task 2 - Hello World描边</title>
<style>
  * { margin: 0; padding: 0; }
  body { height: 100vh; background: #000; display: flex; justify-content: center; align-items: center; }
  div { width: 800px; height: 400px; background: #fff; }
  svg { width: 100%; height: 100%; }
  text { font-size: 100px; stroke: #000; stroke-dasharray: 1600; stroke-dashoffset: 1600;
         fill: transparent;
         animation: draw 2s ease-in-out forwards, fill 0.3s 1.7s forwards; }
  @keyframes draw { to { stroke-dasharray: 2400; } }
  @keyframes fill { to { fill: #000; } }
</style>
</head>
<body>
  <div>
    <svg xmlns="http://www.w3.org/2000/svg"><text x="100" y="250">Hello World</text></svg>
  </div>
</body>
</html>

▶ 竞赛任务8:加载动画

三个圆点依次跳动的loading效果——animation-delay队列。

新窗口运行 下载源码

操作步骤

  1. 打开demo3.html,观察三圆点的波浪式跳动
  2. 删除animation-delay观察三点同跳(失去波浪感)
  3. 调整delay数值创造不同节奏
  4. 尝试把translateY改为scale缩放版loading

效果观察点

  • nth-child分别设置delay形成队列
  • 60%回落让跳动有"停顿"更自然
查看核心代码
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>Task 8 - Loading</title>
<style>
  body { height: 100vh; display: flex; justify-content: center; align-items: center;
         background: #123a52; margin: 0; }
  .dot { width: 24px; height: 24px; margin: 0 8px; border-radius: 50%; background: #38d6c4;
         animation: bounce 1.2s ease-in-out infinite; }
  .dot:nth-child(2) { animation-delay: .2s; }
  .dot:nth-child(3) { animation-delay: .4s; }
  @keyframes bounce {
    0%, 60%, 100% { transform: translateY(0); }
    30% { transform: translateY(-30px); }
  }
</style>
</head>
<body>
  <div class="dot"></div><div class="dot"></div><div class="dot"></div>
</body>
</html>

📋 实习任务书

任务目标:独立完成竞赛任务2/3/4/8四道动画真题

任务内容与评分
任务1:为个人站按钮卡片添加transition微交互(15分)
任务2:完成任务3方形变圆并通过评分点自查(25分)
任务3:完成任务2描边动画(25分)
任务4:完成任务8加载动画(20分)
任务5:任务4灰度图:hover时彩色、离开灰色(15分)

自我评价

📚 课后作业与预习