CSS 渐变是那些看起来简单,直到你盯着一个泥泞的棕色块,而你本期望看到从蓝色到紫色的平滑过渡。语法有其特殊之处,调试路径不透明,而且大多数教程在问题开始前就停止了。
这是一份实用参考。每个概念都配有可运行的代码。打开一个 CSS 渐变生成器 在另一个标签页中——你在阅读时会希望进行实验。
三种类型——以及何时使用每种
linear-gradient 适用于所有方向性场景:英雄背景、按钮填充、分隔线等。
background: linear-gradient(135deg, #6366f1, #8b5cf6);
radial-gradient 从中心点向外辐射——适用于聚光灯效果、光晕和圆形 UI 元素。
background: radial-gradient(circle at 30% 40%, #f59e0b, #ef4444);
conic-gradient 围绕中心角度展开——适用于饼图、加载动画和色轮。
background: conic-gradient(from 90deg, #3b82f6, #8b5cf6, #3b82f6);
经验法则:如果过渡是沿某个方向流动,使用线性渐变;如果呈辐射状,使用径向渐变;如果呈旋转状,使用锥形渐变。
语法解析:容易让人困惑的部分
最常见的困惑来源是 方向与角度. to right 且 90deg 两者都会产生从左到右的渐变,但它们在处理非方形元素时有所不同。当希望渐变适应元素形状时,使用方向关键字(to right, to bottom right);当需要精确控制时,使用角度值。
颜色停点 是精度关键所在:
/* Even distribution — browser figures out spacing */
background: linear-gradient(to right, #f97316, #8b5cf6);
/* Explicit stops */
background: linear-gradient(to right, #f97316 0%, #f97316 30%, #8b5cf6 60%, #8b5cf6 100%);
第二个版本在30%处保持橙色,然后过渡到紫色。如果没有明确的位置,就会得到平滑均匀的混合效果。
你也可以强制设置颜色边缘——这对条纹图案非常有用:
/* Hard mid-stop: sharp color transition at 50% */
background: linear-gradient(to right, #3b82f6 50%, #ef4444 50%);
常见问题及其真正原因
条带状现象 ——可见的条纹而非平滑渐变——通常出现在对比度低或深色到深色的过渡中。添加一个微妙的中间停点,并稍微拉开颜色间距,通常可以解决这个问题:
/* Before — banding prone */
background: linear-gradient(180deg, #1e1b4b, #312e81);
/* After — add a mid nudge */
background: linear-gradient(180deg, #1e1b4b 0%, #2e2b6e 50%, #312e81 100%);
颜色无法平滑混合 ——红色和蓝色之间紫色变成棕褐色——是已知的sRGB问题。CSS 颜色级别4引入了 in oklab 插值,它通过感知颜色空间进行混合:
/* Modern — cleaner blends */
background: linear-gradient(in oklab to right, #ef4444, #3b82f6);
到2026年,浏览器支持非常完善。如果需要兼容旧版本,可以在其上方保留标准渐变作为后备方案。
旧版 WebKit 中的锥形渐变:为功能性用途添加一个纯色后备方案——例如饼图、进度指示器——因为装饰性失败是可以接受的,但功能性的 UI 失败则不行:
.pie {
background: #6366f1; /* fallback */
background: conic-gradient(#6366f1 var(--pct), #e5e7eb var(--pct));
}
叠加渐变
CSS 背景可以接受多个值——渐变像图层一样堆叠,按声明顺序从上到下:
background:
linear-gradient(rgba(0, 0, 0, 0.4), rgba(0, 0, 0, 0.4)),
radial-gradient(ellipse at 20% 80%, #6366f1 0%, transparent 60%),
radial-gradient(ellipse at 80% 20%, #f59e0b 0%, transparent 60%),
#0f172a;
深色覆盖层位于最上层,两个光晕位于其下方,而纯色后备则位于最底层。这种模式常用于需要深度但无需加载图片的英雄区域。
一个限制:带有 rgba 或透明停点的渐变层会与它们下方的图层相互作用,而不是与页面背景相互作用。请相应规划图层顺序。 background CSS 变量使渐变可主题化
渐变中的硬编码颜色值会破坏主题系统。相反,将停点定义为变量:
切换主题只需覆盖一个变量。结合
:root {
--gradient-start: #6366f1;
--gradient-end: #8b5cf6;
--gradient-angle: 135deg;
}
.card {
background: linear-gradient(var(--gradient-angle), var(--gradient-start), var(--gradient-end));
}
[data-theme="warm"] {
--gradient-start: #f97316;
--gradient-end: #ef4444;
}
可实现动画渐变——否则,CSS 无法在渐变值之间进行插值: @property 性能:当渐变的成本超过图片时
@property --gradient-angle {
syntax: '<angle>';
initial-value: 135deg;
inherits: false;
}
@keyframes rotate-gradient {
to { --gradient-angle: 495deg; }
}
.animated {
animation: rotate-gradient 4s linear infinite;
background: linear-gradient(var(--gradient-angle), #6366f1, #8b5cf6);
}
渐变在绘制时由 GPU 进行栅格化。对于静态且简单的渐变,这比 HTTP 请求图片更轻量。但频繁重绘元素上的复杂多层渐变可能会导致绘制瓶颈。
注意这些模式:
单个元素上的渐变层数超过3到4层
- 背景上的渐变——它们在每次滚动帧中都会重新绘制
- 没有
position: fixed的动画渐变——这些会强制完整的重绘,而不是复合更新 - 在开发者工具中查看性能剖面,然后进行优化。大多数渐变使用远未达到这些限制。当你确实遇到瓶颈时,转换为预渲染图片或切换到
@property基于动画的解决方案是正确的修复方法。
从生成器开始,最终在代码中完成 @property最快实现有效渐变的路径是视觉化的:使用
来调整颜色和位置,然后将输出复制到你的样式表中。从那里,上述技术——变量提取、图层叠加、插值——让你能够将其扩展为生产就绪的方案,而无需猜测。
CSS 渐变:编写与调试无需猜测 2 CSS 渐变生成器 CSS 渐变:编写与调试无需猜测 1 oklab CSS 渐变是那些看起来简单,直到你盯着一个泥泞的棕色块,而你本期望看到从蓝色到紫色的平滑过渡。该
