使用D3.js根据数据对象在网格中嵌入图片不显示的问题求助
解决D3.js网格中图片无法显示的问题
嘿,我来帮你搞定这个图片不显示的问题!你的代码里有几个关键小问题导致图片虽然被渲染了但看不到,咱们一步步来修正:
问题根源分析
- SVG rect不能包含子元素:你把
<image>直接追加到<rect>里面了,但SVG的基本图形元素(比如rect、circle)是不能容纳其他元素的,所以图片元素虽然存在DOM里,但根本不会被浏览器渲染出来。 - D3 v4的API变化:你用了
xlink:href来指定图片地址,但D3 v4开始已经不再推荐这个写法,直接用href属性即可,旧写法可能导致部分浏览器识别失败。 - Transform作用范围不对:你只给rect加了变换,但图片没有继承这个位置调整,就算图片能显示,位置也会完全错位。
修改后的完整代码
var data = [ [{ "x": 1, "y": 1, "width": 400, "height": 400, "image": "https://lh3.googleusercontent.com/wAPeTvxh_EwOisF8kMR2L2eOrIOzjfA5AjE28W5asyfGeH85glwrO6zyqL71dCC26R63chADTO7DLOjnqRoXXOAB8t2f4C3QnU6o0BA" }, { "x": 401, "y": 1, "width": 400, "height": 400, "image": "https://lh3.googleusercontent.com/Skyrdo9OUfXzZ-1N-jdhGbmpkx6G7r9QYfA3p6EKhb0u9ES4cZD9Z9C92BxM3A9VyLgHJHB7ALTPOlIfJxVLrpzYrLzPIUZsQX9mD4U" }], [{ "x": 1, "y": 401, "width": 400, "height": 400, "image": "https://lh3.googleusercontent.com/0cDOOJjp8pUGDDFLqHFITEi35uMGZ5wHpZ9KTKridxk71kpR9MfeydpQqG5n8Mvetvkg5iVuZGeL2xMvxgBY_UL-T9p0x_Eo4EAh" }, { "x": 401, "y": 401, "width": 400, "height": 400, "image": "https://lh3.googleusercontent.com/IsGCHOz6W_CthCyx28PlKaZSzTHMY-nzZVBu0UUKTkhfD52WmJ-xvOIverssPjgBAGeSIBGwbP2qt7OJ-HpI7t-mToRc_xSFhCDv" }] ] var grid = d3 .select("#grid") .append("svg") .attr("width", "1350px") .attr("height", "1350px"); // 创建行容器 var row = grid .selectAll(".row") .data(data) .enter() .append("g") .attr("class", "row"); // 为每个网格单元创建独立的g容器,用来包裹矩形和图片 var cell = row .selectAll(".cell") .data(function(d) { return d; }) .enter() .append("g") .attr("class", "cell") .attr("transform", "translate(50,50)scale(0.5)"); // 把变换应用到整个单元格 // 绘制网格背景矩形 cell.append("rect") .attr("x", function(d) { return d.x; }) .attr("y", function(d) { return d.y; }) .attr("width", function(d) { return d.width; }) .attr("height", function(d) { return d.height; }) .style("fill", "#fff") .style("stroke", "#222"); // 添加图片到单元格容器 cell.append("svg:image") .attr("href", function(d) { return d.image; }) // 适配D3 v4的属性写法 .attr("x", function(d) { return d.x; }) .attr("y", function(d) { return d.y; }) .attr("width", function(d) { return d.width; }) .attr("height", function(d) { return d.height; });
关键修改点说明
- 新增单元格容器
<g>:把每个网格的矩形和图片都放在同一个<g>里,这样transform会同时作用于两者,保证位置完全对齐。 - 分离rect和image元素:让它们成为同级元素,符合SVG的规范,图片就能正常被渲染了。
- 替换
xlink:href为href:适配D3 v4及以上版本的API要求,确保图片地址能被正确识别。 - 统一位置属性:给rect和image设置相同的x、y、宽高,让图片正好覆盖在网格矩形上。
额外检查提示
- 确保图片URL是公开可访问的(你提供的链接已经可以正常访问,这点没问题)。
- 确认SVG的宽高足够容纳所有元素,你设置的1350px完全能覆盖缩放后的内容。
内容的提问来源于stack exchange,提问作者Adharsh Chottu
相关产品推荐
相关产品推荐

