d3.js v4 实现带发光动画效果的蜂巢图表
本文介绍如何使用 d3.js v4 制作支持任意缩放的六边形蜂巢图表。通过结合 d3-hexbin.js 生成几何结构,利用 SVG defs 定义高斯模糊与径向渐变滤镜实现发光背景,并演示如何通过 feBlend 混合模式处理视觉效果。文章涵盖点击交互高亮、模块化管理及动画过渡等核心功能,提供完整的代码实现思路。

d3.js v4 蜂巢图表实现概述
上图展示了最终效果,该图表基于 d3.js v4 开发。核心功能包括在六边形网格中展示数据,并通过底部图标切换实现指定格子的交互高亮。此外,图表支持随浏览器窗口大小进行任意比例的缩放适配。
六边形网格生成与结构
图表主体由正六边形构成,利用 d3-hexbin.js 库可以便捷地生成六边形路径。只需指定中心点坐标与半径参数,即可自动生成对应的几何形状。例如,代码片段展示了如何定义半径及中心点数组来生成六边形数据。
var r = 10;// 六边形半径
var pos = [[5,5],[10,10]]; // 六边形中心点坐标数组
var hexbin = d3.hexbin() // 使用hexbin.hexagon()即可生成路径
.radius(r);
var bins = hexbin(pos); // 得到生成后的六边形中心点坐标数组
SVG 滤镜应用:高斯模糊与渐变
视觉层面,主体采用了高斯模糊滤镜以营造发光质感,背景高亮区域则使用了颜色渐变滤镜。在 SVG 环境中使用滤镜时,必须将相关定义放置在 <defs> 标签内。
高斯模糊滤镜的具体配置如下:
// 创建defs
var defs = svg.append("defs");
// 添加模糊滤镜
var filterBlur = defs.append('filter')
.attr('id', 'filterBlur')
.attr('x', -1.2)
.attr('y', -1.2)
.attr('width', 4)
.attr('height', 4);
// 添加辅助滤镜
filterBlur.append('feOffset')
.attr('result', 'offOut')
.attr('in', 'SourceGraphic')
.attr('dx', 0)
.attr('dy', 0);
// 添加模糊滤镜
filterBlur.append('feGaussianBlur')
.attr('result', 'blurOut')
.attr('in', 'SourceGraphic')
.attr('stdDeviation', 2);
// 添加辅助滤镜
filterBlur.append('feBlend')
.attr('in', 'SourceGraphic')
.attr('in2', 'blurOut')
.attr('mode', 'multiply');
需重点说明的是 feBlend 元素,其作用是将滤镜处理后的效果与原图进行混合。应用滤镜时,只需通过 style 属性为元素添加 'url(#filterId)' 即可生效。
背景高亮部分使用了颜色渐变滤镜,具体配置如下:
// 添加放射性变换,生成空心填充颜色
var warnBg = defs.append("radialGradient")
.attr("id", "bg")
.attr('cx', 0.5)
.attr('cy', 0.5)
.attr('r', 0.5);
// 添加颜色
warnBg.append('stop')
.attr('offset', 0.5)
.attr('style', 'stop-color:rgb(200,200,200);stop-opacity:0.4');
warnBg.append('stop')
.attr('offset', 1)
.attr('style', 'stop-opacity:1;stop-color:rgb(123,123,123)');
上述内容涉及了实现该图表的关键技术点,其余功能部分可直接调用 d3 的通用方法完成。
在开发过程中,建议预先规划程序结构,将主要功能模块封装在独立的函数中,以便于后续调用和维护修改。
欢迎读者就相关技术细节或优化方案进行交流讨论。
总结
以上即为本文的全部内容,希望这些关于 d3.js 图表开发的经验对您的学习或工作有所助益,感谢支持。
JS在setTimeout或Ajax回调中打开新标签页失败怎么处理
2026-11-05 15:50:12
JS直播协议选型:HLS、FLV与WebRTC的延迟与兼容性对比
2026-11-05 12:16:14
JS实现回到顶部:scrollTop赋值与浏览器兼容性处理
2026-11-04 23:43:35
JS使用classList动态添加、移除和切换CSS类名
2026-11-04 23:40:58
在 D3.js 中实现平滑过渡动画的技巧
2026-11-03 23:46:09
