SVGマスターへの道

触って楽しい - インタラクティブSVG入門

SVGはただ美しい静的な画像を表示するだけでなく、ユーザーの操作(クリック、マウスの動きなど)に反応する、生き生きとしたインタラクティブなコンテンツを作り出すことができます。これにより、SVGはウェブサイトやアプリケーションの魅力的なインターフェース部品としても活躍します。

このページでは、主にJavaScriptを使ってSVG要素にイベント処理を追加し、DOMを操作することで、SVGをインタラクティブにする基本的な方法を学んでいきましょう。

SVG要素へのイベントリスナーの追加

HTML要素と同じように、SVG要素にもJavaScriptを使ってイベントリスナーを登録し、特定のアクションが起きた時に関数を実行させることができます。よく使われるイベントには以下のようなものがあります:

イベントリスナーは、element.addEventListener('イベント名', 実行する関数); のようにして登録します。まずはSVG要素を document.getElementById() などで取得しましょう。

イベントリスナーデモ (クリック & マウスオーバー)

Try Me! Hover Me!
イベント情報をここに表示
// JavaScriptの例 (下のスクリプトタグ内で実際に動作)
// const circle = document.getElementById('eventCircle');
// const rect = document.getElementById('eventRect');
// const output = document.getElementById('eventDemoOutput');

// circle.addEventListener('click', () => {
//   const newColor = circle.getAttribute('fill') === 'skyblue' ? 'salmon' : 'skyblue';
//   circle.setAttribute('fill', newColor);
//   output.textContent = '円がクリックされました! 色: ' + newColor;
// });

// rect.addEventListener('mouseenter', () => {
//   rect.setAttribute('opacity', '0.7');
//   output.textContent = '矩形にマウスが乗りました!';
// });
// rect.addEventListener('mouseleave', () => {
//   rect.setAttribute('opacity', '1');
//   output.textContent = '矩形からマウスが離れました!';
// });

SVG DOM (Document Object Model) の操作

JavaScriptを使ってSVG要素の属性を動的に変更したり、新しい要素を作成・追加・削除したりすることができます。

DOM操作デモ (要素の追加と削除)

{/* ここに動的に円が追加されます */}
操作情報をここに表示

ドラッグ&ドロップの実装

SVG要素をマウスでドラッグして移動させるには、mousedown, mousemove, mouseup イベントを組み合わせます。mousemove イベントの中で、マウスの移動量に合わせて要素の transform="translate(x,y)" 属性を更新するのが一般的な方法です。

マウスイベントから得られる座標 (clientX, clientY など) はスクリーン座標なので、SVG内部の座標系に変換する必要があります。SVGElement.getScreenCTM() メソッドや SVGPoint オブジェクトが役立ちます。

ドラッグ&ドロップ デモ

Drag Me
ドラッグ情報をここに表示

pointer-events 属性

CSSの pointer-events プロパティは、SVG要素がマウスイベント(クリック、ホバーなど)のターゲットになるかどうかを制御します。これは特に、要素が重なっている場合や、見た目だけ存在して操作はさせたくない場合に便利です。

主な値:

pointer-events デモ

Blue Rect Click the red area
豆知識 (English/日本語)

Did you know? Interactive SVG elements should also be made accessible. This includes providing keyboard focusability (e.g., using `tabindex="0"` on a `` element acting as a button) and using ARIA attributes (like `role="button"`, `aria-label`) to describe the element's purpose and state to assistive technologies.

知っていましたか?インタラクティブなSVG要素もアクセシブルにする必要があります。これには、キーボードでのフォーカス制御(例:ボタンとして機能する<g>要素にtabindex="0"を使用)や、ARIA属性(role="button"aria-labelなど)を使用して要素の目的や状態を支援技術に伝えることが含まれます。

まとめ

JavaScriptとSVG DOMを組み合わせることで、SVGは単なる静的な画像を超え、ユーザーと対話するダイナミックなコンポーネントへと進化します。イベントリスナーでユーザーの操作を捉え、DOM操作でSVGの見た目や構造をリアルタイムに変更することで、多彩なインタラクションが実現可能です。

ドラッグ&ドロップのような高度な操作や、pointer-eventsによるイベント制御も、SVGのインタラクティビティを高める上で重要なテクニックです。D3.jsやGSAPのようなライブラリは、これらの実装をさらに容易にしてくれます。

次は、「プロの技 - レスポンシブと最適化」で、SVGを様々な環境に対応させ、パフォーマンスを向上させるための高度なテクニックについて学びます。

このページの要約

日本語

SVGはJavaScriptと連携することでインタラクティブになります。SVG要素にaddEventListenerを使ってクリックやマウスオーバーなどのイベントリスナーを登録し、コールバック関数内でDOM操作(属性変更、要素の追加/削除など)を行うことで、ユーザーの操作に反応させることができます。createElementNSでSVG要素を作成する際は名前空間の指定が必要です。ドラッグ&ドロップのような複雑な操作もイベントの組み合わせで実装可能です。pointer-events属性は要素のイベント透過性を制御します。

English

SVG becomes interactive by integrating with JavaScript. Event listeners for actions like clicks or mouseovers can be registered on SVG elements using addEventListener. Callback functions then perform DOM manipulations (changing attributes, adding/removing elements) to react to user input. Creating SVG elements with createElementNS requires specifying the namespace. Complex interactions like drag-and-drop can be implemented by combining events. The pointer-events attribute controls an element's event transparency.

Español

SVG se vuelve interactivo al integrarse con JavaScript. Se pueden registrar escuchas de eventos para acciones como clics o mouseovers en elementos SVG usando addEventListener. Las funciones de devolución de llamada luego realizan manipulaciones del DOM (cambiando atributos, agregando/eliminando elementos) para reaccionar a la entrada del usuario. La creación de elementos SVG con createElementNS requiere especificar el espacio de nombres. Interacciones complejas como arrastrar y soltar se pueden implementar combinando eventos. El atributo pointer-events controla la transparencia de eventos de un elemento.

中文

通过与 JavaScript 集成,SVG 变得具有交互性。可以使用 addEventListener 在 SVG 元素上注册点击或鼠标悬停等操作的事件监听器。然后,回调函数执行 DOM 操作(更改属性、添加/删除元素)以响应用户输入。使用 createElementNS 创建 SVG 元素时需要指定命名空间。像拖放这样的复杂交互可以通过组合事件来实现。pointer-events 属性控制元素的事件透明度。