如何实现单张图片不同区域独立悬停显示对应人物描述文本

实现方案
不用硬磕area map,对新手最友好的方案是绝对定位热区+CSS悬停,零复杂逻辑,位置好调,提示样式可以完全自定义,不会受原生tooltip的样式限制。
方案1:纯HTML+CSS实现(零JS,新手首选)
核心逻辑非常简单:
- 把照片放在一个设为相对定位的容器里
- 给每个人物对应位置加透明的绝对定位块(也就是热区,大小刚好盖住人物的可悬停范围)
- 人物描述卡片默认隐藏,鼠标移到对应热区时自动弹出,位置、样式、动画都可以自己随便改
直接抄下面的代码改参数就行:
<!-- 外层容器必须加相对定位 --> <div class="photo-wrap" style="position: relative; display: inline-block;"> <!-- 插入你的原图 --> <img src="https://i.sstatic.net/G1uWk.png" alt="团队合照"> <!-- 第一个人物热区,调整top/left/width/height对准对应人物 --> <div class="hot-spot" style="position: absolute; top: 22%; left: 14%; width: 120px; height: 310px;"> <!-- 悬停显示的描述卡 --> <div class="tip-card"> <strong>张三</strong> <p>前端开发,负责交互模块实现</p> </div> </div> <!-- 第二个人物热区,同理调整位置尺寸 --> <div class="hot-spot" style="position: absolute; top: 19%; left: 36%; width: 130px; height: 320px;"> <div class="tip-card"> <strong>李四</strong> <p>产品经理,负责需求梳理对接</p> </div> </div> <!-- 剩下的人物按相同格式加就行 --> </div> <style> /* 提示卡默认隐藏 */ .tip-card { display: none; position: absolute; /* 控制提示卡弹出位置,示例是在人物上方居中 */ bottom: 105%; left: 50%; transform: translateX(-50%); background: #fff; padding: 10px 14px; border-radius: 6px; box-shadow: 0 3px 14px rgba(0,0,0,0.15); width: 160px; z-index: 99; pointer-events: none; /* 避免提示卡挡住热区触发悬停 */ font-size: 14px; } /* 鼠标移到热区时显示对应提示卡 */ .hot-spot:hover .tip-card { display: block; } /* 调试用样式,对准位置后删掉即可 */ .hot-spot { /* border: 1px solid red; 打开这行能看到热区边框,方便对准人物 */ cursor: pointer; } .tip-card p { margin: 4px 0 0; color: #666; } </style>
调位置的时候打开注释的红边框样式,直接改top、left和宽高的数值,等边框刚好框住对应人物再把调试样式删掉就行,不用对着原图算坐标,比area map省事很多。
之前用area map失败的常见原因
如果还是想尝试area map方案,先排查这几个高频坑:
<img>标签必须加usemap属性,属性值要和<map>标签的name值完全对应,比如<img usemap="#teamMap">要匹配<map name="teamMap">coords的坐标是按图片原始像素尺寸算的,只要你给图片加了CSS缩放、响应式适配,坐标就会直接错位,这也是绝大多数人用area map做不对的核心原因- 不要用area自带的
title属性做提示,这个就是原生普通tooltip,样式完全改不了,要自定义效果必须自己绑事件控制div显隐
进阶:不规则轮廓热区
如果想要热区完全贴合人物轮廓,不用矩形块:
- 普通场景直接给热区加
border-radius做圆角,或者用CSS裁剪属性调形状足够用 - 等基础方案做熟了,再了解SVG热区方案就行,逻辑和绝对定位块一致,只是支持自定义任意形状的热区。
内容的提问来源于stack exchange,提问作者Faide Mercer
相关产品推荐
相关产品推荐

