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

D3.js V4实现平移缩放功能时Safari中图片无法显示

Safari中D3.js平移缩放功能导致图片无法显示的解决方案

我帮你排查了这个跨浏览器兼容问题,发现主要是两个点导致Safari里图片不显示:一是Safari对SVG <image>元素的href属性兼容性有特殊要求,二是你的SVG层级结构和缩放变换的应用方式在Safari里触发了渲染异常。下面是修复后的完整代码,以及详细的修改说明:

修复后的代码

<div id='canvas'> </div>
<script src="https://d3js.org/d3.v4.min.js"></script>
<script>
let imgHeight = 400, imgWidth = 900, width = 900, height = 450;
let zoom = d3.zoom().scaleExtent([1, 8]).on("zoom", zoomed);

// 调整SVG层级:将缩放监听的g和图片容器g分开
let svg = d3.select("#canvas").append("svg")
  .attr("width", width + "px")
  .attr("height", height + "px")
  .append("g")
  .attr("transform", "translate(0,25)")
  .call(zoom); // 把zoom绑定到外层g

// 图片容器是单独的子g,用于应用缩放变换
let imageContainer = svg.append("g");

imageContainer.append("image")
  .attr("width", imgWidth + "px")
  .attr("height", imgHeight + "px")
  .attr("xlink:href", "https://www.w3schools.com/howto/img_fjords.jpg") // 兼容Safari的xlink:href
  .attr("href", "https://www.w3schools.com/howto/img_fjords.jpg"); // 保留标准href兼容其他浏览器

function zoomed() {
  // 将变换应用到图片容器g上,而非绑定zoom的g
  imageContainer.attr("transform", d3.event.transform);
}
</script>

关键修改点说明

  • 兼容Safari的图片引用方式:Safari对SVG <image>的标准href属性支持不够稳定,添加xlink:href属性可以确保图片在Safari中正常加载,同时保留href属性兼容其他现代浏览器。
  • 调整SVG层级结构:原来的代码把绑定zoom的g和图片容器g合并成了同一个元素,在Safari中这种嵌套会导致变换渲染冲突。现在把zoom绑定到外层g,图片放在单独的子g中,缩放变换只作用于图片容器,避免了渲染异常。

修改后在Safari中运行,图片就能正常显示,同时平移缩放功能也能正常工作啦~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:28:59