JA EN

HTML イメージマップの作り方と代替手段 - クリッカブルマップの実装ガイド

· 約 9 分で読めます

HTML イメージマップの基本 - map 要素と area 要素の構造

HTML イメージマップは、1 枚の画像内に複数のクリック可能な領域を定義する技術です。<map> 要素と <area> 要素を組み合わせ、画像の特定座標にリンクやアクションを割り当てます。地図、フロアプラン、解剖図、組織図など、画像の部分ごとに異なる情報を提供したい場面で使用されてきました。

基本構造:

<img src="office-map.png" usemap="#officemap" alt="オフィスフロアマップ">
<map name="officemap">
<area shape="rect" coords="0,0,200,150" href="/meeting-room-a" alt="会議室 A">
<area shape="circle" coords="300,100,50" href="/lounge" alt="ラウンジ">
<area shape="poly" coords="400,0,500,50,450,150" href="/reception" alt="受付">
</map>

shape 属性の種類:

usemap 属性の値は # に続けて <map>name 属性値を指定します。座標はすべてピクセル単位で、画像の左上を原点 (0,0) とします。

イメージマップの座標設計 - ツールを使った効率的な領域定義

イメージマップの座標を手動で計算するのは非効率です。専用ツールを使えば、画像上でクリックするだけで正確な座標を生成できます。

オンラインツール:

座標設計のベストプラクティス:

デバッグ方法: 開発中は CSS で area 要素の領域を可視化できませんが、JavaScript で area 要素の coords を読み取り、Canvas にオーバーレイ描画することで視覚的に確認できます。また、ブラウザの開発者ツールで area 要素にホバーすると、対応する領域がハイライトされます。

レスポンシブ対応の課題 - イメージマップの最大の弱点

HTML イメージマップの最大の問題は、座標がピクセル単位の絶対値であるため、画像サイズが変わると領域がずれることです。レスポンシブデザインが標準となった現代の Web では、この制約は致命的です。

問題の具体例: 元画像が 800 × 600 ピクセルで、coords="200,150,400,300" と定義した矩形領域があるとします。画面幅に応じて画像が 400 × 300 ピクセルに縮小表示された場合、座標はそのまま 200,150,400,300 のため、クリック領域が画像の右下にはみ出してしまいます。

JavaScript による動的座標変換:

function resizeImageMap() {
const img = document.querySelector('img[usemap]');
const naturalWidth = img.naturalWidth;
const displayWidth = img.clientWidth;
const scale = displayWidth / naturalWidth;
const areas = document.querySelectorAll('area');
areas.forEach(area => {
const original = area.dataset.originalCoords.split(',');
const scaled = original.map(c => Math.round(c * scale));
area.coords = scaled.join(',');
});
}

この方法では、元の座標を data-original-coords 属性に保存し、画像のリサイズ時にスケール比率を計算して座標を再設定します。ResizeObserver で画像サイズの変化を監視し、変化があるたびに再計算を実行します。

ライブラリの活用: image-map-resizer (jQuery プラグイン) や RWD-Image-Maps が座標の自動リサイズを提供しますが、いずれもメンテナンスが停滞しています。新規プロジェクトでは後述の SVG ベースの代替手段を推奨します。

SVG によるモダンな代替実装 - レスポンシブかつインタラクティブ

SVG (Scalable Vector Graphics) を使えば、イメージマップの機能をレスポンシブかつアクセシブルに実現できます。SVG はベクターベースのため、どのサイズでも座標が正確に維持されます。

SVG オーバーレイ方式:

<div class="map-container" style="position: relative;">
<img src="floor-plan.jpg" alt="フロアプラン">
<svg viewBox="0 0 800 600" style="position: absolute; inset: 0; width: 100%; height: 100%;">
<a href="/room-a">
<rect x="50" y="30" width="200" height="150" fill="transparent" class="hotspot">
<title>会議室 A</title>
</rect>
</a>
<a href="/lounge">
<circle cx="500" cy="300" r="60" fill="transparent" class="hotspot">
<title>ラウンジ</title>
</circle>
</a>
</svg>
</div>

SVG 方式の利点:

ホバーエフェクトの CSS:

.hotspot { transition: fill 0.2s, opacity 0.2s; cursor: pointer; }
.hotspot:hover { fill: rgba(59, 130, 246, 0.3); }
.hotspot:focus { outline: 2px solid #3b82f6; outline-offset: 2px; }

CSS Grid と Flexbox による代替 - 画像を分割する手法

画像を物理的に分割し、CSS Grid や Flexbox でタイル状に配置する方法も、イメージマップの代替として有効です。特に矩形領域のみで構成される場合に適しています。

CSS Grid による実装:

<div class="image-grid">
<a href="/section-1" class="grid-cell" style="grid-area: 1/1/2/3;">
<span class="sr-only">セクション 1</span>
</a>
<a href="/section-2" class="grid-cell" style="grid-area: 1/3/3/4;">
<span class="sr-only">セクション 2</span>
</a>
</div>

.image-grid に背景画像を設定し、グリッドセルを透明なリンク要素として配置します。各セルの grid-area で領域を定義するため、レスポンシブ対応は CSS Grid が自動的に処理します。

画像スライス方式: 画像を複数のタイルに分割し、それぞれを個別の <img> または <a> 要素として配置する方法です。Photoshop のスライス機能や Sharp の extract() メソッドで画像を分割できます。この方式は HTTP/2 環境では複数リクエストのオーバーヘッドが小さいため実用的です。

CSS clip-path による不規則形状: 矩形以外の形状が必要な場合、clip-path: polygon() で各リンク要素の表示領域を不規則な形に切り抜けます。パーセンテージ指定が可能なため、レスポンシブ対応も容易です。ただし、隣接する領域の境界が正確に一致するよう座標を慎重に設計する必要があります。

アクセシビリティとユースケース別の最適解 - 技術選定の判断基準

イメージマップの実装方法を選択する際は、アクセシビリティ要件とユースケースに基づいて判断します。どの技術にも長所と短所があり、万能な解決策はありません。

アクセシビリティ要件:

ユースケース別の推奨技術:

パフォーマンス比較: HTML イメージマップは DOM 要素数が少なく最も軽量です。SVG オーバーレイは中程度。CSS Grid 方式は領域数が多い場合に DOM ノードが増加しますが、通常の使用範囲 (50 領域以下) ではパフォーマンス差は無視できます。

関連記事

画像のアクセシビリティ - alt テキストの書き方とコントラスト比の基準

Web アクセシビリティにおける画像の適切な取り扱いを、alt テキストの記述ルール、装飾画像の処理、コントラスト比の基準とともに解説します。

レスポンシブ画像の実装ガイド - srcset, sizes, picture 要素の完全解説

デバイスの画面サイズや解像度に応じて最適な画像を配信するレスポンシブ画像の実装方法を、コード例とともに詳しく解説します。

SVG の基礎と活用法 - ベクター画像の仕組みからアニメーションまで

SVG (Scalable Vector Graphics) の基本構造から実践的な活用法まで解説。パス、図形、テキスト、フィルタ、アニメーションの実装方法と最適化テクニックを紹介します。

ダークモード対応画像の実装ガイド - picture 要素と CSS による切り替え

ダークモードに最適化された画像の実装方法を解説。picture 要素の media 属性、CSS の prefers-color-scheme、SVG の色反転など具体的な手法を紹介します。

ビフォーアフタースライダーの実装 - 画像比較 UI の設計と最適化

画像のビフォーアフター比較スライダーを HTML/CSS/JavaScript で実装する方法を解説。レスポンシブ対応、タッチ操作、アクセシビリティ、パフォーマンス最適化まで網羅します。

Data URI で画像を埋め込む技術と注意点 - Base64 エンコードの仕組みと最適な使いどころ

Data URI スキームで画像を HTML/CSS に直接埋め込む技術を解説。Base64 エンコードの仕組み、パフォーマンスへの影響、適切なユースケースと避けるべきケースを整理します。

関連用語