Skip to content

变换与滤镜

CSS 变换和滤镜是创建视觉效果的强大工具。变换可以移动、旋转、缩放元素,滤镜可以调整颜色、模糊、阴影。两者结合能实现令人惊艳的效果。

Transform 变换#

2D 变换#

translate 位移#

.move-right {
transform: translateX(100px);
}
.move-down {
transform: translateY(50px);
}
.move-both {
transform: translate(100px, 50px);
}
/* 百分比相对于元素自身尺寸 */
.center {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}

rotate 旋转#

.rotate-45 {
transform: rotate(45deg);
}
.rotate-negative {
transform: rotate(-90deg);
}
/* 完整旋转 */
.spin {
transform: rotate(360deg);
}

scale 缩放#

.scale-up {
transform: scale(1.5);
}
.scale-down {
transform: scale(0.5);
}
.scale-x {
transform: scaleX(2);
}
.scale-y {
transform: scaleY(0.5);
}
/* 镜像 */
.flip-horizontal {
transform: scaleX(-1);
}
.flip-vertical {
transform: scaleY(-1);
}

skew 倾斜#

.skew-x {
transform: skewX(20deg);
}
.skew-y {
transform: skewY(10deg);
}
.skew-both {
transform: skew(20deg, 10deg);
}

组合变换#

变换可以组合使用,顺序影响结果

.combined {
/* 先旋转,再位移 */
transform: rotate(45deg) translateX(100px);
}
.different-order {
/* 先位移,再旋转(结果不同) */
transform: translateX(100px) rotate(45deg);
}

transform-origin#

变换原点:

.origin-center {
transform-origin: center; /* 默认 */
}
.origin-top-left {
transform-origin: top left;
}
.origin-bottom-right {
transform-origin: 100% 100%;
}
.origin-custom {
transform-origin: 20px 50px;
}

3D 变换#

透视#

/* 父元素设置透视 */
.container {
perspective: 1000px;
}
/* 或在元素上直接设置 */
.element {
transform: perspective(1000px) rotateY(45deg);
}

透视值越小,3D 效果越强烈。

3D 旋转#

.rotate-x {
transform: rotateX(45deg);
}
.rotate-y {
transform: rotateY(45deg);
}
.rotate-z {
transform: rotateZ(45deg); /* 同 rotate() */
}
.rotate-3d {
transform: rotate3d(1, 1, 0, 45deg);
}

3D 位移#

.translate-z {
transform: translateZ(100px); /* 向观察者移动 */
}
.translate-3d {
transform: translate3d(100px, 50px, 30px);
}

3D 相关属性#

.card-container {
perspective: 1000px;
perspective-origin: center; /* 视点位置 */
}
.card {
transform-style: preserve-3d; /* 保持子元素 3D */
backface-visibility: hidden; /* 隐藏背面 */
}

3D 翻转卡片#

.flip-card {
width: 300px;
height: 200px;
perspective: 1000px;
}
.flip-card-inner {
position: relative;
width: 100%;
height: 100%;
transition: transform 0.6s;
transform-style: preserve-3d;
}
.flip-card:hover .flip-card-inner {
transform: rotateY(180deg);
}
.flip-card-front,
.flip-card-back {
position: absolute;
width: 100%;
height: 100%;
backface-visibility: hidden;
border-radius: 8px;
}
.flip-card-front {
background: #3b82f6;
color: white;
}
.flip-card-back {
background: #10b981;
color: white;
transform: rotateY(180deg);
}

Filter 滤镜#

模糊#

.blur-sm {
filter: blur(4px);
}
.blur-md {
filter: blur(8px);
}
.blur-lg {
filter: blur(16px);
}

亮度#

.bright {
filter: brightness(1.5); /* 150% 亮度 */
}
.dark {
filter: brightness(0.5); /* 50% 亮度 */
}

对比度#

.high-contrast {
filter: contrast(1.5);
}
.low-contrast {
filter: contrast(0.5);
}

灰度#

.grayscale {
filter: grayscale(1); /* 完全灰度 */
}
.partial-gray {
filter: grayscale(0.5);
}

色相旋转#

.hue-rotate {
filter: hue-rotate(90deg);
}
.hue-invert {
filter: hue-rotate(180deg);
}

反色#

.invert {
filter: invert(1);
}

透明度#

.semi-transparent {
filter: opacity(0.5);
}

饱和度#

.saturated {
filter: saturate(2);
}
.desaturated {
filter: saturate(0.5);
}

褐色#

.sepia {
filter: sepia(1);
}

阴影#

.drop-shadow {
filter: drop-shadow(4px 4px 8px rgba(0, 0, 0, 0.3));
}
/* 与 box-shadow 的区别:适应元素形状 */
.png-shadow {
filter: drop-shadow(2px 2px 4px rgba(0, 0, 0, 0.5));
}

组合滤镜#

.vintage {
filter: sepia(0.3) contrast(1.1) brightness(1.1) saturate(1.3);
}
.dramatic {
filter: contrast(1.4) brightness(0.9) saturate(1.2);
}
.faded {
filter: contrast(0.9) brightness(1.1) saturate(0.8);
}

backdrop-filter#

对元素背后的内容应用滤镜:

.glass {
background: rgba(255, 255, 255, 0.1);
backdrop-filter: blur(10px);
}
.frosted-glass {
background: rgba(255, 255, 255, 0.2);
backdrop-filter: blur(20px) saturate(180%);
}

毛玻璃效果#

.modal-backdrop {
position: fixed;
inset: 0;
background: rgba(0, 0, 0, 0.3);
backdrop-filter: blur(4px);
}
.card-glass {
background: rgba(255, 255, 255, 0.15);
backdrop-filter: blur(12px);
border: 1px solid rgba(255, 255, 255, 0.2);
border-radius: 16px;
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.1);
}

mix-blend-mode#

元素与背景的混合模式:

.multiply {
mix-blend-mode: multiply;
}
.screen {
mix-blend-mode: screen;
}
.overlay {
mix-blend-mode: overlay;
}
.color-dodge {
mix-blend-mode: color-dodge;
}
.difference {
mix-blend-mode: difference;
}

创意文字效果#

.blend-text {
position: relative;
background: url('image.jpg');
background-size: cover;
}
.blend-text h1 {
color: white;
mix-blend-mode: difference;
}

实战案例#

图片悬停效果#

.image-card {
position: relative;
overflow: hidden;
border-radius: 12px;
}
.image-card img {
width: 100%;
transition:
transform 0.5s,
filter 0.5s;
}
.image-card:hover img {
transform: scale(1.1);
filter: brightness(0.7);
}
.image-card .overlay {
position: absolute;
inset: 0;
display: flex;
align-items: center;
justify-content: center;
opacity: 0;
transition: opacity 0.3s;
}
.image-card:hover .overlay {
opacity: 1;
}

禁用状态#

.disabled {
filter: grayscale(1) opacity(0.6);
pointer-events: none;
}

加载占位#

.skeleton {
background: linear-gradient(90deg, #f0f0f0 25%, #e0e0e0 50%, #f0f0f0 75%);
background-size: 200% 100%;
animation: shimmer 1.5s infinite;
}
@keyframes shimmer {
0% {
background-position: 200% 0;
}
100% {
background-position: -200% 0;
}
}

头像上传预览#

.avatar-preview {
width: 120px;
height: 120px;
border-radius: 50%;
overflow: hidden;
cursor: pointer;
}
.avatar-preview img {
width: 100%;
height: 100%;
object-fit: cover;
transition:
transform 0.3s,
filter 0.3s;
}
.avatar-preview:hover img {
transform: scale(1.1);
filter: brightness(0.8);
}
.avatar-preview::after {
content: '更换头像';
position: absolute;
inset: 0;
display: flex;
align-items: center;
justify-content: center;
background: rgba(0, 0, 0, 0.5);
color: white;
opacity: 0;
transition: opacity 0.3s;
}
.avatar-preview:hover::after {
opacity: 1;
}

导航栏毛玻璃#

.navbar {
position: fixed;
top: 0;
left: 0;
right: 0;
padding: 1rem 2rem;
background: rgba(255, 255, 255, 0.8);
backdrop-filter: blur(10px) saturate(180%);
border-bottom: 1px solid rgba(0, 0, 0, 0.1);
z-index: 100;
}
/* 暗色模式 */
.navbar.dark {
background: rgba(0, 0, 0, 0.8);
backdrop-filter: blur(10px) saturate(180%);
}

性能注意#

使用 GPU 加速#

.optimized {
transform: translateZ(0); /* 触发 GPU 加速 */
will-change: transform;
}

避免滤镜滥用#

/* 滤镜计算成本高,避免在大量元素上使用 */
.expensive {
filter: blur(10px) drop-shadow(0 0 10px black);
}

backdrop-filter 兼容性#

.glass {
background: rgba(255, 255, 255, 0.9); /* 降级方案 */
}
@supports (backdrop-filter: blur(10px)) {
.glass {
background: rgba(255, 255, 255, 0.1);
backdrop-filter: blur(10px);
}
}

变换和滤镜为 CSS 带来了强大的视觉能力。合理使用它们可以创建现代、优雅的界面效果。下一篇是本系列的最后一篇,我们将学习 CSS 容器查询,它让组件级响应式成为可能。