CSS动画与过渡详解与实战

张开发
2026/4/15 14:26:33 15 分钟阅读

分享文章

CSS动画与过渡详解与实战
CSS动画与过渡详解与实战什么是CSS动画与过渡CSS动画与过渡是CSS3中引入的特性它们允许我们创建流畅、美观的视觉效果而无需使用JavaScript。CSS过渡Transitions用于平滑地改变元素的属性值而CSS动画Animations则用于创建更复杂的动画序列。CSS过渡Transitions1. 基本语法.element { transition: property duration timing-function delay; }property要过渡的CSS属性如width、height、color等duration过渡持续时间如1s、500ms等timing-function过渡函数如ease、linear、ease-in、ease-out、ease-in-out等delay过渡延迟时间如0s、500ms等2. 示例.box { width: 100px; height: 100px; background-color: blue; transition: width 1s ease, height 1s ease, background-color 1s ease; } .box:hover { width: 200px; height: 200px; background-color: red; }3. 过渡函数函数名描述linear线性过渡ease缓入缓出过渡默认ease-in缓入过渡ease-out缓出过渡ease-in-out缓入缓出过渡cubic-bezier(n,n,n,n)自定义贝塞尔曲线4. 过渡多个属性/* 过渡所有可过渡属性 */ .element { transition: all 1s ease; } /* 过渡特定属性 */ .element { transition: width 1s ease, height 1s ease; } /* 为不同属性设置不同的过渡效果 */ .element { transition: width 1s ease 0s, height 1s ease 0.5s, background-color 1s ease 1s; }CSS动画Animations1. 基本语法/* 定义动画 */ keyframes animation-name { from { /* 初始状态 */ } to { /* 结束状态 */ } } /* 或者使用百分比 */ keyframes animation-name { 0% { /* 初始状态 */ } 50% { /* 中间状态 */ } 100% { /* 结束状态 */ } } /* 应用动画 */ .element { animation: name duration timing-function delay iteration-count direction fill-mode play-state; }name动画名称duration动画持续时间timing-function动画函数delay动画延迟时间iteration-count动画重复次数如1、infinite等direction动画方向如normal、reverse、alternate、alternate-reverse等fill-mode动画填充模式如none、forwards、backwards、both等play-state动画播放状态如running、paused等2. 示例/* 定义动画 */ keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } } /* 应用动画 */ .element { animation: fadeIn 1s ease-in-out 0s 1 normal forwards running; }3. 复杂动画示例/* 定义动画 */ keyframes bounce { 0%, 20%, 50%, 80%, 100% { transform: translateY(0); } 40% { transform: translateY(-30px); } 60% { transform: translateY(-15px); } } /* 应用动画 */ .element { animation: bounce 2s ease-in-out 0s infinite normal forwards running; }过渡与动画的区别特性过渡Transitions动画Animations触发方式需要事件触发如hover、click等自动触发或通过JavaScript触发状态只有开始和结束两个状态可以定义多个中间状态控制不能暂停、恢复或控制进度可以暂停、恢复、控制进度复杂度简单适合基本的属性变化复杂适合复杂的动画序列实战应用1. 按钮悬停效果.button { padding: 10px 20px; background-color: #3498db; color: white; border: none; border-radius: 4px; cursor: pointer; font-size: 16px; transition: all 0.3s ease; } .button:hover { background-color: #2980b9; transform: translateY(-2px); box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); } .button:active { transform: translateY(0); box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); }2. 卡片悬停效果.card { width: 300px; height: 200px; background-color: white; border-radius: 8px; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); padding: 20px; transition: all 0.3s ease; } .card:hover { transform: translateY(-5px); box-shadow: 0 10px 20px rgba(0, 0, 0, 0.1); }3. 加载动画.loader { width: 50px; height: 50px; border: 4px solid #f3f3f3; border-top: 4px solid #3498db; border-radius: 50%; animation: spin 1s linear infinite; } keyframes spin { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } }4. 淡入淡出动画.fade-in { animation: fadeIn 1s ease-in-out; } keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } } .fade-out { animation: fadeOut 1s ease-in-out; } keyframes fadeOut { from { opacity: 1; } to { opacity: 0; } }5. 滑动动画.slide-in { animation: slideIn 0.5s ease-in-out; } keyframes slideIn { from { transform: translateX(-100%); } to { transform: translateX(0); } } .slide-out { animation: slideOut 0.5s ease-in-out; } keyframes slideOut { from { transform: translateX(0); } to { transform: translateX(100%); } }6. 脉冲动画.pulse { animation: pulse 2s ease-in-out infinite; } keyframes pulse { 0% { transform: scale(1); } 50% { transform: scale(1.1); } 100% { transform: scale(1); } }7. 摇摆动画.swing { animation: swing 2s ease-in-out infinite; transform-origin: top center; } keyframes swing { 0% { transform: rotate(0deg); } 25% { transform: rotate(10deg); } 50% { transform: rotate(0deg); } 75% { transform: rotate(-10deg); } 100% { transform: rotate(0deg); } }8. 翻转动画.flip { perspective: 1000px; } .flip-inner { position: relative; width: 100%; height: 200px; text-align: center; transition: transform 0.6s; transform-style: preserve-3d; } .flip:hover .flip-inner { transform: rotateY(180deg); } .flip-front, .flip-back { position: absolute; width: 100%; height: 100%; backface-visibility: hidden; border-radius: 8px; display: flex; align-items: center; justify-content: center; } .flip-front { background-color: #3498db; color: white; } .flip-back { background-color: #2ecc71; color: white; transform: rotateY(180deg); }9. 弹跳动画.bounce { animation: bounce 1s ease-in-out; } keyframes bounce { 0%, 20%, 50%, 80%, 100% { transform: translateY(0); } 40% { transform: translateY(-30px); } 60% { transform: translateY(-15px); } }10. 旋转动画.rotate { animation: rotate 2s linear infinite; } keyframes rotate { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } }性能优化使用transform和opacity这两个属性的动画不会触发重排reflow性能最好避免使用position: fixed固定定位的元素动画可能会影响性能使用will-change告诉浏览器元素将要发生变化提前做好准备减少动画复杂度避免过于复杂的动画减少动画的元素数量使用硬件加速通过transform: translateZ(0)或transform: translate3d(0, 0, 0)触发硬件加速/* 使用will-change */ .element { will-change: transform; transition: transform 0.3s ease; } /* 触发硬件加速 */ .element { transform: translateZ(0); /* 或 */ transform: translate3d(0, 0, 0); }浏览器兼容性过渡TransitionsChrome 26Firefox 16Safari 6.1Edge 12动画AnimationsChrome 43Firefox 16Safari 9Edge 12供应商前缀对于旧浏览器需要使用供应商前缀/* 过渡 */ .element { -webkit-transition: all 0.3s ease; -moz-transition: all 0.3s ease; -o-transition: all 0.3s ease; transition: all 0.3s ease; } /* 动画 */ -webkit-keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } } -moz-keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } } -o-keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } } keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } } .element { -webkit-animation: fadeIn 1s ease-in-out; -moz-animation: fadeIn 1s ease-in-out; -o-animation: fadeIn 1s ease-in-out; animation: fadeIn 1s ease-in-out; }最佳实践保持动画简洁避免过于复杂的动画保持动画简洁明了使用合适的动画时长动画时长应该适中不宜过长或过短考虑用户体验动画应该增强用户体验而不是干扰用户测试不同设备在不同设备上测试动画确保流畅运行使用CSS变量使用CSS变量定义动画参数方便维护结合JavaScript对于复杂的动画控制可以结合JavaScript使用常见问题与解决方案1. 动画不流畅原因动画过于复杂或设备性能不足解决方案优化动画使用transform和opacity触发硬件加速2. 动画在某些浏览器中不工作原因浏览器兼容性问题解决方案使用供应商前缀测试不同浏览器3. 动画触发多次原因事件触发频率过高解决方案使用debounce或throttle函数控制事件触发频率4. 动画结束后元素回到初始状态原因动画填充模式设置不正确解决方案设置animation-fill-mode: forwards总结CSS动画与过渡是创建流畅、美观用户界面的强大工具。通过掌握过渡和动画的基本语法和属性我们可以创建出各种复杂的视觉效果包括按钮悬停效果、卡片动画、加载动画等。在使用CSS动画与过渡时我们应该注意性能优化确保动画在各种设备上都能流畅运行。同时我们应该根据场景选择合适的动画类型和参数以增强用户体验。希望本文对你理解和应用CSS动画与过渡有所帮助

更多文章