news 2026/4/1 12:57:29

前端萌新别慌:30分钟搞懂CSS @keyframes动画(附实战代码)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
前端萌新别慌:30分钟搞懂CSS @keyframes动画(附实战代码)


前端萌新别慌:30分钟搞懂CSS @keyframes动画(附实战代码)

  • 前端萌新别慌:30分钟搞懂CSS @keyframes动画(附实战代码)
    • 从零开始认识@keyframes
    • 动手写第一个@keyframes动画
    • 常见翻车现场和急救包
    • 进阶骚操作合集
    • 那些年踩过的坑,我都替你试过了

前端萌新别慌:30分钟搞懂CSS @keyframes动画(附实战代码)

刚入门前端那会儿,看到别人页面上小球蹦跶、按钮呼吸、进度条丝滑滚动,心里直呼“这咋做到的?”——其实多半是@keyframes在背后偷偷发力。今天咱不整虚的,就用最接地气的方式,把CSS里这个“动画导演”掰开了揉碎了讲明白。

HTML负责搭骨架,CSS负责穿衣服,而@keyframes就是那个教衣服自己跳舞的老师。别被名字吓住,它真没那么高冷。

从零开始认识@keyframes

你以为动画得靠JS?其实纯CSS就能搞定一大半。我第一次写动画的时候,还在那儿吭哧吭哧写setInterval,结果被同事吐槽:“兄弟,这年头谁还用JS写简单动画啊,CSS不香吗?”

@keyframes到底是个啥玩意儿?说白了就是定义“动作剧本”。你就想象自己在导演一部微电影,告诉演员(元素)在什么时间点该摆出什么姿势。

/* 最基础的@keyframes语法 */@keyframesslideIn{0%{transform:translateX(-100%);opacity:0;}50%{transform:translateX(-20%);opacity:0.5;}100%{transform:translateX(0);opacity:1;}}/* 使用这个动画 */.animated-box{animation:slideIn 1s ease-out;}

看到没?0%、50%、100%就是时间轴,transform和opacity就是动作指令。animation属性全家桶:duration、timing-function、iteration-count…每个都得摸透。

动手写第一个@keyframes动画

一个会左右晃的div,5行代码搞定。我第一次写出来的时候,盯着那个晃来晃去的小方块傻笑了半天,感觉自己像个魔法师。

<!DOCTYPEhtml><html><head><style>/* 定义摇晃动画 */@keyframesshake{0%, 100%{transform:translateX(0);}10%, 30%, 50%, 70%, 90%{transform:translateX(-10px);}20%, 40%, 60%, 80%{transform:translateX(10px);}}.shake-box{width:100px;height:100px;background:linear-gradient(45deg,#ff6b6b,#4ecdc4);margin:50px auto;border-radius:10px;/* 关键来了:绑定动画 */animation:shake 0.5s ease-in-out infinite;}</style></head><body><divclass="shake-box"></div></body></html>

关键帧怎么设?0%、50%、100%不是随便写的。我刚开始瞎写,结果动画看起来像个抽搐的机器人。后来才明白,关键帧的百分比就是时间进度条,0%是动画开始,100%是动画结束,中间的百分比就是过渡点。

常见翻车现场和急救包

动画死活不动?先检查有没有绑定animation-name。我就干过这种蠢事,@keyframes写得漂漂亮亮,结果忘了在元素上调用,页面静得跟坟场似的。

/* 错误示范:定义了动画但没用 */@keyframesfadeIn{from{opacity:0;}to{opacity:1;}}.my-element{/* 忘了写animation属性! */background:red;}/* 正确做法 */.my-element{animation:fadeIn 1s ease-in-out;}

为啥我的动画卡成PPT?可能是没开硬件加速。移动端特别明显,加个transform: translateZ(0)就能让GPU老哥帮你干活。

.smooth-animation{animation:slideIn 1s ease-out;/* 开启硬件加速 */transform:translateZ(0);/* 或者这样 */will-change:transform;}

循环次数设错了?infinite和数字别混着用。我就曾经写了个animation-iteration-count: infinite 3; 结果浏览器直接罢工,把我整不会了。

/* 正确写法 */.infinite-bounce{animation:bounce 1s ease-in-out infinite;}/* 指定次数 */.three-times{animation:bounce 1s ease-in-out 3;}

移动端动画掉帧?transform + opacity才是亲儿子。别整那些width、height、padding的动画,浏览器重排重绘累得要死,用户体验也拉胯。

/* 别这么写,性能杀手 */.bad-animation{animation:resize 1s ease;}@keyframesresize{0%{width:100px;height:100px;}100%{width:200px;height:200px;}}/* 用transform代替 */.good-animation{animation:scale 1s ease;}@keyframesscale{0%{transform:scale(1);}100%{transform:scale(2);}}

进阶骚操作合集

用@keyframes做加载动画,老板看了直呼专业。上次我用纯CSS写了个loading动画,产品经理还以为我请了特效团队。

<!DOCTYPEhtml><html><head><style>/* 专业loading动画 */.loader{display:inline-block;width:80px;height:80px;}.loader:after{content:" ";display:block;width:64px;height:64px;margin:8px;border-radius:50%;border:6px solid #fff;border-color:#ff6b6b transparent #4ecdc4 transparent;animation:loader-spin 1.2s linear infinite;}@keyframesloader-spin{0%{transform:rotate(0deg);}100%{transform:rotate(360deg);}}/* 三个点跳跃加载 */.dot-loader{display:inline-block;}.dot-loader span{display:inline-block;width:15px;height:15px;border-radius:50%;background:#ff6b6b;margin:0 5px;animation:dot-jump 1.4s infinite ease-in-out both;}.dot-loader span:nth-child(1){animation-delay:-0.32s;}.dot-loader span:nth-child(2){animation-delay:-0.16s;}@keyframesdot-jump{0%, 80%, 100%{transform:scale(0);opacity:0.5;}40%{transform:scale(1);opacity:1;}}</style></head><body><divclass="loader"></div><divclass="dot-loader"><span></span><span></span><span></span></div></body></html>

配合hover实现悬停微交互,用户体验直接拉满。按钮呼吸效果、卡片浮起、图标旋转,这些小细节能让用户感觉你的页面活了。

/* 呼吸按钮 */.breath-button{padding:12px 24px;background:linear-gradient(45deg,#667eea,#764ba2);color:white;border:none;border-radius:25px;cursor:pointer;transition:all 0.3s ease;animation:breathe 2s ease-in-out infinite;}@keyframesbreathe{0%, 100%{transform:scale(1);}50%{transform:scale(1.05);}}.breath-button:hover{animation-play-state:paused;transform:scale(1.1);}/* 卡片悬停效果 */.card{width:300px;padding:20px;background:white;border-radius:10px;box-shadow:0 2px 10pxrgba(0,0,0,0.1);transition:all 0.3s ease;}.card:hover{animation:card-float 0.5s ease forwards;}@keyframescard-float{0%{transform:translateY(0);}100%{transform:translateY(-10px);}}

多个动画叠加?没问题,但小心性能崩盘。我就曾经给同一个元素加了五个动画,结果用户的手机直接变成暖手宝。

/* 多个动画叠加 */.complex-animation{animation:rotate 2s linear infinite,scale 1s ease-in-out infinite alternate,color-change 3s linear infinite;}@keyframesrotate{from{transform:rotate(0deg);}to{transform:rotate(360deg);}}@keyframesscale{from{transform:scale(1)rotate(0deg);}to{transform:scale(1.2)rotate(360deg);}}@keyframescolor-change{0%{background:#ff6b6b;}33%{background:#4ecdc4;}66%{background:#45b7d1;}100%{background:#ff6b6b;}}

结合CSS变量动态控制动画参数,前端也能玩“遥控器”。这招配合JS,能让动画活起来。

/* CSS变量控制动画 */.dynamic-animation{--duration:1s;--delay:0s;--iterations:infinite;animation:var(--animation-name)var(--duration)var(--delay)var(--iterations);}/* JS动态修改 *//* const element = document.querySelector('.dynamic-animation'); element.style.setProperty('--duration', '2s'); element.style.setProperty('--animation-name', 'slideIn'); */

那些年踩过的坑,我都替你试过了

别在@keyframes里乱改width/height,重排警告!我就曾经写了个展开动画,结果页面卡成PPT,被性能监控工具骂得狗血淋头。

/* 千万别这样 */@keyframesexpand{0%{width:100px;height:100px;}100%{width:300px;height:300px;}}/* 用transform代替 */@keyframessmart-expand{0%{transform:scale(1);}100%{transform:scale(3);}}

慎用box-shadow做动画,GPU看了都想跑路。box-shadow的动画计算量巨大,特别是blur半径变化的时候,风扇呼呼转。

/* 性能杀手 */@keyframesshadow-dance{0%{box-shadow:0 0 10pxrgba(0,0,0,0.5);}50%{box-shadow:0 0 50pxrgba(0,0,0,0.8);}100%{box-shadow:0 0 10pxrgba(0,0,0,0.5);}}/* 用其他方式模拟 */@keyframesglow{0%{filter:brightness(1);}50%{filter:brightness(1.2)drop-shadow(0 0 20pxrgba(255,255,255,0.8));}100%{filter:brightness(1);}}

动画结束后元素回弹?记得加animation-fill-mode。我就曾经纳闷,动画结束后元素怎么又跳回原来的位置,原来忘了设置fill-mode。

/* 动画结束会回弹 */.bounce-back{animation:slideIn 1s ease-out;}/* 保持动画结束状态 */.stay-there{animation:slideIn 1s ease-out forwards;}/* 或者从动画第一帧开始 */.start-from-beginning{animation:slideIn 1s ease-out backwards;}/* 两者都要 */.both-modes{animation:slideIn 1s ease-out both;}

别忘了兼容性!老IE用户可能看不到你的炫技。虽然IE已经日薄西山,但有时候还得照顾一下老客户。

/* 加前缀保平安 */@keyframesmyAnimation{0%{transform:translateX(0);}100%{transform:translateX(100px);}}@-webkit-keyframesmyAnimation{0%{-webkit-transform:translateX(0);}100%{-webkit-transform:translateX(100px);}}@-moz-keyframesmyAnimation{0%{-moz-transform:translateX(0);}100%{-moz-transform:translateX(100px);}}.animated{animation:myAnimation 1s ease-out;-webkit-animation:myAnimation 1s ease-out;-moz-animation:myAnimation 1s ease-out;}

最后唠一句:动画不是越多越好,恰到好处才叫高级。别整得花里胡哨结果用户想关都关不掉,那可就社死了。我就见过一个网站,进去先给你来个360度旋转欢迎动画,鼠标移动还有涟漪效果,点击按钮爆炸特效,看得我头晕眼花,直接Alt+F4走人。

记住,最好的动画是用户感觉不到的动画,它们默默地让界面更流畅、更自然、更有生命力。就像电影里的配乐,恰到好处时观众完全意识不到它的存在,但一旦缺失,整个体验就大打折扣。

所以,下次写动画的时候,先问问自己:这个动画真的有必要吗?它能让用户体验更好吗?如果答案是肯定的,那就大胆去写吧,@keyframes这个老朋友会帮你把想法变成现实的。

欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。

推荐:DTcode7的博客首页。
一个做过前端开发的产品经理,经历过睿智产品的折磨导致脱发之后,励志要翻身农奴把歌唱,一边打入敌人内部一边持续提升自己,为我们广大开发同胞谋福祉,坚决抵制睿智产品折磨我们码农兄弟!


专栏系列(点击解锁)学习路线(点击解锁)知识定位
《微信小程序相关博客》持续更新中~结合微信官方原生框架、uniapp等小程序框架,记录请求、封装、tabbar、UI组件的学习记录和使用技巧等
《AIGC相关博客》持续更新中~AIGC、AI生产力工具的介绍,例如stable diffusion这种的AI绘画工具安装、使用、技巧等总结
《HTML网站开发相关》《前端基础入门三大核心之html相关博客》前端基础入门三大核心之html板块的内容,入坑前端或者辅助学习的必看知识
《前端基础入门三大核心之JS相关博客》前端JS是JavaScript语言在网页开发中的应用,负责实现交互效果和动态内容。它与HTML和CSS并称前端三剑客,共同构建用户界面。
通过操作DOM元素、响应事件、发起网络请求等,JS使页面能够响应用户行为,实现数据动态展示和页面流畅跳转,是现代Web开发的核心
《前端基础入门三大核心之CSS相关博客》介绍前端开发中遇到的CSS疑问和各种奇妙的CSS语法,同时收集精美的CSS效果代码,用来丰富你的web网页
《canvas绘图相关博客》Canvas是HTML5中用于绘制图形的元素,通过JavaScript及其提供的绘图API,开发者可以在网页上绘制出各种复杂的图形、动画和图像效果。Canvas提供了高度的灵活性和控制力,使得前端绘图技术更加丰富和多样化
《Vue实战相关博客》持续更新中~详细总结了常用UI库elementUI的使用技巧以及Vue的学习之旅
《python相关博客》持续更新中~Python,简洁易学的编程语言,强大到足以应对各种应用场景,是编程新手的理想选择,也是专业人士的得力工具
《sql数据库相关博客》持续更新中~SQL数据库:高效管理数据的利器,学会SQL,轻松驾驭结构化数据,解锁数据分析与挖掘的无限可能
《算法系列相关博客》持续更新中~算法与数据结构学习总结,通过JS来编写处理复杂有趣的算法问题,提升你的技术思维
《IT信息技术相关博客》持续更新中~作为信息化人员所需要掌握的底层技术,涉及软件开发、网络建设、系统维护等领域的知识
《信息化人员基础技能知识相关博客》无论你是开发、产品、实施、经理,只要是从事信息化相关行业的人员,都应该掌握这些信息化的基础知识,可以不精通但是一定要了解,避免日常工作中贻笑大方
《信息化技能面试宝典相关博客》涉及信息化相关工作基础知识和面试技巧,提升自我能力与面试通过率,扩展知识面
《前端开发习惯与小技巧相关博客》持续更新中~罗列常用的开发工具使用技巧,如 Vscode快捷键操作、Git、CMD、游览器控制台等
《photoshop相关博客》持续更新中~基础的PS学习记录,含括PPI与DPI、物理像素dp、逻辑像素dip、矢量图和位图以及帧动画等的学习总结
日常开发&办公&生产【实用工具】分享相关博客》持续更新中~分享介绍各种开发中、工作中、个人生产以及学习上的工具,丰富阅历,给大家提供处理事情的更多角度,学习了解更多的便利工具,如Fiddler抓包、办公快捷键、虚拟机VMware等工具

吾辈才疏学浅,摹写之作,恐有瑕疵。望诸君海涵赐教。望轻喷,嘤嘤嘤

非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。愿斯文对汝有所裨益,纵其简陋未及渊博,亦足以略尽绵薄之力。倘若尚存阙漏,敬请不吝斧正,俾便精进!

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

珲春口碑不错的烤肉

珲春口碑不错的烤肉——延炭乳酸菌烤肉在珲春&#xff0c;烤肉是当地美食文化中不可或缺的一部分。众多烤肉店中&#xff0c;延炭乳酸菌烤肉凭借独特的风味和健康理念&#xff0c;赢得了良好的口碑。主打健康&#xff0c;腌制独特延炭乳酸菌烤肉主打健康概念&#xff0c;其核心…

作者头像 李华
网站建设 2026/3/26 14:03:28

从夯到拉,锐评大模型岗位|小白程序员必收藏学习指南

&#x1f947; 第一梯队&#xff1a;夯——筑牢模型底层根基 这一梯队是大模型技术的“压舱石”&#xff0c;直接决定模型的底层性能上限与核心能力&#xff0c;技术壁垒极高&#xff0c;堪称大模型领域的“硬核主战场”&#xff0c;适合追求极致技术深度的开发者。&#x1f5…

作者头像 李华
网站建设 2026/3/31 9:40:16

Java毕设选题推荐:基于springboot的运动用品商城系统基于Spring Boot的体育购物商城系统【附源码、mysql、文档、调试+代码讲解+全bao等】

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

作者头像 李华