news 2026/6/17 14:29:10

第29篇:CSS动画

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
第29篇:CSS动画

第29篇:CSS动画

学习目标

  • 掌握@keyframes关键帧的定义方式
  • 理解animation所有子属性的含义和用法
  • 能够编写常见的 UI 动画:加载、提示、微交互
  • 了解 CSS 动画与 JavaScript 动画的选择场景

核心知识点

1. @keyframes — 定义关键帧

关键帧动画由一系列"时间点"的样式状态组成,浏览器自动补间过渡。

/* 基本语法 */@keyframesfadeIn{from{opacity:0;}/* 0% */to{opacity:1;}/* 100% */}/* 多关键帧 */@keyframesbounce{0%{transform:translateY(0);}40%{transform:translateY(-30px);}60%{transform:translateY(-15px);}100%{transform:translateY(0);}}

关键帧百分比

  • 0%from— 动画开始
  • 100%to— 动画结束
  • 中间任意百分比 — 自定义时间点

2. animation 属性大全

属性含义常用值
animation-name引用 @keyframesfadeInbounce
animation-duration动画时长0.5s2s
animation-timing-function速度曲线easelinearease-in-out
animation-delay延迟开始1s-0.5s(负值表示已进行一半)
animation-iteration-count播放次数13infinite
animation-direction播放方向normalreversealternate
animation-fill-mode动画前后状态noneforwardsbackwardsboth
animation-play-state播放/暂停runningpaused
简写语法
.element{animation:bounce 1s ease-in-out 0.5s infinite alternate;/* name duration timing-function delay iteration-count direction */}
animation-fill-mode 详解
/* 动画结束后保持最后一帧 */.box{animation:slideIn 0.5s forwards;}/* 动画开始前应用第一帧(解决延迟期间的空白) */.box{animation:fadeIn 1s 2s backwards;}/* 同时应用 forwards 和 backwards */.box{animation:slideIn 0.5s both;}
开始前结束后
none默认样式默认样式
forwards默认样式最后一帧
backwards第一帧默认样式
both第一帧最后一帧
animation-direction
animation-direction:normal;/* 正向播放 */animation-direction:reverse;/* 反向播放 */animation-direction:alternate;/* 正→反→正→反... */animation-direction:alternate-reverse;/* 反→正→反→正... */

3. 实战:常见动画模式

淡入
@keyframesfadeIn{from{opacity:0;transform:translateY(20px);}to{opacity:1;transform:translateY(0);}}.card{animation:fadeIn 0.5s ease-out;}
脉冲(心跳效果)
@keyframespulse{0%, 100%{transform:scale(1);}50%{transform:scale(1.1);}}.heart{animation:pulse 1s ease-in-out infinite;}
旋转加载
@keyframesspin{from{transform:rotate(0deg);}to{transform:rotate(360deg);}}.spinner{width:40px;height:40px;border:3px solid #e5e7eb;border-top-color:#4a90d9;border-radius:50%;animation:spin 0.8s linear infinite;}
抖动(错误提示)
@keyframesshake{0%, 100%{transform:translateX(0);}20%{transform:translateX(-10px);}40%{transform:translateX(10px);}60%{transform:translateX(-5px);}80%{transform:translateX(5px);}}.input-error{animation:shake 0.4s ease-in-out;}
呼吸灯
@keyframesbreathe{0%, 100%{opacity:0.4;transform:scale(0.9);}50%{opacity:1;transform:scale(1.1);}}.dot{animation:breathe 2s ease-in-out infinite;}

4. 多动画组合

一个元素可以同时应用多个动画:

.element{animation:fadeIn 0.5s ease-out,slideUp 0.5s ease-out 0.2s both;}

5. 用 JS 控制动画

// 暂停/播放constel=document.querySelector('.spinner');el.style.animationPlayState='paused';el.style.animationPlayState='running';// 动态添加动画类document.querySelector('.btn').addEventListener('click',()=>{el.classList.add('animate-spin');// 动画结束后移除类el.addEventListener('animationend',()=>{el.classList.remove('animate-spin');},{once:true});});

6. 动画性能优化

优先使用这些属性(触发 GPU 合成,不引起重排):

  • transform(位移、旋转、缩放)
  • opacity

避免动画化这些属性(触发重排,性能差):

  • widthheighttopleftmarginpadding
  • border-width

will-change 提示

.animated-element{will-change:transform,opacity;}

不要滥用will-change,动画结束后应移除,否则占用 GPU 内存。

减少动画(prefers-reduced-motion)

@media(prefers-reduced-motion:reduce){*, *::before, *::after{animation-duration:0.01ms!important;animation-iteration-count:1!important;transition-duration:0.01ms!important;}}

7. transition vs animation 对比

特性transitionanimation
触发方式需要状态变化(如 hover)自动播放,可循环
复杂度两个状态之间的过渡多关键帧,任意状态数
循环不能可以 infinite
方向A → BA → B → C → D
适用悬停、切换等交互反馈加载、装饰性动画

动手练习

练习1:打字机效果

实现文字逐个显示的打字机动画。提示:用steps()时间函数配合宽度动画。

@keyframestyping{from{width:0;}to{width:100%;}}.typing{overflow:hidden;white-space:nowrap;animation:typing 3ssteps(20)forwards;}

练习2:交错淡入

一组卡片依次淡入,每张延迟 0.1s。提示:用:nth-child(n)设置不同animation-delay

练习3:环形加载器

用纯 CSS 创建一个三个圆点依次放大缩小的加载动画。


常见误区 ⚠️

误区正确做法
动画化 width/height/top/left用 transform 和 opacity,性能高 10 倍
忘记 forwards 导致动画跳回初始状态需要保持结束状态时加animation-fill-mode: forwards
无限循环动画滥用 will-change仅在必要时使用,结束后移除
忽略 prefers-reduced-motion必须做无障碍降级
animation-delay 用正数实现交错用负数更高效:-0.1s表示从 10% 开始

速查卡片 📋

/* 定义 */@keyframesname{0%{...}50%{...}100%{...}}/* 应用 */animation:name 1s ease 0s 1 normal forwards;animation:name duration timing-function delay iteration-count direction fill-mode;/* 常用组合 */animation:fadeIn 0.5s ease-out forwards;animation:spin 0.8s linear infinite;animation:pulse 1.5s ease-in-out infinite alternate;animation:bounce 0.5s ease-in-out 3;/* 性能 */will-change:transform,opacity;/* 提示浏览器优化 *//* 无障碍 */@media(prefers-reduced-motion:reduce){*{animation:none!important;transition:none!important;}}

扩展阅读

  • MDN: CSS 动画
  • MDN: @keyframes
  • Animate.css(常用动画库)
  • CSS Tricks: Animation
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/17 14:12:51

ZigBee ZCL集群开发实战:颜色控制、镇流器与温控器实现详解

1. ZigBee ZCL集群开发:从协议栈到产品落地的实战拆解如果你正在开发基于ZigBee 3.0的智能设备,无论是智能灯泡、调光镇流器还是恒温器,那么与ZigBee Cluster Library(ZCL)打交道是绕不开的一步。我接触过不少开发者&a…

作者头像 李华
网站建设 2026/6/17 14:10:36

计算机Java毕设实战-基于 SpringBoot 的计算思维科普与人工智能学习系统设计 人工智能教育视角下线上学习平台的设计与实现【完整源码+LW+部署说明+演示视频,全bao一条龙等】

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

作者头像 李华
网站建设 2026/6/17 14:09:49

0617晨间日记

# 0617晨间日记 - 关键词 - 上午- 开发- 需求: juki能不能进行程式的对比- 难题:e48的格式无法进行解析,原因是他不是x01的xml文件,而是机器码- 既然不好解决- 可以不解决,将剩余的泛用机的零件列出来- 泛用机的用的零…

作者头像 李华
网站建设 2026/6/17 14:06:50

互联网大厂Java面试:Java EE与Spring Boot的技术问答

面试官与水货程序员燕双非的技术问答:Java EE、Spring Boot与微服务在互联网大厂的面试中,技术问题层出不穷。今天我们将跟随面试官与搞笑的候选人燕双非的对话,探讨Java EE、Spring Boot、微服务等技术点。第一轮提问 面试官:燕双…

作者头像 李华
网站建设 2026/6/17 14:05:09

3步实现无语言障碍浏览:鼠标悬停翻译工具完整指南

3步实现无语言障碍浏览:鼠标悬停翻译工具完整指南 【免费下载链接】MouseTooltipTranslator Mouseover Translate Any Language At Once - Chrome Extension: PDF Translator, EBOOK, EPUB, OCR, TTS, NETFLIX, YOUTUBE DUAL SUBTITLES, GOOGLE DOCS, AI, VIEWER, G…

作者头像 李华
网站建设 2026/6/17 14:02:23

Bootstrap Icons完整指南:免费获取2000+专业SVG图标的终极方案

Bootstrap Icons完整指南:免费获取2000专业SVG图标的终极方案 【免费下载链接】icons Official open source SVG icon library for Bootstrap. 项目地址: https://gitcode.com/gh_mirrors/ic/icons Bootstrap Icons是一个完全免费开源的SVG图标库&#xff0c…

作者头像 李华