触って楽しい - インタラクティブSVG入門
SVGはただ美しい静的な画像を表示するだけでなく、ユーザーの操作(クリック、マウスの動きなど)に反応する、生き生きとしたインタラクティブなコンテンツを作り出すことができます。これにより、SVGはウェブサイトやアプリケーションの魅力的なインターフェース部品としても活躍します。
このページでは、主にJavaScriptを使ってSVG要素にイベント処理を追加し、DOMを操作することで、SVGをインタラクティブにする基本的な方法を学んでいきましょう。
SVG要素へのイベントリスナーの追加
HTML要素と同じように、SVG要素にもJavaScriptを使ってイベントリスナーを登録し、特定のアクションが起きた時に関数を実行させることができます。よく使われるイベントには以下のようなものがあります:
click
: 要素がクリックされたとき。mouseover
/mouseenter
: マウスカーソルが要素の上に乗ったとき。mouseout
/mouseleave
: マウスカーソルが要素の上から離れたとき。mousedown
/mouseup
: マウスのボタンが押された/離されたとき。mousemove
: マウスが要素上で動いたとき。
イベントリスナーは、element.addEventListener('イベント名', 実行する関数);
のようにして登録します。まずはSVG要素を document.getElementById()
などで取得しましょう。
イベントリスナーデモ (クリック & マウスオーバー)
// 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要素の属性を動的に変更したり、新しい要素を作成・追加・削除したりすることができます。
- 属性の取得と設定:
element.getAttribute('属性名')
,element.setAttribute('属性名', '新しい値')
- スタイルの変更:
element.style.プロパティ名 = '値';
(CSSプロパティとしてアクセス) - 要素の作成:
document.createElementNS('http://www.w3.org/2000/svg', '要素名')
(注意: SVG要素は名前空間を指定する必要があります) - 要素の追加:
親要素.appendChild(新しい要素);
- 要素の削除:
親要素.removeChild(削除する要素);
DOM操作デモ (要素の追加と削除)
ドラッグ&ドロップの実装
SVG要素をマウスでドラッグして移動させるには、mousedown
, mousemove
, mouseup
イベントを組み合わせます。mousemove
イベントの中で、マウスの移動量に合わせて要素の transform="translate(x,y)"
属性を更新するのが一般的な方法です。
マウスイベントから得られる座標 (clientX
, clientY
など) はスクリーン座標なので、SVG内部の座標系に変換する必要があります。SVGElement.getScreenCTM()
メソッドや SVGPoint
オブジェクトが役立ちます。
ドラッグ&ドロップ デモ
pointer-events
属性
CSSの pointer-events
プロパティは、SVG要素がマウスイベント(クリック、ホバーなど)のターゲットになるかどうかを制御します。これは特に、要素が重なっている場合や、見た目だけ存在して操作はさせたくない場合に便利です。
主な値:
auto
/visiblePainted
: (デフォルト) 見えている部分がイベントの対象。none
: 要素はマウスイベントを一切受け付けません。イベントはその下にある要素に「透過」します。- 他にも
visible
,painted
,fill
,stroke
など、より細かく制御する値があります。
pointer-events
デモ
Did you know? Interactive SVG elements should also be made accessible. This includes providing keyboard focusability (e.g., using `tabindex="0"` on a `
知っていましたか?インタラクティブな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
属性控制元素的事件透明度。