まくろぐ
更新: / 作成:

D3.js でマウスイベントを扱うコードのサンプルです。

click イベント

図: click イベントをハンドルする

D3.js でマウスのクリックイベントをハンドルするには、D3 Selection オブジェクトに click イベントハンドラを追加します。 上記の svg 要素内でクリックすると、その座標にピンク色の円が表示されます。

<svg id="svg-vwuifrt" width="200" height="100" />
<script>
const svg = d3.select("#svg-vwuifrt");  // D3 Selection オブジェクトを取得

svg.on("click", (event) => {
  const [x, y] = d3.pointer(event)
  svg.append("circle")
    .attr("cx", x)
    .attr("cy", y)
    .attr("r", 10)
    .attr("fill", "deeppink")
    .style("fill-opacity", 0.5)
})
</script>

event.clientXevent.clientY でマウスカーソルの座標値を取得してしまうと、ブラウザのクライアント領域全体の座標値になってしまうので、d3.point()svg 要素内の座標値に変換するところがポイントです。

mousemove イベント

図: mousemove イベントをハンドルする

D3.js でマウスカーソルを動かしたときのイベントをハンドルするには、D3 Selection オブジェクトに mousemove イベントハンドラを追加します。 上記の svg 要素内でマウスカーソルを動かすと、現在の座標値を表示します。

<svg id="svg-mousemove" width="200" height="100" />
<script>
const svg = d3.select("#svg-mousemove");

// 座標値を表示するための text 要素を追加しておく
const text = svg.append("text")
  .attr("x", "50%")
  .attr("y", "50%")
  .attr("text-anchor", "middle")  // 水平方向のアンカーポイントを中央に
  .attr("dominant-baseline", "middle")  // 垂直方向のベースラインを中央に
  .text("x=0, y=0")

// カーソル位置を表示する circle 要素を追加しておく
const circle = svg.append("circle")
  .attr("r", 6)
  .attr("fill", "red")

// mousemove イベントをハンドル
svg.on("mousemove", (event) => {
  const [x, y] = d3.pointer(event)
  text.text(`x=${Math.floor(x)}, y=${Math.floor(y)}`)
  circle.attr("cx", x).attr("cy", y)
})
</script>

mouseover / mouseout イベント

図: mouseover/mouseout イベントをハンドルする

マウスカーソルが、特定の要素内に入った/出たタイミングを知るには、mouseover / mouseout イベントをハンドルします。 上の svg 要素内の矩形と円の中にマウスカーソルが入ると、背景色が変化します。

<svg id="svg-mouseover" width="200" height="100" />
<script>
const svg = d3.select("#svg-mouseover");

// 矩形を追加
const rect = svg.append("rect")
  .attr("x", 35)
  .attr("y", 25)
  .attr("width", 50)
  .attr("height", 50)
  .attr("stroke", "gray") // 枠線の色
  .attr("fill", "transparent") // 塗りつぶしの色
  .on("mouseover", handleMouseOver)
  .on("mouseout", handleMouseOut)

// 円を追加
const circle = svg.append("circle")
  .attr("cx", 140)
  .attr("cy", 50)
  .attr("r", 25)
  .attr("stroke", "gray") // 枠線の色
  .attr("fill", "transparent") // 塗りつぶしの色
  .on("mouseover", handleMouseOver)
  .on("mouseout", handleMouseOut)

// 要素にカーソルが入ったとき
function handleMouseOver(event) {
  d3.select(event.currentTarget).attr("fill", "cyan")
  // d3.select(this).attr("fill", "cyan")
}

// 要素からカーソルが出たとき
function handleMouseOut(event) {
  d3.select(event.currentTarget).attr("fill", "transparent")
  // d3.select(this).attr("fill", "transparent")
}
</script>

塗りつぶしを行わない場合は、fill 属性に transparent をセットすることに注意してください。 none でも同様の表示になりますが、none だと表示自体されていないものとみなされるため、マウスカーソルのイベントをハンドルできません。

関連記事

まくろぐ
サイトマップまくへのメッセージ