usemap 属性值必须以 # 开头,如 usemap="#floor1",对应 map 的 name 值为 floor1(不带#),且大小写敏感;map 与 img 需同文档或同域 iframe 内,area 的 shape 与 coords 必须严格匹配坐标规则。

usemap 属性值必须以 # 开头,否则 map 不生效
浏览器只认 usemap="#mapname" 这种写法,usemap="mapname" 或 usemap="mapname.jpg" 都会静默失败。这是最常被忽略的语法点——<img> 的 usemap 是 ID 引用,不是名字匹配。
对应地,<map></map> 的 name 属性值本身**不带 #**,但它的值要和 usemap 中 # 后面的部分完全一致(大小写敏感):
@@##@@ <map name="floor1"><area shape="rect" coords="10,10,100,50" href="kitchen.html"></map>
map 和 img 必须在同一个页面或同域 iframe 内才能关联
<map></map> 不能跨文档引用。比如把 <map></map> 放在外部 HTML 文件里、再通过 <iframe></iframe> 加载,或者用 fetch 插入 DOM 但没等 img 渲染完成就挂载,都会导致热区不可点击。
- 确保
<map></map>在<img src="plan.png" usemap="#floor1">所在的 HTML 文档中,位置不限(可前可后) - 若用 JS 动态插入
<map></map>,需确认它已加入 document.body(或至少是 img 的祖先容器),且name值拼写无误 - 不要指望 CSS
display: none或visibility: hidden隐藏<map></map>会影响功能——它本就不渲染,隐藏与否无关
area 的 shape 和 coords 必须匹配,否则热区偏移或失效
shape 决定坐标解析逻辑:rect 要 4 个值(左、上、右、下),circle 要 3 个(圆心 x、y、半径),poly 要偶数个(x,y 交替)。少一个、多一个、顺序错,浏览器会跳过该 <area>,控制台一般也不报错。
常见陷阱:
-
coords值之间只能用英文逗号分隔,不能有空格("10,20,100,50"✅,"10, 20, 100, 50"❌) - 坐标系原点是图片左上角,单位是像素;如果 img 用 CSS 缩放(如
width: 100%; height: auto),<area>仍按原始尺寸计算,热区会错位 - 移动端高 DPR 屏幕下,若图片是 @2x 切图但未设
srcset或width/height属性,<area>坐标可能对不上
现代替代方案:CSS + JavaScript 更可控,但 map 仍有存在价值
<map></map> 的优势在于零 JS、SEO 友好、天然支持 href 和 alt,适合静态图文导航(如楼层平面图、产品结构分解图)。但它不支持 hover 样式、无法监听 click 外事件、响应式适配麻烦。
如果需要交互增强,推荐组合方案:
- 保留
<map></map>作为基础语义层和降级路径 - 用 JS 读取
document.querySelectorAll('area[href]'),绑定click并 preventDefault,再执行自定义逻辑 - 用
getBoundingClientRect()+ 图片原始宽高比动态换算 coords,应对缩放
别为了“不用 JS”硬扛复杂交互——<map></map> 是工具,不是教条。真正容易被忽略的是:当设计稿给的是“相对坐标”(比如“按钮占图宽 20%”),你得自己转成绝对像素并同步更新 coords,这个过程没法自动化。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











