<map>+<area> 是原生热区方案,但 usemap="#name" 与 <map name="name"> 必须严格一致(含#、大小写、符号),coords 基于 naturalWidth/Height,缩放需 JS 重算或改用绝对定位+按钮方案。

<map> + <area> 是最直接的原生方案,但“快速”不等于“随便写完就跑”,漏掉 #、坐标没按原始尺寸量、图片一缩放就偏移——这些都会让热区完全失效,且浏览器不报错。
usemap="#name" 和 <map name="name"> 必须严格配对
这是所有失效问题里占比最高的硬性规则。不是“差不多就行”,是大小写、下划线、连字符、# 符号全都要一致。
-
<img usemap="#navmap">必须对应<map name="navmap">,写成usemap="navmap"(漏#)或<map name="NavMap">(大小写错)都静默失败 - 鼠标悬停不会变手型,点击无反应,开发者工具里也看不出异常——只能靠人工核对
- 建议命名全小写+中划线,比如
usemap="#product-banner-map",避免大小写混淆
coords 坐标必须基于图片原始像素尺寸
不是你用 width: 100% 渲染出来的尺寸,而是图片文件本身的 naturalWidth / naturalHeight。缩放后坐标不会自动换算。
使用 PptxGenJS 和 Python 解析,将结构化的 HTML/CSS 幻灯片内容转换为原生、可编辑的 PowerPoint(.pptx)演示文稿。
- 横幅图切了 1920×480,但 CSS 设了
max-width: 100vw,在手机上只渲染 375×94 —— 此时coords="100,50,200,100"会严重右偏、下偏 - 修复方法只有两种:固定图片渲染尺寸(如设
width: 1920px; height: auto并配合媒体查询),或彻底放弃<map>改用绝对定位热区 - 如果非要用 JS 动态换算,得先获取
img.naturalWidth和img.clientWidth,再对每个coords数值乘以缩放比——仅适用于rect或circle,poly顶点太多容易出错
响应式场景下更推荐绝对定位 + 语义化按钮
当图片要随视口变化、或需支持键盘导航和屏幕阅读器时,<map> 天然不满足要求。此时用容器 + position: absolute 更可控、更可维护。
立即学习“前端免费学习笔记(深入)”;
- 把图片设为父容器的
background-image,并确保background-size: 100% 100%(禁用cover) - 每个热区用
<button type="button" data-hotspot="donut"></button>,设position: absolute+ 百分比定位(如top: 32.5%; left: 68.2%) - 必须加
min-width: 48px; min-height: 48px,仅靠padding或字体撑尺寸不可靠 - 事件统一走容器委托:
container.addEventListener('click', e => { if (e.target.matches('[data-hotspot]')) { ... } })
真正难的不是画出区域,而是让区域在不同设备、不同缩放、不同交互方式(鼠标/触屏/键盘)下都稳定生效。原生 <map> 只适合静态、定宽、无障碍要求低的简单场景;一旦涉及响应式或可访问性,就得切换思路——这不是退而求其次,而是技术约束下的合理选择。


















