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

使用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; });

关键修改点说明

  1. 新增单元格容器<g>:把每个网格的矩形和图片都放在同一个<g>里,这样transform会同时作用于两者,保证位置完全对齐。
  2. 分离rect和image元素:让它们成为同级元素,符合SVG的规范,图片就能正常被渲染了。
  3. 替换xlink:href为href:适配D3 v4及以上版本的API要求,确保图片地址能被正确识别。
  4. 统一位置属性:给rect和image设置相同的x、y、宽高,让图片正好覆盖在网格矩形上。

额外检查提示

  • 确保图片URL是公开可访问的(你提供的链接已经可以正常访问,这点没问题)。
  • 确认SVG的宽高足够容纳所有元素,你设置的1350px完全能覆盖缩放后的内容。

内容的提问来源于stack exchange,提问作者Adharsh Chottu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 16:32:31