CSS 动效基础
7.1 CSS 动效基础CSS 动效是前端交互反馈与视觉体验的核心实现方式基于浏览器合成线程原生渲染具备 GPU 加速能力性能远优于 JavaScript 动画。CSS 动效体系分为过渡动画与关键帧动画两大核心类型配合原生动画事件实现动画生命周期的回调控制能够覆盖状态反馈、入场出场、循环装饰等绝大多数动效场景是构建流畅交互体验的基础。7.1.1 transition 过渡动画一、核心原理过渡动画是状态驱动的补间动画针对元素的两个状态默认态与 hover 态、类名切换态等在状态变化时自动计算中间帧实现属性的平滑过渡。它是最简单的 CSS 动效形式适合交互触发的状态变化反馈。二、核心属性transition是简写属性包含四个子属性按顺序为属性名、时长、缓动函数、延迟时间。属性说明取值示例transition-property指定应用过渡的 CSS 属性all表示所有可过渡属性all、opacity、transformtransition-duration过渡持续时间单位秒(s)或毫秒(ms)0.3s、300mstransition-timing-function过渡缓动曲线控制动画的速度变化ease、linear、ease-in-out、cubic-bezier(0.4, 0, 0.2, 1)transition-delay过渡延迟触发时间单位秒或毫秒0s、100ms三、缓动函数详解缓动函数决定动画的运动感是动效自然度的核心linear匀速线性运动适合匀速旋转、位移动画ease默认值慢-快-慢自然的运动感通用场景ease-in慢入快出加速运动适合元素出场、下落动画ease-out快入慢出减速运动适合元素入场、停止动画ease-in-out慢入慢出两端平缓适合悬停切换、来回过渡cubic-bezier(x1,y1,x2,y2)自定义贝塞尔曲线精准控制运动曲线四、基础示例/* 按钮悬停过渡所有属性 0.3 秒缓动过渡 */ .btn { background: #1677ff; transform: scale(1); transition: all 0.3s ease; } .btn:hover { background: #4096ff; transform: scale(1.05); }五、特点与边界优势实现简单声明式配置性能优异状态切换时自动反向过渡局限仅支持两个状态之间的过渡无法控制中间帧无法主动播放必须依赖状态触发部分属性不可过渡如display、float最佳实践优先使用transform和opacity实现动效触发 GPU 合成避免重排重绘性能最优避免使用all指定具体属性减少性能开销7.1.2 animation 关键帧动画一、核心原理关键帧动画通过keyframes规则定义动画过程中的多个关键帧状态浏览器自动补全中间帧支持多阶段、循环、反向等复杂动画效果无需状态触发即可独立播放是复杂 CSS 动效的标准实现方式。二、核心属性animation是简写属性包含 8 个子属性完整控制动画的全生命周期。属性说明取值示例animation-name绑定的 keyframes 关键帧名称fadeInanimation-duration单次动画持续时间1sanimation-timing-function单帧间的缓动函数ease-outanimation-delay动画延迟播放时间0.2sanimation-iteration-count动画播放次数1、infinite无限循环animation-direction动画播放方向normal正向、reverse反向、alternate交替往返animation-fill-mode动画填充模式控制动画前后的状态none、forwards停在结束帧、backwards提前应用起始帧、bothanimation-play-state动画播放状态running运行、paused暂停三、keyframes 定义方式支持两种关键帧定义方式from / to两帧动画等价于 0% 和 100%百分比多帧动画定义任意百分比位置的状态/* 淡入上移动画 */ keyframes fadeInUp { 0% { opacity: 0; transform: translateY(20px); } 100% { opacity: 1; transform: translateY(0); } } /* 呼吸动画无限循环交替 */ keyframes breathe { 0% { transform: scale(1); } 50% { transform: scale(1.05); } 100% { transform: scale(1); } } /* 应用动画 */ .fade-in { animation: fadeInUp 0.5s ease-out forwards; } .breathe { animation: breathe 2s ease-in-out infinite alternate; }四、与 transition 的核心对比对比维度transition 过渡animation 关键帧状态数量仅两个状态起始-结束支持任意多个关键帧状态触发方式依赖状态变化触发无法主动播放可自动播放也可通过类名控制循环能力不支持循环仅往返过渡支持任意次数循环、无限循环中间控制无法控制中间过程可精准控制每一帧的状态事件回调单次过渡对应一次事件支持帧迭代、结束等多种事件适用场景交互状态反馈、悬停切换复杂动画、入场出场、循环装饰、加载动效五、fill-mode 重点说明animation-fill-mode是最容易被忽略的核心属性决定动画播放前后元素的状态none默认值动画开始前和结束后都保持元素原有样式forwards动画结束后保持最后一帧的状态是入场动画最常用的配置backwards动画延迟期间提前应用第一帧的状态避免动画开始前的跳变both同时应用 forwards 和 backwards 的效果7.1.3 动画事件transitionend、animationendCSS 动画原生提供生命周期事件用于监听动画的开始、结束、迭代等节点实现动画与业务逻辑的联动是链式动画、状态切换、入场出场流程控制的核心。一、transitionend 事件触发时机过渡动画完成时触发每个过渡属性会独立触发一次。如果同时过渡多个属性会触发多次事件。核心属性event.propertyName完成过渡的属性名用于区分不同属性的过渡event.elapsedTime过渡持续的时间单位秒基础示例const box document.querySelector(.box); box.addEventListener(transitionend, (e) { // 只处理 opacity 过渡完成的逻辑 if (e.propertyName opacity) { console.log(透明度过渡完成); // 过渡结束后移除元素 if (box.style.opacity 0) { box.remove(); } } });注意事项过渡中途被中断如状态再次变化、元素隐藏不会触发 transitionend 事件。过渡时长为 0 时不会触发事件。多个属性过渡会触发多次需通过 propertyName 过滤目标事件。二、animation 相关事件关键帧动画提供三个生命周期事件覆盖完整动画流程事件名触发时机核心说明animationstart动画开始播放时触发延迟时间结束、动画正式启动时触发animationiteration动画每完成一次迭代时触发循环动画每次循环结束触发仅 iteration-count 1 时有效animationend动画全部播放完成时触发所有迭代完成后触发无限循环不会触发基础示例入场动画结束后执行业务逻辑const modal document.querySelector(.modal); modal.addEventListener(animationend, () { console.log(弹窗入场动画完成); // 动画结束后聚焦输入框 modal.querySelector(input).focus(); });三、典型应用场景离场动画结束后移除 DOM 元素避免元素残留链式动画前一个动画结束后触发下一个动画实现序列动效动画完成回调入场动画结束后初始化业务逻辑、聚焦交互状态同步动画结束后更新业务状态避免动画未完成就执行操作

相关新闻

T3 Stack全栈开发实战:从零搭建类型安全的Next.js应用

T3 Stack全栈开发实战:从零搭建类型安全的Next.js应用

开篇先解释一下:t3code 是我最近从头到尾搭完的一个基于 T3 Stack 的全栈应用代码库,名字里的 T3 指的不是某个框架版本,而是这几年在前端圈子里很流行的一套技术组合——Next.js、TypeScript、tRPC、Prisma、Tailwind CSS 再加 NextAuth。很…

2026/10/13 10:18:48 阅读更多 →
Conda换源配置全攻略:解决下载慢与连接失败问题

Conda换源配置全攻略:解决下载慢与连接失败问题

1. 为什么conda换源这件事值得单独拿出来说如果你用Anaconda或者Miniconda管理过Python环境,大概率经历过这样的场景:敲下conda install numpy,终端里光标转了半天,进度条纹丝不动,最后甩给你一个CondaHTTPError: HTTP…

2026/10/13 10:17:47 阅读更多 →
t3code 编码规范实战:从零搭建可执行的代码一致性方案

t3code 编码规范实战:从零搭建可执行的代码一致性方案

1. 从“t3code”这个标题说起:它到底是什么,能解决什么问题第一次看到“t3code”这个词,很多人会一头雾水。它不像“Vue”“Docker”那样一眼能看出技术栈,也不像“记账本”“待办清单”那样直白。我最初接触这个标题时&#xff0…

2026/10/13 10:17:47 阅读更多 →

最新新闻

MySQL慢查询定位与索引设计:EXPLAIN与B+树实战全解析

MySQL慢查询定位与索引设计:EXPLAIN与B+树实战全解析

接手线上业务系统这几年,最让我头疼的问题之一就是MySQL慢查询。明明功能开发完了、测试也过了,一到流量高峰期,几个核心接口突然就卡了几秒,数据库CPU飙高,紧接着就是连接数打满、应用报错。排查下来,十有…

2026/10/13 11:00:03 阅读更多 →
ASIO2WASAPI:让普通声卡也能跑低延迟ASIO的桥接实践

ASIO2WASAPI:让普通声卡也能跑低延迟ASIO的桥接实践

简介:ASIO2WASAPI 是面向 Windows Vista 及以上系统的开源音频驱动方案,为音乐制作人与音频工程师提供硬件无关的 ASIO 支持。它借助中间层将 ASIO 协议和 Windows 原生 WASAPI 结合,用独占模式逼近硬件极限延迟,解决无专用音频接…

2026/10/13 11:00:03 阅读更多 →
JumpServer统一纳管PostgreSQL:从资产配置到安全审计的完整实践

JumpServer统一纳管PostgreSQL:从资产配置到安全审计的完整实践

搞了这么多年运维,数据库资产一直是权限管理里最让人头疼的一环。尤其PostgreSQL这种逻辑库多、角色权限细的系统,直接让人连生产库,账号密码满天飞不说,出事了你连谁干的都查不到。前阵子刚把一套PostgreSQL完整接进了JumpServer…

2026/10/13 11:00:03 阅读更多 →
MySQL Workbench 从下载到实战:安装避坑、连接配置与日常管理技巧

MySQL Workbench 从下载到实战:安装避坑、连接配置与日常管理技巧

最早学数据库那会儿,我一直在黑窗口里敲命令。建表、导数据、改权限全靠手打,一条语句写错就得整条回滚,效率低不说,眼睛也是真遭罪。后来换了 MySQL Workbench,整个体验完全不一样:不用背那么多命令&#…

2026/10/13 11:00:03 阅读更多 →
快速搭建规范开源项目:从零构建可协作可维护的GitHub仓库

快速搭建规范开源项目:从零构建可协作可维护的GitHub仓库

1. 为什么“快速搭建规范开源项目”这件事,比你想象中更值得花时间 “快速在GitHub搭建一个规范的开源项目(一)”——这个标题里藏着三个被新手普遍低估的关键词: 快速 、 规范 、 (一) 。不是“建个…

2026/10/13 11:00:03 阅读更多 →
用帕累托图做线上问题优先级排序:从频次统计到加权决策

用帕累托图做线上问题优先级排序:从频次统计到加权决策

作为负责线上稳定性的工程师,我每天到工位后的第一件事,不是看代码,而是先扫一眼昨夜的问题清单。以前团队排故障优先级基本靠嗓门,谁在群里吼得凶就修谁的;直到我们用帕累托图把问题频次和影响摊开做排序,…

2026/10/13 10:58:59 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →