You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在JavaScript Canvas中为strokeStyle添加渐变?代码失效求助

解决Canvas strokeStyle渐变失效的问题

嘿,我懂你遇到的麻烦——原来的纯色描边好好的,一换成渐变就直接罢工,这大概率是因为你没正确创建Canvas的渐变对象,反而想用CSS渐变那套字符串写法对吧?别慌,咱们一步步把这个问题搞定!

问题根源

Canvas 的 strokeStyle 不支持直接传入CSS渐变字符串,必须通过画布上下文的 createLinearGradient() 或 createRadialGradient() 方法创建渐变对象,再把这个对象赋值给 strokeStyle 才行。另外,渐变的坐标还得和你的圆形进度条匹配,不然渐变效果会跑偏到离谱。

修改后的完整代码

我帮你调整了 render() 函数,用径向渐变适配你的圆形进度条(要是喜欢线性渐变也能直接换,看你需求):

HTML(保持不变)

<div class="countItem minutes">
 <canvas id="minutes-canvas" width="200" height="200"></canvas>
 <svg width="100%" height="100%">
 <circle id="outer" cx="50%" cy="50%" r="45%" fill="transparent" stroke-width="1%" stroke="#fff" />
 </svg>
 <h3>
 <span id="minutes-value"></span><br>
 <small>minutes</small>
 </h3>
 </div>

JavaScript(核心修改render函数)

// Set Launch Date (ms)
const launchDate = new Date("May 7, 2020 00:00").getTime();
// Context object
const c = { context: {}, values: {}, times: {} };
// Convert radians to degrees
function deg(d) {
 return (Math.PI / 180) * d - (Math.PI / 180) * 90;
}
function render() {
 c.context.minutes.clearRect(0, 0, 200, 200);
 c.context.minutes.beginPath();

 // 关键步骤:创建径向渐变对象
 // 参数说明:渐变起始中心(x,y)、起始半径,渐变结束中心(x,y)、结束半径
 const gradient = c.context.minutes.createRadialGradient(100, 100, 0, 100, 100, 90);
 // 添加颜色停止点(位置0到1,对应渐变从内到外的过渡)
 gradient.addColorStop(0, "#bbee2b"); // 圆心位置的颜色
 gradient.addColorStop(1, "#66aa00"); // 圆弧边缘的颜色

 // 把创建好的渐变对象赋值给strokeStyle
 c.context.minutes.strokeStyle = gradient;

 c.context.minutes.arc(100, 100, 90, deg(0), deg(6 * (c.times.minutes - 60)));
 c.context.minutes.lineWidth = 12;
 c.context.minutes.lineCap = "round";
 c.context.minutes.stroke();
}
function init() {
 // Get 2D contexts
 c.context.minutes = document.getElementById('minutes-canvas').getContext('2d');
 // Get displayed values
 c.values.minutes = document.getElementById('minutes-value');
 setInterval(function () {
 // Get todays date and time (ms)
 const now = new Date().getTime();
 // Get distance from now to launchDate
 const distance = launchDate - now;
 // Time calculations
 c.times.minutes = Math.floor((distance % (1000 * 60 * 60)) / (1000 * 60));
 c.values.minutes.innerText = c.times.minutes;
 render(); // Draw!
 }, 1000);
}
init();

额外小提示

  • 如果想要线性渐变,就用 createLinearGradient(x1,y1,x2,y2),比如做一个从左到右的渐变:createLinearGradient(10,100,190,100)
  • 颜色停止点可以加多个,比如 gradient.addColorStop(0.5, "#99dd11"),就能实现中间过渡色的效果
  • 要确保渐变的结束半径和你 arc() 方法里的半径(这里是90)一致,这样渐变刚好能覆盖整个描边

内容的提问来源于stack exchange,提问作者Dlamini.M

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 08:52:28