You need to enable JavaScript to run this app. 如何使用D3.js为Apple Rings环形图超出100%的末端边缘添加阴影
优惠活动
大模型
产品
解决方案
定价
更多

如何使用D3.js为Apple Rings环形图超出100%的末端边缘添加阴影

提问内容

我已实现了Apple Rings相关的JS效果:
Apple Rings实现效果图
我希望当环形数值超过100%时,在圆环的末端显示阴影效果,示例参数如下:
{index: 2, name: 'stand', icon: "\uF106", percentage: 120}
效果参考图如下:
超过100%带阴影的效果参考图
请问需要修改D3.js代码的哪些部分可以实现上述需求?


解答

需要修改的D3.js代码核心部分如下:

  • 新增阈值判断逻辑
    在原有渲染单个进度环的函数开头加判断,仅当percentage > 100时才执行阴影渲染逻辑,避免非超量的环出现多余样式。
  • 预定义SVG高斯模糊滤镜
    在SVG根节点初始化完成后,新增全局模糊滤镜供后续超量环复用:
const defs = svg.append('defs')
defs.append('filter')
  .attr('id', 'ring-end-shadow')
  .attr('x', '-50%').attr('y', '-50%')
  .attr('width', '200%').attr('height', '200%')
  .append('feGaussianBlur')
  .attr('stdDeviation', 3) // 模糊程度可自行调整
  • 计算超量时环末端的坐标
    复用你原有代码里的d3.arc生成器,直接获取100%位置的中心点坐标:
// 100%对应的结束角度按你自己的映射规则调整,通常为2*Math.PI
const fullAngle = 2 * Math.PI 
const endPoint = d3.arc()
  .innerRadius(你原有代码的内环半径值)
  .outerRadius(你原有代码的外环半径值)
  .startAngle(fullAngle)
  .endAngle(fullAngle)
  .centroid() // 直接返回[x,y]坐标数组
  • 渲染末端阴影
    判断到百分比超过100时,在对应坐标位置绘制和当前环同色的阴影圆,应用预定义的滤镜即可:
if (当前环的percentage > 100) {
  svg.append('circle')
    .attr('cx', endPoint[0])
    .attr('cy', endPoint[1])
    .attr('r', (外环半径 - 内环半径)/2) // 和环的厚度匹配
    .attr('fill', 当前环的主题色)
    .attr('opacity', 0.6) // 透明度可自行调整
    .attr('filter', 'url(#ring-end-shadow)')
}

如果想要效果更自然,还可以把阴影的模糊半径、透明度和超过程度做绑定,比如超20%模糊度设为3,超50%模糊度设为5,会更贴合设计效果。


内容的提问来源于stack exchange,提问作者Satish Saini

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 20:54:02