最简提示方案是为area标签添加title属性,鼠标悬停显示纯文本气泡提示,零成本且全兼容,但移动端不支持、不响应lazy加载图片的首次悬停。

area 标签加 title 属性是最简提示方案
HTML 的 <area> 标签本身不支持自定义事件绑定或子内容,但原生支持 title 属性——鼠标悬停时会触发浏览器默认气泡提示,无需 JS 或额外 CSS。
这是唯一零成本、全兼容的方案,适合快速补充说明性文字(如“左上角:主入口”“右侧区域:客服通道”)。
-
title内容必须是纯文本,换行符、HTML 标签、图标都会被忽略 - 移动端(尤其 iOS Safari)基本不响应
area的title,别依赖它传递关键信息 - 如果
<map></map>套在<img>上,且图片设置了loading="lazy",部分浏览器可能延迟加载导致首次悬停无反应
用 JavaScript 绑定 mouseenter 实现自定义提示框
要控制样式、位置、延迟或展示多字段信息(如坐标 + 名称 + 状态),就得用 JS 动态创建提示层,并定位到 area 对应的视觉区域。
难点在于:area 是不可见的坐标逻辑区域,没有 DOM 尺寸和位置,必须手动计算其在图片上的映射矩形。
- 先用
img.getBoundingClientRect()获取图片视口位置 - 再根据
area的coords(如"10,20,100,80")结合图片原始宽高与当前渲染宽高做比例缩放 - 提示层推荐用
position: fixed,避免父容器transform或overflow: hidden把它裁掉 - 务必监听
mouseleave清除提示层,否则快速划过多个area会残留 DOM
data-tip + CSS 伪元素方案不适用于 area
常见教程里用 data-tip 配合 ::before 实现纯 CSS 提示,但这要求触发元素能承载伪元素并支持 :hover——而 <area> 是 void 元素,无法渲染伪元素,:hover 也仅在部分浏览器中生效(Chrome 支持,Firefox 不稳定)。
强行套用会导致:
- CSS 中写的
area:hover::before在多数浏览器下完全不触发 - 即使触发,
position: absolute也无法相对于图片定位,因为area没有盒模型 - 无法读取
coords动态生成位置,只能写死 top/left,适配性极差
替代思路:用透明 overlay div 覆盖图片区域
绕过 area 的限制,直接在图片上方叠一层带坐标映射的透明 <div>,每个可交互区域用绝对定位子元素模拟 <code>area 行为。
这样既能自由绑定事件,又能用 CSS 控制提示样式,还规避了 area 的兼容性黑洞。
- overlay
div设position: absolute,宽高与图片一致,top/left对齐 - 每个热区用
<span class="hotspot" style="left:10%; top:20%; width:15%; height:12%"></span>定义 - 给
.hotspot加data-tip,用 JS 监听mouseenter创建提示层,位置基于getBoundingClientRect()计算 - 需同步维护
img的onload和onresize,重新计算所有.hotspot的百分比尺寸
这个方案看似多一步,但可维护性和跨浏览器稳定性远高于直接操作 <area>。真正上线项目里,几乎没人用原生 <map></map> 做复杂提示。











