usemap与map name必须严格字符串匹配,否则coords静默失效;coords格式须符合shape规则且基于原始尺寸;area需含href/nohref、alt及移动端适配;长期项目推荐SVG。

usemap 和 map name 不匹配导致 coords 完全不生效
浏览器对 usemap 和 <map name></map> 的匹配是严格字符串比对,漏掉 https://www.php.cn/link/93ac0c50dd620dc7b88e5fe05c70e15b、大小写错一位、多一个空格,整个 <area> 就静默失效——控制台不报错,点击无响应,coords 看起来“还在”,但实际没绑定。
实操建议:
- 统一用小写字母 + 连字符命名,例如:
usemap="https://www.php.cn/link/93ac0c50dd620dc7b88e5fe05c70e15bproduct-diagram"对应<map name="product-diagram"></map> - 把
<map></map>紧跟在<img alt="HTML中area标签坐标丢失时的修复步骤" >后面,避免被<picture></picture>、<figure></figure>或 Shadow DOM 隔离 - 用 Chrome DevTools 检查:右键图片 → “检查”,看 computed 属性中是否出现
usemap指向的 map 引用;若没出现,说明关联断了
coords 值格式错误或与 shape 不匹配
coords 是纯字符串,浏览器只按逗号切分、转数字,不校验逻辑。写错一位、多一个空格、数量不对,区域就偏移、缩成点,甚至彻底消失。
常见错误现象:
立即学习“前端免费学习笔记(深入)”;
-
shape="rect"却写了 6 个数:coords="10,20,100,80,150,120"→ 浏览器只取前 4 位,后两位丢弃 -
shape="poly"写了奇数个值,比如coords="10,20,30,40,50"→ Safari 直接忽略该<area> - 坐标里混入空格:
coords="100, 200"→ 第二个值被截为"200",后面全丢
必须严格遵循:
-
rect:4 个整数,x1,y1,x2,y2,且满足x1 < x2且y1 < y2 -
circle:3 个整数,cx,cy,r,r > 0 -
poly:至少 6 个整数(3 对),x1,y1,x2,y2,x3,y3,首尾自动闭合
图片缩放后 coords 坐标漂移
coords 永远基于图片原始尺寸(naturalWidth/naturalHeight)计算,和 offsetWidth、width: 100%、max-width 无关。只要图片被 CSS 缩放,热区就必然偏移——这不是 bug,是规范行为。
临时补救(仅限简单缩放场景):
- 监听
img.onload和window.resize - 算出缩放比:
scaleX = img.naturalWidth / img.offsetWidth,scaleY = img.naturalHeight / img.offsetHeight - 对每个
<area>的coords字符串做正则解析,按shape类型分别缩放:-
rect:4 个数都乘对应方向缩放比 -
circle:前两个坐标乘对应缩放比,半径乘Math.min(scaleX, scaleY) -
poly:所有偶数位(x)乘scaleX,奇数位(y)乘scaleY
-
注意:transform: scale() 和 object-fit 不会触发重映射,不能修正 coords。
area 标签缺失必要属性导致坐标“不可见”
<area> 是空元素,但不是“随便写就能用”。它必须嵌套在 <map></map> 内,且必须带 href 或 nohref,否则屏幕阅读器跳过、部分旧浏览器不触发事件,coords 形同虚设。
实操要点:
-
href必须是有效 URL,href="https://www.php.cn/link/93ac0c50dd620dc7b88e5fe05c70e15b"或空字符串会失效;锚点跳转请用href="./page.htmlhttps://www.php.cn/link/93ac0c50dd620dc7b88e5fe05c70e15bsection" -
alt不可省略,且不能是“点击此处”这类空泛文案;要描述功能,如alt="查看左侧发动机参数" - 移动端需加
tabindex="0"并监听touchstart,否则小面积poly区域可能被 iOS Safari 忽略 - 别在
<img alt="HTML中area标签坐标丢失时的修复步骤" >或父容器上设pointer-events: none,它会直接屏蔽所有<area>
真正需要长期维护、适配多端、频繁更新热区的项目,<svg></svg> 是目前最稳的选择——它天然支持百分比坐标、缩放重映射、无障碍属性,且不用 JS 补偿。但如果你已在线上跑着几十个 <area>,先从检查 usemap 和 name 是否逐字节一致开始,90% 的“坐标丢失”其实根本没走到 coords 解析那步。



















