做法很簡單,就是做兩個 d3.svg.arc() 然後在 mouseover & mouseout 的時候改變 d 屬性即可。

這裏就拿 http://bl.ocks.org/mbostock/3887193 作為範例。

DEMO: (original charts) http://output.jsbin.com/darexo/1/

DEMO2: (add hover effect) http://output.jsbin.com/darexo/3/

// original
var arc = d3.svg.arc()
    .outerRadius(radius - 10)
    .innerRadius(radius - 70);

// arc with scaling
var arcOver = d3.svg.arc()
    .outerRadius(radius)
    .innerRadius(radius - 70);

中間略

// adding mouse events with transition
g.selectAll(".arc > path")
    .on({
        "mouseover": function(d, i){
            d3.select(this).transition().duration(250).attr('d', arcOver);
        },
        "mouseout": function(d, i){
            d3.select(this).transition().duration(250).attr('d', arc);
        }
});

補充:感謝小馬提出 hover 在 text 上會無法執行動畫的問題。 只要把 mouse event 改綁在上一層的 <g> 上面,或是在 text 的 CSS 下 pointer-events: none; 取消它的 pointer 事件即可。

  g.on({
    "mouseover": function(d, i){
      d3.select(this.childNodes[0]).transition().duration(250).attr('d', arcOver);
    },
    "mouseout": function(d, i){
      d3.select(this.childNodes[0]).transition().duration(250).attr('d', arc);
    }
  });