Menu

CSS 渐变:径向、线性与锥形渐变

CSS 渐变是浏览器用颜色画出来的图像。本文讲解 radial-gradient(形状、大小、位置)、linear-gradient(方向和角度)、conic-gradient、色标、用硬色标画条纹、重复渐变以及渐变文字。

本页包含可运行的编辑器。编辑、运行,立即查看输出。

径向渐变

radial-gradient() 从一个中心点向外混合颜色。和所有 CSS 渐变一样,它是一种图像,所以要写在 background-image(或 background 简写属性)里:

完整语法是 radial-gradient(shape size at position, color stops)。颜色之前的部分都是可选的。

部分可选值默认值
形状circle、ellipseellipse
大小closest-side、closest-corner、farthest-side、farthest-corner,或长度farthest-corner
位置at center、at top left、at 30% 70%、at 20px 40pxat center
色标两个或更多颜色,每个颜色可以带一个位置

大小关键字决定最后一个颜色在哪里到达:在盒子最近的边、最远的角,等等。修改这里的值,看看渐变如何重新绘制:

试试 circle farthest-corner at 30% 50%, #f59e0b, #2563eb、ellipse at bottom, white, #16a34a 和 circle 40px, #f59e0b 99%, transparent(一个边缘分明的圆点)。

线性渐变

linear-gradient() 沿一条直线混合颜色。先写方向或角度,再写颜色:

角度从指向上方的 0deg 开始,按顺时针旋转,所以 90deg 就是 to right,180deg 就是默认的 to bottom。在从右到左的页面中,to right 仍然是物理方向;如果渐变需要跟随阅读方向,就得自己做镜像。

色标与硬色标

每个颜色都可以有一个位置。不写位置时,颜色均匀分布。当两个颜色位置相同时,颜色会瞬间切换,条纹、旗帜和进度条就是这样画出来的:

一个色标也可以带两个位置,比如 #111827 12px 24px,它会画出一条从 12px 到 24px 的纯色带。

锥形渐变

conic-gradient() 围绕中心点扫过各种颜色,就像时钟的指针。配合硬色标,不用任何图片或 JavaScript 就能画出饼图:

用 CSS 画的图表对屏幕阅读器是不可见的,所以也要用文字写出这些数字。

渐变文字

把渐变背景裁剪到字母的形状上,并让文字本身透明:

.gradient-text {
  background: linear-gradient(90deg, #2563eb, #db2777);
  -webkit-background-clip: text; /* older browsers need the prefix */
  background-clip: text;
  color: transparent;
}

记得考虑一个普通的 color 后备:如果裁剪失败,文字就会消失。渐变文字的对比度也不均匀,所以只在大标题上使用。

渐变可以和图片以及其他渐变一起叠加在同一个 background-image 列表里;背景图片一页讲解了图层、大小和位置。

常见错误

  • background-color: linear-gradient(...)。 渐变是一种图像:请用 background-image 或 background。
  • 角度方向搞反了。 0deg 指向上方,而不是右方。90deg 才是朝右。
  • 在没有高度的元素上设置渐变。 什么都不会显示;给它内容或尺寸。
  • 中间的颜色发灰发浑。 混合两个饱和度高的对立颜色(比如红和绿),在 sRGB 中会经过灰褐色。加一个中间色标,或者在另一个颜色空间里混合:linear-gradient(in oklch, red, green)。
  • 大面积的细微渐变出现色带。 在大面积上使用非常接近的颜色会显出台阶;让色标之间的对比稍大一些会有帮助。

常见问题

CSS 中怎么做径向渐变?

使用 background-image: radial-gradient(#93c5fd, #1e3a8a);。在颜色前面加上形状和位置,比如 radial-gradient(circle at top left, #93c5fd, #1e3a8a)。

radial-gradient 中的 circle 和 ellipse 有什么区别?

ellipse(默认值)会按盒子的比例拉伸,所以在宽盒子里它是扁宽的。circle 则无论盒子是什么形状,都让渐变保持圆形。

怎么设置线性渐变的方向?

把方向或角度写在最前面:linear-gradient(to right, red, blue) 或 linear-gradient(45deg, red, blue)。默认是 to bottom(180deg);0deg 指向上方,角度按顺时针旋转。

怎么画出分明的条纹,而不是平滑过渡?

给两个颜色设置相同的色标位置:linear-gradient(90deg, #2563eb 50%, #f59e0b 50%) 会在中间直接换色,没有过渡。repeating-linear-gradient 则会重复这样的色标图案。

可以把渐变用作 background-color 吗?

不可以。渐变是一种图像,所以要写在 background-image 或 background 简写属性里。background-color: linear-gradient(...) 是无效的,会被忽略。

Coddy 编程语言插图

和 Coddy 一起学编程

开始