SVG可交互地图核心是将地理区域转为带唯一ID的矢量路径,绑定mouseover/mouseout事件动态显示信息,配合CSS过渡、轮廓高亮、响应式viewBox及无障碍优化实现轻量可控交互。

用SVG做可交互地图,核心在于把地理区域转成矢量路径,再通过事件绑定实现悬停显示信息——不依赖外部地图API,轻量、可控、适配性强。
将行政区划转为SVG路径
国内常用方式是用ECharts地理JSON或geojson.io导出省级/市级边界GeoJSON,再用工具(如MapShaper)简化并导出为SVG。关键点是确保每个<path>有唯一且语义化的id或data-code属性,例如:<path id="beijing" data-name="北京市" d="M...Z">。避免路径重叠或缝隙,否则悬停可能失效。
添加悬停交互与信息展示
用原生JavaScript监听mouseover和mouseout事件,动态更新一个浮动的<div>内容。建议做法:
- 给所有区域
<path>统一加class="region"便于批量绑定 - 浮动提示框用
position: absolute,配合event.clientX / clientY定位,避开遮挡 - 信息内容从
dataset中读取,比如event.target.dataset.name、event.target.dataset.population - 加简单CSS过渡(如
opacity和transform)让出现更自然
增强体验的小技巧
纯SVG交互容易显得单调,几个实用优化:
- 悬停时用
stroke和stroke-width高亮当前区域轮廓 - 点击后可触发跳转或展开详情面板,用
data-url或data-id传参 - 响应式处理:用
viewBox替代固定width/height,配合preserveAspectRatio保证缩放不失真 - 性能注意:区域过多时(如县级单位),考虑用
pointer-events: none关闭非活跃层,或分组<g>管理
兼容性与导出注意事项
现代浏览器对SVG交互支持良好,但需留意:
- IE11及以下不支持
dataset,可用getAttribute('data-name')降级 - 移动端需补充
touchstart事件,并防止误触滚动 - 若需SEO或无障碍访问,可在
<title>标签内写区域名称,屏幕阅读器可读取 - 导出为独立SVG文件时,内联样式比外部CSS更稳妥;如嵌入HTML,
<svg>建议用aria-labelledby关联标题


















