CSS动画通过@keyframes定义关键帧和animation属性控制播放,实现元素从一个状态到另一个状态的平滑过渡或复杂连续效果。它不仅美化界面,还能提升用户体验、引导注意力。相比transition用于简单两态交互(如hover),animation更适合多阶段、循环或自主运动的复杂动画。为保证性能,应优先使用transform和opacity等硬件加速属性,避免频繁重排重绘,合理利用will-change并简化动画逻辑。常见应用包括淡入淡出、滑动、旋转、脉冲及文本打字机效果,均可用纯CSS实现,赋予网页丰富动态表现力。

CSS动画,说白了,就是给网页元素注入生命力的一种方式。它让我们能把那些原本静态的UI组件,变得生动起来,从一个状态平滑地过渡到另一个状态,甚至能实现复杂的、连续的视觉效果。在我看来,它不仅仅是美化,更是提升用户体验、引导用户注意力的强大工具。掌握了它,你的网页就不仅仅是信息展示的容器,而是一个充满互动的舞台。
要实现CSS动画,我们主要依赖两个核心概念:
@keyframes
animation
首先,
@keyframes
@keyframes myAnimation {
0% {
opacity: 0;
transform: translateY(20px);
}
50% {
opacity: 0.5;
transform: translateY(10px);
}
100% {
opacity: 1;
transform: translateY(0);
}
}这段代码定义了一个名为
myAnimation
from
to
立即学习“前端免费学习笔记(深入)”;
接着,我们需要将这个“剧本”应用到具体的HTML元素上,这就是
animation
animation
.my-element {
animation-name: myAnimation; /* 动画的名称,对应@keyframes的名称 */
animation-duration: 2s; /* 动画持续时间 */
animation-timing-function: ease-in-out; /* 动画速度曲线 */
animation-delay: 0.5s; /* 动画开始前的延迟时间 */
animation-iteration-count: infinite; /* 动画播放次数,可以是数字或infinite */
animation-direction: alternate; /* 动画播放方向,normal, reverse, alternate等 */
animation-fill-mode: forwards; /* 动画结束后元素保持的状态 */
animation-play-state: running; /* 动画的播放状态,running或paused */
}通常,我们会使用
animation
.my-element {
animation: myAnimation 2s ease-in-out 0.5s infinite alternate forwards running;
}理解这些属性的含义非常重要:
animation-name
@keyframes
animation-duration
animation-timing-function
ease
linear
ease-in
ease-out
cubic-bezier()
animation-delay
animation-iteration-count
infinite
animation-direction
alternate
animation-fill-mode
forwards
backwards
both
animation-play-state
通过组合这些属性,我们就能创造出几乎任何你想象得到的动态效果。
这是一个非常经典的问题,也是我在实际开发中经常思考的。简单来说,CSS Transition(过渡)更像是“单程票”,而CSS Animation(动画)则更像是一张“往返票”甚至“多程票”。
CSS Transition 过渡用于在两个状态之间平滑地改变属性值。它通常由某个事件触发,比如鼠标悬停(
:hover
:active
举个例子,一个按钮在鼠标悬停时背景色发生变化,用
transition
.button {
background-color: blue;
transition: background-color 0.3s ease;
}
.button:hover {
background-color: darkblue;
}CSS Animation 动画则提供了更精细的控制,它允许你定义多个关键帧,从而在动画过程中实现复杂的、多阶段的样式变化。
@keyframes
什么时候选择哪种方式?
我个人在实践中,如果只是简单的鼠标悬停变色或尺寸变化,我会毫不犹豫地用
transition
@keyframes
animation
动画性能是用户体验的关键,没有什么比一个卡顿的动画更让人沮丧了。我见过太多因为动画优化不当而导致页面体验直线下降的例子。要避免这种情况,主要有几个核心策略:
优先使用硬件加速属性:transform
opacity
transform
translate
scale
rotate
skew
opacity
避免动画的属性: 尽量不要直接动画
width
height
top
left
margin
padding
transform: translate()
top
left
transform: scale()
使用will-change
will-change
.animated-element {
will-change: transform, opacity; /* 告诉浏览器这个元素的transform和opacity可能会变化 */
}注意:
will-change
减少动画元素的数量和复杂性 动画的元素越多,或者每个动画越复杂(比如动画的属性越多,或者
@keyframes
避免在动画中使用昂贵的CSS属性 一些CSS属性本身计算成本就很高,比如
box-shadow
filter
border-radius
合理设置animation-timing-function
ease
ease-in-out
cubic-bezier
在移动设备上测试 桌面浏览器性能通常较好,但在移动设备上,CPU和GPU资源有限,动画性能问题更容易暴露。务必在真实的移动设备上测试你的动画,确保它们在低性能设备上也能流畅运行。
我在开发中,一旦发现动画有卡顿,第一反应就是检查是不是动画了
width
height
will-change
left
transform: translateX()
CSS动画的潜力是巨大的,从最基础的交互反馈到复杂的页面过渡,它都能胜任。下面我列举一些常见的视觉效果,并提供代码示例。这些示例都是基于前面提到的
@keyframes
animation
淡入/淡出效果 (Fade In/Out) 这是最常见也最实用的效果之一,常用于元素出现或消失时,提供柔和的过渡。
/* 淡入效果 */
.fade-in-element {
opacity: 0; /* 初始状态隐藏 */
animation: fadeIn 1s ease-out forwards; /* 动画名称、持续时间、速度曲线、结束状态 */
}
@keyframes fadeIn {
from {
opacity: 0;
}
to {
opacity: 1;
}
}
/* 淡出效果(通常通过JS添加类名触发) */
.fade-out-element {
animation: fadeOut 1s ease-out forwards;
}
@keyframes fadeOut {
from {
opacity: 1;
}
to {
opacity: 0;
}
}这个效果在图片加载完成、模态框出现或者提示信息显示时非常有用。
滑动进入/离开效果 (Slide In/Out) 让元素从屏幕外滑入,或者从屏幕内滑出,常用于侧边导航、通知条等。
/* 从左侧滑入效果 */
.slide-in-left {
transform: translateX(-100%); /* 初始状态在屏幕左侧外 */
animation: slideInLeft 0.8s ease-out forwards;
}
@keyframes slideInLeft {
from {
transform: translateX(-100%);
}
to {
transform: translateX(0);
}
}
/* 从底部滑入并略微弹跳 */
.slide-up-bounce {
transform: translateY(100px);
opacity: 0;
animation: slideUpBounce 1s cubic-bezier(0.68, -0.55, 0.265, 1.55) forwards;
}
@keyframes slideUpBounce {
0% {
transform: translateY(100px);
opacity: 0;
}
60% {
transform: translateY(-10px);
opacity: 1;
}
100% {
transform: translateY(0);
opacity: 1;
}
}cubic-bezier
ease-in-out
旋转/缩放效果 (Rotate/Scale) 常用于加载图标、图片放大缩小、按钮点击反馈等。
/* 持续旋转的加载图标 */
.spinner {
animation: spin 1.5s linear infinite; /* 匀速无限旋转 */
}
@keyframes spin {
from {
transform: rotate(0deg);
}
to {
transform: rotate(360deg);
}
}
/* 鼠标悬停放大效果 */
.zoom-on-hover {
transition: transform 0.3s ease; /* 使用transition更简洁 */
}
.zoom-on-hover:hover {
transform: scale(1.1); /* 放大10% */
}这里的放大效果我用
transition
脉冲/呼吸效果 (Pulse) 让元素周期性地放大缩小或改变透明度,常用于吸引用户注意力的提示。
.pulse-effect {
animation: pulse 2s infinite alternate; /* 无限交替播放 */
}
@keyframes pulse {
from {
transform: scale(1);
opacity: 1;
}
to {
transform: scale(1.05);
opacity: 0.7;
}
}文本打字机效果 模拟文本一个字一个字地出现。这个稍微复杂一点,通常需要结合
steps()
overflow: hidden
<p class="typewriter">Hello, World!</p>
.typewriter {
width: 0; /* 初始宽度为0,隐藏文本 */
overflow: hidden;
white-space: nowrap; /* 防止文本换行 */
border-right: 0.15em solid orange; /* 模拟光标 */
animation:
typing 3.5s steps(20, end) forwards, /* 20个字符,每个字符一步 */
blink-caret 0.75s step-end infinite; /* 光标闪烁 */
font-family: monospace;
font-size: 2em;
}
@keyframes typing {
from {
width: 0;
}
to {
width: 100%; /* 最终宽度为文本宽度 */
}
}
@keyframes blink-caret {
from, to {
border-color: transparent;
}
50% {
border-color: orange;
}
}这个例子展示了CSS动画的强大之处,即使是这种看似复杂的文本效果,也能纯CSS实现。
这些只是冰山一角。CSS动画的魅力在于,通过对
@keyframes
animation
以上就是css动画基础使用方法详解的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号