一張圖片包含多個郵箱圖標,鼠標懸停不同圖標時,顯示對應郵箱名稱的提示框。
<img src="email-icons.png" usemap="#emailMap" alt="郵箱圖標" style="border: none;">
<map name="emailMap">
<!-- 矩形區域:左上 (x1,y1) 右下 (x2,y2) -->
<area shape="rect" coords="10,10,50,50" title="QQ郵箱" href="javascript:;" alt="QQ郵箱">
<area shape="rect" coords="60,10,100,50" title="163郵箱" href="javascript:;" alt="163郵箱">
<area shape="rect" coords="110,10,150,50" title="Gmail" href="javascript:;" alt="Gmail">
<
<area shape="circle" coords="200,30,20" title="Outlook" href="javascript:;" alt="Outlook">
<!-- 多邊形區域:頂點坐標序列 -->
<area shape="poly" coords="250,10,290,30,250,50" title="自定義形狀" href="javascript:;" alt="自定義">
</map>
| shape | coords 格式 | 說明 |
|---|---|---|
| rect | x1,y1,x2,y2 | 左上角 (x1,y1),右下角 (x2,y2) |
| circle | x,y,r | 圓心 (x,y),半徑 r |
| poly | x1,y1,x2,y2,...,xn,yn | 多邊形頂點坐標序列 |
| default | (無) | 整張圖片剩餘區域 |
<div style="position: relative; width: 300px; height: 100px;">
<img src="email-icons.png" style="width: 100%; height: 100%;">
<a href="javascript:;" title="QQ郵箱"
style="position: absolute; left: 10px; top: 10px; width: 40px; height: 40px; z-index: 1;"></a>
<a href="javascript:;" title="163郵箱"
style="position: absolute; left: 60px; top: 10px; width: 40px; height: 40px; z-index: 1;"></a>
<a href="javascript:;" title="Gmail"
style="position: absolute; left: 110px; top: 10px; width: 40px; height: 40px; z-index: 1;"></a>
</div>
❌ 缺點:需手動計算絕對位置、響應式適配困難、語義不如 map/area 清晰。
<div class="hotspot-container">
<img src="email-icons.png" usemap="#emailMap">
<map name="emailMap">
<area shape="rect" coords="10,10,50,50" data-title="QQ郵箱">
<area shape="rect" coords="60,10,100,50" data-title="163郵箱">
</map>
</div>
<style>
.tooltip {
position: absolute;
background: #333;
color: white;
padding: 5px 10px;
border-radius: 4px;
font-size: 12px;
pointer-events: none;
z-index: 9999;
white-space: nowrap;
}
</style>
<script>
document.querySelectorAll('area[data-title]').forEach(area => {
let tooltip;
area.addEventListener('mouseenter', (e) => {
tooltip = document.createElement('div');
tooltip.className = 'tooltip';
tooltip.textContent = area.dataset.title;
document.body.appendChild(tooltip);
// 定位到滑鼠位置
tooltip.style.left = (e.clientX + 10) + 'px';
tooltip.style.top = (e.clientY + 10) + 'px';
});
area.addEventListener('mousemove', (e) => {
if (tooltip) {
tooltip.style.left = (e.clientX + 10) + 'px';
tooltip.style.top = (e.clientY + 10) + 'px';
}
});
area.addEventListener('mouseleave', () => {
if (tooltip) tooltip.remove();
});
});
</script>
area 必須有 alt 屬性(屏幕閱讀器讀取)title 為鼠標懸停提示,alt 為無障礙文本,**兩者兼備**href="javascript:;" 使 area 可聚焦鍵盤訪問| 方案 | 優點 | 缺點 | 推薦指數 |
|---|---|---|---|
<map>+<area> | 原生、無 JS、語義化、無障礙、響應式友好 | 坐標需手動測量、樣式不可自定義 | ⭐⭐⭐⭐⭐ |
| 定位 <a> | 可包裹任意內容 | 位置固定、維護難、語義差 | ⭐⭐ |
| JS Tooltip | 樣式完全可控、支持動畫/富文本 | 需 JS、需處理邊界/滾動定位 | ⭐⭐⭐⭐ |
**最佳實踐**:基礎功能用 <map><area>,需求複雜(富文本、動畫、跟隨鼠標)再疊加 JS Tooltip 增強。