D3.js同缩放级别下地图右侧缩放异常无法平移问题求助
问题原因
核心是d3.zoom的translateExtent边界配置错误,触发了d3的自动边界校正逻辑:
- 你当前硬编码的
translateExtent([[0,0],[10000000,8200000]])没有和实际地图尺寸、SVG视口尺寸做适配,d3计算缩放后的允许平移范围时逻辑出错 - 在右侧区域缩放时,d3判定当前transform值超出了你设置的边界,会自动修正transform,就出现了自动向右偏移的现象,修正后的值已经触碰到了边界限制,自然无法再继续平移
- 左侧区域缩放时transform不会触碰你设置的右边界,所以功能完全正常
解决方法
- 第一步:先注释掉
translateExtent配置做验证,确认问题来源
临时去掉边界限制测试,如果异常消失就可以确定是边界配置导致的问题:
const zoom = d3.zoom() // 先注释此行测试 // .translateExtent([[0,0],[10000000,8200000]]) .scaleExtent([1, 10]) .on("zoom", zoomed)
- 第二步:根据实际尺寸重新计算正确的边界
首先给id为map的SVG元素设置明确的宽高属性,或者先获取它的实际渲染尺寸,再获取内部地图容器的原始尺寸,再配置translateExtent:
mounted(){ var svg = d3.select("#map") // 获取SVG视口实际尺寸 const { width: svgWidth, height: svgHeight } = svg.node().getBoundingClientRect() // 获取地图容器原始宽高 const mapBBox = svg.select("#wrap").node().getBBox() const [mapWidth, mapHeight] = [mapBBox.width, mapBBox.height] const zoom = d3.zoom() // 用实际地图尺寸配置边界,d3会自动根据缩放系数调整允许的平移范围 .translateExtent([[0,0],[mapWidth, mapHeight]]) .scaleExtent([1, 10]) .on("zoom", zoomed) svg.call(zoom) function zoomed({transform}){ svg.select("#wrap").attr("transform", transform) } }
- 额外注意:如果你的SVG设置了
viewBox属性,需要保证坐标体系和d3.zoom的逻辑匹配,或者暂时移除viewBox用固定宽高,避免坐标计算冲突。
内容的提问来源于stack exchange,提问作者Hyacinth
相关产品推荐
相关产品推荐

