变换、过渡与动画
transform 改变元素视觉几何但不改变文档流占位(周围元素布局不变);transition 在两种状态间插值;animation 用 @keyframes 定义多关键帧序列。与 视觉效果 中的滤镜、裁剪可组合使用。
变换(transform)
在局部坐标系中应用;默认变换原点为 transform-origin: center(可改为 top left 等)。
2D
| 函数 | 说明 |
|---|---|
translate(x, y) / translateX/Y | 平移 |
rotate(angle) | 旋转;正值为顺时针(2D) |
scale(sx, sy) | 缩放,1 为原始大小 |
skew(ax, ay) | 倾斜 |
matrix(...) | 矩阵组合 |
独立变换属性(与 transform 函数可组合,便于单独过渡某一维):
| 属性 | 说明 |
|---|---|
translate / translateX / translateY / translateZ | 平移 |
rotate | 2D/3D 旋转(含 rotateX 等轴属性) |
scale | 缩放 |
.card:hover {
transform: translateY(-4px) scale(1.02);
}
.panel {
translate: 0 0;
transition: translate 0.3s ease;
}
.panel.is-open {
translate: 0 -8px;
}
3D
- 父级设置
perspective(如perspective: 800px)才有「近大远小」。 - 子级
transform-style: preserve-3d保留子元素 3D 空间(否则会被压平)。 - 使用
translate3d/rotateX等可触发 GPU 合成。
.scene {
perspective: 500px;
}
.cube {
transform-style: preserve-3d;
transform: rotateX(45deg) rotateY(45deg);
}
定位元素
transform非none时,会成为fixed子元素的包含块参照之一(与 定位 相关)。
过渡(transition)
在属性计算值变化时插值(需触发::hover、类名切换等)。
.button {
background-color: blue;
transition:
background-color 0.5s ease,
transform 0.3s ease;
}
.button:hover {
background-color: red;
transform: scale(1.05);
}
| 子属性 | 含义 |
|---|---|
transition-property | 参与过渡的属性,all 或列表 |
transition-duration | 时长 |
transition-timing-function | 曲线(ease、cubic-bezier(...)) |
transition-delay | 延迟 |
- 仅能在起止两态间过渡;
auto、fit-content等往往无法平滑插值。 - 事件:
transitionend(注意propertyName)。
动画(animation + @keyframes)
可自动播放、循环、反向,定义任意中间关键帧。
@keyframes bounce {
0%,
100% {
transform: translateY(0);
}
50% {
transform: translateY(-50px);
}
}
.ball {
animation: bounce 2s ease-in-out infinite;
}
| 子属性 | 含义 |
|---|---|
animation-name | 对应 @keyframes 名称 |
animation-duration | 周期时长 |
animation-timing-function | 速度曲线 |
animation-delay | 延迟 |
animation-iteration-count | 次数,infinite 无限 |
animation-direction | normal / reverse / alternate |
animation-fill-mode | forwards 保持末帧等 |
animation-play-state | paused / running |
事件:animationstart、animationiteration、animationend。
@starting-style
为元素首次插入文档或 display 从 none 变为可见时定义「起始样式」,与 transition 配合实现入场动画(无需仅靠 JS 设初始类名)。
.dialog {
transition: opacity 0.3s ease, transform 0.3s ease;
}
@starting-style {
.dialog {
opacity: 0;
transform: scale(0.95);
}
}
滚动驱动动画(概要)
通过 animation-timeline: scroll() 等将动画进度绑定到滚动位置,适用于进度条、视差等;语法与浏览器支持见 MDN:滚动驱动动画(英文)与 现代 CSS 概览。
对比总表
| transform | transition | animation | |
|---|---|---|---|
| 作用 | 单帧几何状态 | 两态之间平滑变化 | 多关键帧、可循环 |
| 触发 | 立即或随动画/过渡 | 属性值变化时 | 常自动播放 |
| 布局 | 不改变流内占位 | 若过渡 layout 属性会触发布局 | 同左 |
| 性能 | transform/opacity 宜合成 | 避免过渡 width/top 等 | 同左 |
最佳实践
- 优先动画化
transform与opacity,避免width、height、top、left、margin等触发布局(layout)的属性。 - 简单交互用 transition;加载、循环、复杂路径用 animation。
- 3D 记得父级
perspective。 - 无障碍:提供
@media (prefers-reduced-motion: reduce) { * { animation: none !important; transition: none !important; } }或等价降级(勿破坏必要反馈)。 - 必要时
will-change: transform提示合成(勿滥用,动画结束可移除)。
参考文献
以下链接在编写时均可正常访问:
| 资料 | 说明 |
|---|---|
| MDN:transform | 2D/3D 变换 |
| MDN:transition | 过渡 |
| MDN:使用 CSS 动画 | @keyframes 与 animation |
| MDN:prefers-reduced-motion | 减少动效偏好 |
| W3C:CSS Transforms Level 2 | 变换规范(英文) |
| W3C:CSS Animations Level 1 | 动画规范(英文) |
| MDN:@starting-style | 入场起始样式(英文) |
| MDN:translate | 独立平移属性 |
相关文章
Less 基础与核心语法
Less 是 JavaScript 实现的 CSS 预处理器,在 CSS 语法上扩展变量(@)、嵌套、混合、运算与函数,编译为普通 CSS 后由浏览器加载;本文覆盖安装、CLI、构建工具集成与全部核心语法。
Sass 简介与安装
Sass(Syntactically Awesome Style Sheets)是 CSS 预处理器,在 CSS 语法上增加变量、嵌套、混合、模块、控制指令等;有 SCSS 与缩进语法两种源码语法,官方实现为 Dart Sass。
模块与控制流:@use、内置函数、@if/@for/@each
Dart Sass 推荐用 @use/@forward 替代已弃用的 @import;内置 sass:* 模块提供颜色、字符串、列表、Map、数学等函数;@if/@for/@each/@while 用于条件与循环生成样式。
复用机制:Mixin 与继承
Mixin(@mixin/@include)支持参数与 @content,适合动态样式;@extend 与 %placeholder 通过合并选择器复用完全相同的静态样式,减少 CSS 体积。
语法基础:变量、嵌套与运算
Sass 语法基础:$ 变量与插值、选择器嵌套与 & 父选择器引用、数学/颜色/字符串运算、三种注释语法及与原生 CSS 嵌套的关系。
颜色与背景
color 设置前景(多为文字)色;background-* 设置元素背景(颜色、图像、渐变)。二者共同决定对比度与视觉层次,直接影响 无障碍 阅读体验。排版中的文本颜色用法见 排版与文本。
Series
css
1 / 20