Appearance
CSS 变换效果
CSS 变换 (Transforms) 用于修改元素的形状、大小和位置。
概述
CSS 变换允许元素在二维或三维空间中进行移动、旋转、缩放和倾斜,而不会影响文档流。
二维变换
transform 属性
应用变换效果:
css
.element {
transform: translate(10px, 20px); /* 移动 */
transform: rotate(45deg); /* 旋转 */
transform: scale(1.5); /* 缩放 */
transform: skew(30deg, 20deg); /* 倾斜 */
transform: matrix(1, 0.5, -0.5, 1, 10, 10); /* 矩阵变换 */
}
translate()
移动元素:
css
.element {
transform: translate(10px, 20px); /* x, y 方向移动 */
transform: translateX(10px); /* 仅 x 方向 */
transform: translateY(20px); /* 仅 y 方向 */
transform: translate(50%, 50%); /* 相对自身尺寸的百分比 */
}
rotate()
旋转元素:
css
.element {
transform: rotate(45deg); /* 顺时针旋转45度 */
transform: rotate(0.5turn); /* 使用turn单位 */
transform: rotate(2rad); /* 使用弧度 */
}
scale()
缩放元素:
css
.element {
transform: scale(1.5); /* x, y 方向同时缩放 */
transform: scaleX(1.5); /* 仅 x 方向缩放 */
transform: scaleY(0.5); /* 仅 y 方向缩放 */
transform: scale(1.5, 0.8); /* x方向1.5倍,y方向0.8倍 */
}
skew()
倾斜元素:
css
.element {
transform: skew(30deg, 20deg); /* x, y 方向倾斜 */
transform: skewX(30deg); /* 仅 x 方向倾斜 */
transform: skewY(20deg); /* 仅 y 方向倾斜 */
}
三维变换
3D 移动
css
.element {
transform: translate3d(10px, 20px, 30px); /* x, y, z 方向移动 */
transform: translateZ(30px); /* 仅 z 方向移动 */
}
3D 旋转
css
.element {
transform: rotate3d(1, 1, 0, 45deg); /* 沿指定轴旋转 */
transform: rotateX(45deg); /* 绕 x 轴旋转 */
transform: rotateY(45deg); /* 绕 y 轴旋转 */
transform: rotateZ(45deg); /* 绕 z 轴旋转 */
}
3D 缩放
css
.element {
transform: scale3d(1.5, 1.2, 1.0); /* x, y, z 方向缩放 */
transform: scaleZ(1.5); /* 仅 z 方向缩放 */
}
变换原点
transform-origin
设置变换的中心点:
css
.element {
transform-origin: 50% 50%; /* 默认值,中心点 */
transform-origin: left top; /* 左上角 */
transform-origin: 10px 20px; /* 具体坐标 */
transform-origin: center bottom; /* 中心底部 */
transform-origin: 20% 80%; /* 百分比位置 */
}
/* 3D 变换原点 */
.element-3d {
transform-origin: 50% 50% 10px; /* x, y, z */
}
透视效果
perspective
设置3D变换的透视效果:
css
.scene {
perspective: 1000px; /* 设置透视距离 */
}
.element {
transform: rotateY(45deg); /* 在透视环境中旋转 */
}
perspective-origin
设置透视的原点:
css
.scene {
perspective: 1000px;
perspective-origin: 50% 50%; /* 默认值 */
perspective-origin: left top; /* 透视原点 */
}
transform-style
设置嵌套元素的3D位置关系:
css
.parent {
transform-style: flat; /* 默认值,扁平化 */
transform-style: preserve-3d; /* 保持3D位置 */
}
多重变换
变换函数组合
css
.complex-transform {
transform: translate(10px, 20px) rotate(45deg) scale(1.2);
/* 按顺序应用多个变换 */
}
/* 注意变换顺序会影响结果 */
.sequence-1 {
transform: translate(100px, 0) rotate(45deg); /* 先移动再旋转 */
}
.sequence-2 {
transform: rotate(45deg) translate(100px, 0); /* 先旋转再移动 */
}
实用变换效果
中心点旋转
css
.rotate-center {
transform-origin: center center;
transform: rotate(45deg);
}
3D 翻转效果
css
.flip-container {
perspective: 1000px;
}
.flip-card {
transform-style: preserve-3d;
transition: transform 0.6s;
}
.flip-card.flipped {
transform: rotateY(180deg);
}
.flip-card-front,
.flip-card-back {
backface-visibility: hidden;
}
.flip-card-back {
transform: rotateY(180deg);
}
倾斜效果
css
.skew-element {
transform: skewX(-10deg);
transform-origin: 0 0; /* 设置倾斜原点 */
}
缩放悬停效果
css
.hover-scale {
transition: transform 0.3s ease;
}
.hover-scale:hover {
transform: scale(1.1);
}
3D 旋转立方体
css
.cube {
position: relative;
transform-style: preserve-3d;
transform: rotateX(-30deg) rotateY(-30deg);
}
.cube-face {
position: absolute;
width: 100px;
height: 100px;
border: 1px solid #ccc;
opacity: 0.8;
}
.front { transform: rotateY(0deg) translateZ(50px); }
.back { transform: rotateY(180deg) translateZ(50px); }
.right { transform: rotateY(90deg) translateZ(50px); }
.left { transform: rotateY(-90deg) translateZ(50px); }
.top { transform: rotateX(90deg) translateZ(50px); }
.bottom { transform: rotateX(-90deg) translateZ(50px); }
性能优化
硬件加速
css
.hardware-accelerated {
transform: translateZ(0); /* 触发硬件加速 */
/* 或使用 */
will-change: transform; /* 提示浏览器优化 */
}
避免变换布局属性
css
/* 推荐:使用 transform 进行动画 */
.smooth-animation {
transition: transform 0.3s;
}
.smooth-animation:hover {
transform: translateX(100px);
}
/* 避免:直接变换会触发重排的属性 */
.bad-animation {
transition: left 0.3s; /* 触发重排 */
}
变换矩阵
matrix() 和 matrix3d()
css
/* 2D 变换矩阵 */
.matrix-transform {
transform: matrix(a, b, c, d, tx, ty);
/* a, c, b, d 控制缩放/旋转/倾斜 */
/* tx, ty 控制移动 */
}
/* 3D 变换矩阵 */
.matrix3d-transform {
transform: matrix3d(n1, n2, ... n16); /* 4x4 矩阵 */
}
实际应用示例
按钮悬停效果
css
.btn {
display: inline-block;
padding: 10px 20px;
transition: transform 0.2s ease;
}
.btn:hover {
transform: translateY(-2px);
box-shadow: 0 5px 15px rgba(0,0,0,0.2);
}
导航菜单动画
css
.menu-item {
opacity: 0;
transform: translateY(-20px);
transition: transform 0.3s ease, opacity 0.3s ease;
}
.menu-item.active {
opacity: 1;
transform: translateY(0);
}
图片悬停效果
css
.image-container {
overflow: hidden;
}
.image {
transition: transform 0.5s ease;
}
.image-container:hover .image {
transform: scale(1.1);
}
可访问性考虑
减少动画偏好
css
@media (prefers-reduced-motion: reduce) {
* {
transform: none !important;
transition: none !important;
}
}
浏览器兼容性
添加厂商前缀
css
.element {
transform: rotate(45deg);
-webkit-transform: rotate(45deg); /* Safari/Chrome */
-moz-transform: rotate(45deg); /* Firefox */
-ms-transform: rotate(45deg); /* IE */
}
最佳实践
- 优先使用 transform 而非改变位置属性以获得更好的性能
- 注意变换顺序,不同顺序会产生不同结果
- 使用 transform-origin 精确控制变换中心点
- 考虑用户偏好设置,提供减少动画的选项
- 避免过度使用复杂变换效果
- 测试在不同设备上的渲染性能
- 合理使用硬件加速以提高动画流畅度