area标签必须嵌套在具有name属性的map元素内,usemap值需以#开头并与map的name一致;shape支持rect、circle、poly,coords基于原始图片像素且缩放后失效,推荐用JS动态归一化或改用SVG。

area 标签必须嵌套在 map 内部,且 map 必须有 name 属性
浏览器只认 <map> 的 name,不认 id;<area> 本身不能独立生效,必须放在 <map name="xxx"> 里。常见错误是把 <area> 直接丢在 body 里,或者忘了写 name,结果点击毫无反应。
实操建议:
立即学习“前端免费学习笔记(深入)”;
-
<img>的usemap属性值必须以#开头,且与<map>的name完全一致(大小写敏感),例如:<img usemap="#historical-map">对应<map name="historical-map"> -
<area>的shape可选rect、circle、poly;历史地图常用poly描边行政区,坐标用像素点序列,如coords="10,20,30,40,50,60" - 坐标系原点在图片左上角,单位是像素——这意味着图片缩放后坐标会失效,必须用原始尺寸或配合 JS 动态计算
点击 area 触发 JS 事件时,event.target 是 area 元素本身
很多人误以为点击后要靠 event.target 判断是否点中某区域,其实 <area> 支持原生 onclick,但更推荐用事件委托绑定到 <map> 上,避免大量重复监听。
实操建议:
立即学习“前端免费学习笔记(深入)”;
- 直接给
<area>加onclick可行,但不利于维护;推荐用document.querySelector('map').addEventListener('click', handler) - 在 handler 中用
event.target获取被点击的<area>,再读取它的自定义属性,比如:event.target.dataset.province = "shandong" - 注意:
<area>不触发mouseover/mouseout(部分浏览器支持,但不可靠),交互反馈建议用 CSS:hover配合透明图层或 JS 模拟
历史地图图片缩放后 coords 失效,必须用 JS 做坐标归一化
原始图片宽高为 1200×800,你把它设成 width="600" 显示,所有 coords 值就得除以 2——但用户可能缩放窗口、切换设备,硬编码比例根本不可行。
实操建议:
立即学习“前端免费学习笔记(深入)”;
- 保留原始图片真实尺寸(不设 width/height),用 CSS
max-width: 100%控制显示,再通过img.naturalWidth和img.naturalHeight获取原始分辨率 - 监听
window.resize和img.onload,动态重算每个<area>的coords值:用当前显示宽高比除以原始宽高比,做线性缩放 - 更稳妥的做法是放弃
coords,改用 SVG 替代<map>+<area>——SVG path 可缩放、可绑定事件、支持 transform,对历史地图更友好
IE 和旧版 Edge 不支持 area 的 dataset 属性,兼容需降级处理
如果你的用户仍需支持 IE11,area.dataset.xxx 会返回 undefined,因为 IE 不识别 data- 前缀属性。
实操建议:
立即学习“前端免费学习笔记(深入)”;
- 用
getAttribute('data-xxx')替代dataset.xxx,这是全浏览器安全的写法 - 避免用
area.id当标识符——id 在 HTML 中必须唯一,而历史地图常有多个“长安”(不同朝代),用data-era+data-name组合更可靠 - area 的
alt属性不是无障碍必需项,但 screen reader 会读它;建议填简明地理名称,如alt="唐代河西道",别写“点击查看详情”这类无意义文案
真正麻烦的不是怎么画区域,而是坐标随视口变化时如何保持精准——多数人卡在这一步,最后改成 SVG 或 Canvas 才跑通。



















