FORMA

变换、过渡与动画

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平移
rotate2D/3D 旋转(含 rotateX 等轴属性)
scale缩放
css
.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 合成。
css
.scene {
    perspective: 500px;
}
.cube {
    transform-style: preserve-3d;
    transform: rotateX(45deg) rotateY(45deg);
}

定位元素 transformnone 时,会成为 fixed 子元素的包含块参照之一(与 定位 相关)。

过渡(transition

在属性计算值变化时插值(需触发::hover、类名切换等)。

css
.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曲线(easecubic-bezier(...)
transition-delay延迟
  • 仅能在起止两态间过渡;autofit-content 等往往无法平滑插值。
  • 事件:transitionend(注意 propertyName)。

动画(animation + @keyframes

可自动播放、循环、反向,定义任意中间关键帧。

css
@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-directionnormal / reverse / alternate
animation-fill-modeforwards 保持末帧等
animation-play-statepaused / running

事件:animationstartanimationiterationanimationend

@starting-style

为元素首次插入文档displaynone 变为可见时定义「起始样式」,与 transition 配合实现入场动画(无需仅靠 JS 设初始类名)。

css
.dialog {
    transition: opacity 0.3s ease, transform 0.3s ease;
}
@starting-style {
    .dialog {
        opacity: 0;
        transform: scale(0.95);
    }
}

滚动驱动动画(概要)

通过 animation-timeline: scroll() 等将动画进度绑定到滚动位置,适用于进度条、视差等;语法与浏览器支持见 MDN:滚动驱动动画(英文)与 现代 CSS 概览

对比总表

transformtransitionanimation
作用单帧几何状态两态之间平滑变化多关键帧、可循环
触发立即或随动画/过渡属性值变化时常自动播放
布局不改变流内占位若过渡 layout 属性会触发布局同左
性能transform/opacity 宜合成避免过渡 width/top 等同左

最佳实践

  1. 优先动画化 transformopacity,避免 widthheighttopleftmargin 等触发布局(layout)的属性。
  2. 简单交互用 transition;加载、循环、复杂路径用 animation
  3. 3D 记得父级 perspective
  4. 无障碍:提供 @media (prefers-reduced-motion: reduce) { * { animation: none !important; transition: none !important; } } 或等价降级(勿破坏必要反馈)。
  5. 必要时 will-change: transform 提示合成(勿滥用,动画结束可移除)。

参考文献

以下链接在编写时均可正常访问:

资料说明
MDN:transform2D/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独立平移属性

Series

css

1 / 20