ZetCode

JavaScript Canvas 径向渐变教程

最后修改于 2025 年 4 月 3 日

在本文中,我们将探讨 JavaScript 中的 Canvas createRadialGradient 方法。此方法会创建从中心点向外辐射的颜色过渡。径向渐变非常适合创建光照效果、球体等。

基本定义

径向渐变是一种从中心点向外辐射的颜色过渡。它需要两个圆来定义渐变区域——内圆和外圆。渐变沿半径在定义的颜色停止点之间过渡。

createRadialGradient 方法接受六个参数:内圆的 x0,y0,r0 和外圆的 x1,y1,r1。颜色停止点使用 addColorStop 添加,范围在 0(开始)到 1(结束)之间。

基本径向渐变

此示例演示了如何创建简单的径向渐变填充。

index.html
<!DOCTYPE html>
<html>
<head>
    <title>Basic Radial Gradient</title>
</head>
<body>

<canvas id="myCanvas" width="300" height="200"></canvas>

<script>
    const canvas = document.getElementById('myCanvas');
    const ctx = canvas.getContext('2d');
    
    // Create radial gradient
    const gradient = ctx.createRadialGradient(150, 100, 10, 150, 100, 100);
    gradient.addColorStop(0, 'red');
    gradient.addColorStop(1, 'blue');
    
    // Fill with gradient
    ctx.fillStyle = gradient;
    ctx.fillRect(0, 0, 300, 200);
</script>

</body>
</html>

这会创建一个以 (150,100) 为中心,内半径为 10,外半径为 100 的径向渐变。颜色从中心的红色过渡到边缘的蓝色。

该渐变用于填充整个画布。请注意渐变如何自然地创建圆形颜色过渡图案。

偏移中心渐变

此示例展示了一个具有偏移中心和外圆的径向渐变。

index.html
<!DOCTYPE html>
<html>
<head>
    <title>Offset Center Gradient</title>
</head>
<body>

<canvas id="myCanvas" width="300" height="200"></canvas>

<script>
    const canvas = document.getElementById('myCanvas');
    const ctx = canvas.getContext('2d');
    
    // Create gradient with offset center
    const gradient = ctx.createRadialGradient(100, 100, 20, 200, 100, 100);
    gradient.addColorStop(0, 'yellow');
    gradient.addColorStop(0.5, 'orange');
    gradient.addColorStop(1, 'darkred');
    
    // Fill with gradient
    ctx.fillStyle = gradient;
    ctx.fillRect(0, 0, 300, 200);
</script>

</body>
</html>

这里内圆位于 (100,100) 处,半径为 20,而外圆位于 (200,100) 处,半径为 100。这会创建一个椭圆形的渐变图案。

颜色停止点创建了从黄色到橙色再到深红色的三色过渡。偏移的中心产生了有趣的光照效果。

圆形径向渐变

此示例将径向渐变专门应用于圆形路径。

index.html
<!DOCTYPE html>
<html>
<head>
    <title>Gradient Circle</title>
</head>
<body>

<canvas id="myCanvas" width="300" height="200"></canvas>

<script>
    const canvas = document.getElementById('myCanvas');
    const ctx = canvas.getContext('2d');
    
    // Create gradient matching circle dimensions
    const gradient = ctx.createRadialGradient(150, 100, 0, 150, 100, 80);
    gradient.addColorStop(0, 'white');
    gradient.addColorStop(0.7, 'lightblue');
    gradient.addColorStop(1, 'navy');
    
    // Draw circle with gradient fill
    ctx.beginPath();
    ctx.arc(150, 100, 80, 0, Math.PI * 2);
    ctx.fillStyle = gradient;
    ctx.fill();
</script>

</body>
</html>

这通过将渐变尺寸与圆匹配来创建逼真的球体效果。渐变从中心的白色过渡到边缘的深蓝色。

内半径为 0(点源),外半径与圆的 80px 匹配。0.7 的颜色停止点在颜色之间创建了更自然的过渡。

多个颜色停止点

此示例演示了带有多个颜色停止点的径向渐变。

index.html
<!DOCTYPE html>
<html>
<head>
    <title>Multiple Color Stops</title>
</head>
<body>

<canvas id="myCanvas" width="300" height="200"></canvas>

<script>
    const canvas = document.getElementById('myCanvas');
    const ctx = canvas.getContext('2d');
    
    // Create gradient with multiple stops
    const gradient = ctx.createRadialGradient(150, 100, 10, 150, 100, 120);
    gradient.addColorStop(0, 'red');
    gradient.addColorStop(0.2, 'orange');
    gradient.addColorStop(0.4, 'yellow');
    gradient.addColorStop(0.6, 'green');
    gradient.addColorStop(0.8, 'blue');
    gradient.addColorStop(1, 'violet');
    
    // Fill canvas
    ctx.fillStyle = gradient;
    ctx.fillRect(0, 0, 300, 200);
</script>

</body>
</html>

这会创建一种具有六个不同颜色停止点的彩虹效果。每个停止点沿渐变从中心到边缘的半径均匀分布。

内圆半径为 10 像素,外圆半径为 120 像素,形成了一个大的渐变区域。多个停止点产生了清晰可见的颜色带。

径向渐变描边

此示例展示了如何将径向渐变应用于描边而不是填充。

index.html
<!DOCTYPE html>
<html>
<head>
    <title>Gradient Stroke</title>
</head>
<body>

<canvas id="myCanvas" width="300" height="200"></canvas>

<script>
    const canvas = document.getElementById('myCanvas');
    const ctx = canvas.getContext('2d');
    
    // Create radial gradient
    const gradient = ctx.createRadialGradient(150, 100, 0, 150, 100, 150);
    gradient.addColorStop(0, 'gold');
    gradient.addColorStop(0.5, 'orange');
    gradient.addColorStop(1, 'darkred');
    
    // Draw star with gradient stroke
    ctx.beginPath();
    ctx.moveTo(150, 20);
    ctx.lineTo(180, 80);
    ctx.lineTo(250, 90);
    ctx.lineTo(200, 130);
    ctx.lineTo(210, 200);
    ctx.lineTo(150, 170);
    ctx.lineTo(90, 200);
    ctx.lineTo(100, 130);
    ctx.lineTo(50, 90);
    ctx.lineTo(120, 80);
    ctx.closePath();
    
    ctx.strokeStyle = gradient;
    ctx.lineWidth = 8;
    ctx.stroke();
</script>

</body>
</html>

在这里,我们创建了一个星形并将其描边应用了径向渐变。渐变从中心的金色过渡到边缘的深红色。

8 像素的粗线宽使渐变清晰可见。渐变中心与星形的中心匹配,以获得一致的光照效果。

来源

MDN createRadialGradient 文档

在本文中,我们探索了在 HTML canvas 上创建和使用径向渐变的各种技术。这些渐变是创建逼真的光照效果、立体形状和充满活力的设计的强大工具。

作者

我的名字是 Jan Bodnar,我是一名热情的程序员,拥有丰富的编程经验。我自 2007 年以来一直在撰写编程文章。迄今为止,我已撰写了 1,400 多篇文章和 8 本电子书。我在编程教学方面拥有十多年的经验。

列出 所有 JS Canvas 教程