2 回答

TA貢獻1789條經驗 獲得超10個贊
如果我通過“拉出切片”正確理解你,那么你想要平移切片的位置,而不是改變它的形狀。
困難的部分是弄清楚將形狀轉換到哪里,以便切片沿著正確的角度從中心移動。最簡單的解決方案是使用centroid,切片的中點,然后根據需要調整這些值:
slices.on('mouseover', function(d) {
d3.select(this)
.transition()
.duration(1000)
.attr('transform', 'translate(' + (arc.centroid(d)[0] / 2) + ',' + (arc.centroid(d)[1] / 2) + ')');
});
slices.on('mouseout', function() {
d3.select(this)
.transition()
.duration(500)
.attr('transform', 'translate(0, 0)');
});
在這里,我將質心 x 和 y 值分成兩半,這樣切片就不會離開 SVG 區域。
PS:var color = d3.scale.category20c();
是 d3v3,在 d3v4 中做它會是:var color = d3.scaleOrdinal(d3.schemeCategory20);
。您鏈接的小提琴正在使用兩者。

TA貢獻1847條經驗 獲得超7個贊
展開切片
鼠標事件實際上是與元素slices綁定的。<g>然后d3.select(this)是 the<g>而不是 exactpath元素。可以看到hover 之后<g>會有d屬性,但是我們需要d改變path.
嘗試
slices.on('mouseover', function(d) {
let expandArc = d3.arc()
.innerRadius(innerradius)
.outerRadius(radius * 1.2);
d3.select(this)
.select("path")
.transition()
.duration(1000)
//.ease('bounce')
.attr('d', expandArc);
});
翻譯切片
找到路徑的質心并在懸停時平移它
let offset = 4;// how much do you want to translate from the origin
slices.on('mouseover', function(d) {
d3.select(this)
.transition()
.duration(1000)
.attr('transform', 'translate(' + arc.centroid(d)[0] / offset + ',' + arc.centroid(d)[1] / offset + ')')
});
slices.on('mouseout', function() {
d3.select(this)
.transition()
.duration(1000)
.attr('transform', 'translate(0,0)')
});
添加回答
舉報