第八章:动态 CSS:@规则与动画
第八章:动态 CSS:@规则与动画
Prorise第八章:动态 CSS:@规则与动画
摘要: 在本章中,我们将为静态的页面注入生命力,全面开启 CSS 动态效果的大门。我们将首先学习 CSS 中强大的“宏观指令”——@规则
,理解它们如何从更高维度控制样式表的行为,特别是为动画服务的 @keyframes
。随后,我们将系统性地学习从 transform
(变形)、transition
(过渡) 到 animation
(动画) 的完整动态效果体系,最终让您有能力创造出流畅、优雅且富有表现力的网页动画。
在本章的学习地图中,我们将:
- 首先,学习
@规则
,这是 CSS 中用于执行宏观指令或条件化操作的基础。 - 接着,掌握
transform
(变形),学习如何对元素进行移动、旋转、缩放等几何操作。 - 然后,我们将学习
transition
(过渡),让元素在不同状态间的变化过程变得如丝般顺滑。 - 最后,我们将把所有知识融会贯通,精通
animation
(动画),编排复杂的多步动画序列。
8.1. CSS @规则:代码的宏观指令
@规则
(At-rules) 是一种特殊的 CSS 语句,以 @
符号开头,用于下达一些比单个样式声明更宏观的指令,例如导入外部文件、定义动画关键帧、或根据条件应用样式等,注意,此小节仅作了解,使用次数并不多
8.1.1. 常规 @规则
这类规则通常是独立的指令,以分号 ;
结尾。
@charset
: 定义 CSS 文件本身使用的字符编码。1
2/* 必须是样式文件的第一行,且不能有任何前置字符 */
@charset "UTF-8";@import
: 在一个 CSS 文件中导入另一个 CSS 文件的内容。1
2/* 导入一个名为 theme.css 的样式表 */
@import url("theme.css");深入探讨2025-08-26我@import
和<link>
标签都能引入 CSS,它们有什么区别吗?PProrise问得好!这是个非常重要的性能问题。
<link>
是 HTML 标签,它会在页面加载时并行下载 CSS 文件,不阻塞浏览器渲染。而@import
是 CSS 规则,它会等到包含它的 CSS 文件被下载并解析后,才串行地去下载被导入的文件。PProrise这会导致页面渲染被延迟,出现“白屏”时间更长的问题。因此,在原生前端中,我们强烈推荐始终使用
<link>
标签来引入所有 CSS 文件,而在脚手架环境下,也就是后续我们要学习的 Vue / React 是为了方便管理样式文件,且现代构建工具会处理好它的加载问题,所以对于这个规则,反而我们需要了解@namespace
: 用于在混合 XML 的文档(如内联 SVG)中定义命名空间,以避免选择器冲突。这是一个较少见的用法,了解即可。
8.1.2. 嵌套 @规则
这类规则包含一个规则块 {}
,可以在其中嵌套其他的 CSS 样式。
@media
: 媒体查询,我们在第六章响应式设计中已经深入学习过。它根据设备特性(如视口宽度)来条件性地应用样式。@supports
: 功能查询,用于检查浏览器是否支持某个特定的 CSS 属性或值,从而实现优雅降级。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15<style>
.container {
/* 默认使用 flex 布局作为备选方案 */
display: flex;
justify-content: center;
}
/* 如果浏览器支持 grid 布局,则使用更优的 grid 方案 */
@supports (display: grid) {
.container {
display: grid;
grid-template-columns: repeat(3, 1fr);
}
}
</style>@font-face
: 允许我们引入并使用自定义的字体文件。1
2
3
4
5
6
7
8
9@font-face {
font-family: "MyCustomFont"; /* 为字体命名 */
src: url("/fonts/my-font.woff2") format("woff2"); /* 指定字体文件路径 */
font-weight: 400;
font-style: normal;
}
body {
font-family: "MyCustomFont", sans-serif; /* 在页面中使用自定义字体 */
}@keyframes
: (本章重点) 用于定义一个动画的完整序列。我们将在8.4
节详细讲解。
8.2. CSS 变形 (transform
):元素的几何魔法
transform
属性允许我们在不影响元素在文档流中所占空间的情况下,对其进行移动、旋转、缩放和倾斜等视觉变换。
8.2.1. 2D 变形函数
函数 | 核心描述 | 示例 |
---|---|---|
translate() | 平移。沿 X 轴和 Y 轴移动元素。 | transform: translate(50px, 20px); |
scale() | 缩放。放大或缩小元素。 | transform: scale(1.2); (放大 20%) |
rotate() | 旋转。顺时针旋转元素。 | transform: rotate(45deg); |
skew() | 倾斜。沿 X 轴和 Y 轴倾斜元素。 | transform: skew(10deg, 5deg); |
transform
属性可以接受多个变形函数,用空格隔开,它们会按照从左到右的顺序依次生效。
8.2.2. 改变变形原点 (transform-origin
)
默认情况下,所有的变形(如旋转、缩放)都是以元素的中心点 (50% 50%
) 为基准的。transform-origin
属性可以改变这个基准点。
实战: 创建多样化的悬停变形效果。
1 | <style> |
8.3. CSS 过渡 (transition
):让变化如丝般顺滑
transition
属性可以让元素的样式变化不再是瞬间完成的,而是以一个平滑的、有持续时间的动画过程来呈现。
8.3.1. 过渡核心属性
属性 | 核心描述 | 示例 |
---|---|---|
transition-property | 指定对哪个 CSS 属性应用过渡效果。all 表示所有可过渡的属性。 | transition-property: background-color; |
transition-duration | 指定过渡效果完成所需的时间。 | transition-duration: 0.3s; |
transition-timing-function | 指定过渡的速度曲线(动画节奏)。 | transition-timing-function: ease-in-out; |
transition-delay | 指定过渡效果开始前的延迟时间。 | transition-delay: 0.1s; |
深入讲解 transition-timing-function
(速度曲线)
速度曲线决定了动画的“性格”。
ease
: 默认值,慢速开始 -> 加速 -> 慢速结束。linear
: 匀速。ease-in
: 慢速开始。ease-out
: 慢速结束。ease-in-out
: 慢速开始和结束。cubic-bezier(...)
: 允许你通过贝塞尔曲线创建完全自定义的速度。
1 |
|
8.3.2. 简写与应用
通常,我们使用 transition
简写属性来定义过渡。
语法: transition: <property> <duration> <timing-function> <delay>;
实战: 为 8.2
节的变形效果添加平滑过渡。这是 transition
最经典的用途——与 :hover
状态和 transform
属性结合,创造平滑的交互动画。
1 | <style> |
最佳实践: 将 transition
属性定义在元素的 默认状态 下,而不是 :hover
状态下。这样可以确保无论是鼠标移入还是移出,过渡效果都能平滑地触发。
8.4. CSS 动画 (animation
):编排你的动画电影
transition
只能处理从 A 状态到 B 状态的简单过渡,而 animation
属性则要强大得多。它允许我们与 @keyframes
规则配合,创建包含多个中间步骤、可以无限循环、并能控制播放方向的复杂动画序列。
重要信息: 我们后续会使用 GSAP 这个超强的动画库来协助我们的动画效果,所以对于动画的理解,我建议您仅理解到 transform 以及 transition 即可,当然学到多也没有什么不好的!
8.4.1. 定义关键帧 (@keyframes
)
@keyframes
规则是动画的“剧本”或“故事板”。我们在这里定义动画过程中的各个关键节点(关键帧)以及在这些节点上元素的样式。
语法:
- 使用
from
(等同于0%
) 和to
(等同于100%
) 定义动画的开始和结束。 - 使用百分比 (
0%
到100%
) 来定义动画过程中的任意中间状态。
1 | /* 定义一个名为 "slide-in" 的动画 */ |
8.4.2. 动画核心属性详解
定义好 @keyframes
剧本后,我们需要在元素上使用 animation
相关属性来“播放”这个剧本。
属性 | 核心描述 |
---|---|
animation-name | 指定要绑定的 @keyframes 动画的名称。 |
animation-duration | 指定动画完成一个周期的时长。 |
animation-timing-function | 速度曲线,用法与 transition 完全相同。 |
animation-delay | 指定动画开始播放前的延迟时间。 |
animation-iteration-count | 指定动画的播放次数,infinite 表示无限循环。 |
animation-direction | 指定动画在一个周期结束后是否反向播放,alternate 表示交替反向。 |
animation-fill-mode | 定义动画在播放前后(非播放状态时)的样式。forwards 表示停留在最后一帧。 |
animation-play-state | 控制动画的播放状态,paused (暂停) 或 running (运行)。 |
8.4.3. animation
(简写属性)
与 transition
类似,我们通常使用 animation
简写属性来一次性设置所有动画参数。
语法: animation: <name> <duration> <timing-function> <delay> <iteration-count> <direction> <fill-mode>;
在简写中,至少需要指定 animation-name
和 animation-duration
才能让动画生效。
8.4.4. 实战:创建一个无限循环的呼吸灯加载动画
任务: 创建一个由小到大、由暗到亮并无限循环的“呼吸”效果,这是加载动画中最常见的类型之一。
1 | <style> |
8.5. 本章核心速查总结与疑难解答
速查表
分类 | 关键项 | 核心描述 |
---|---|---|
@规则 | @import vs <link> | (推荐) 始终使用 <link> ,因为它并行加载,性能更优。 |
@supports | CSS 功能查询,用于实现优雅降级。 | |
@keyframes | (核心) 定义动画序列的“故事板”。 | |
变形 | transform | translate (平移), scale (缩放), rotate (旋转), skew (倾斜)。不影响文档流。 |
transform-origin | 改变变形的中心点。 | |
过渡 | transition | (核心) 使元素在不同状态间的样式变化变得平滑。应定义在默认状态下。 |
动画 | animation | (核心) 结合 @keyframes 创建复杂、可循环的多步动画。 |