gpt4 book ai didi

javascript - 为什么 attrTween 不起作用

转载 作者:行者123 更新时间:2023-11-30 11:44:31 25 4
gpt4 key购买 nike

我试图模仿 Mike Bostock 的例子 Extending Arcs .我的代码与 Mike 的非常相似,但我的代码与他的不同。

下面是 JavaScript 代码:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Example</title>
<script src="static/d3.min.js"></script>
</head>
<body>
<script>
var Width = 500, Height = 400, innerRadius = 45, outerRadius = 100;
var colors = d3.scale.category10();

var svg = d3.select('body')
.append('svg')
.attr({ width: Width, height: Height });

var data = [40, 32, 35, 64, 83],
pieData = d3.layout.pie()(data)

var ArcGen = d3.svg.arc()
.innerRadius(innerRadius)
.outerRadius(outerRadius)
.padAngle(0.02)
.startAngle(function(d){
return d.startAngle;
})
.endAngle(function(d){
return d.endAngle;
});

var group = svg.append('g')
.attr('transform', 'translate(' + [Width / 2.0, Height / 2.0] + ')');
var segment = group.selectAll('g')
.data(pieData)
.enter()
.append('g');

segment
.append('path')
.attr('d', ArcGen)
.attr('fill', function(d,i){ return colors(i); })
.on('mouseover', arcTween(outerRadius * 1.2, 0))
.on('mouseout', arcTween(outerRadius, 150));

function arcTween(oRadius, delay){
// closure function
return function(){
d3.select(this)
.transition()
.delay(delay)
.attrTween('d', function(d){
var i = d3.interpolate(d.outerRadius, oRadius);
return function(t){
d.outerRadius = i(t);
return ArcGen(d);
}
})
};
};

</script>
</body>
</html>

这个例程很简单,没有错误也没有 Action 。

我有两个问题:

  • 是否有必要在每个圆弧生成器处链接 startAngle 和 endAngle 属性?我读过一些专业人士的代码,比如 Mike Bostock 的,在初始阶段不添加这两个属性,他们的代码在构建路径元素时工作正常。
  • 我哪里错了?谁能给我更多 attrTween 的例子。

谢谢大家!

最佳答案

您的代码有 2 个问题,通过与 Bostock 的代码进行比较,您可以很容易地找到这些问题。

首先,这一行:

var i = d3.interpolate(d.outerRadius, oRadius);

在元素的数据中使用属性 outerRadius。但它没有。您可以通过以下方式解决此问题:

.each(function(d) { d.outerRadius = outerRadius; })

其次,您的圆弧生成器正在设置外半径:

var ArcGen = d3.svg.arc()
.innerRadius(innerRadius)
.outerRadius(outerRadius)
.padAngle(0.02)
.startAngle(function(d) {
return d.startAngle;
})
.endAngle(function(d) {
return d.endAngle;
});

删除它:

var ArcGen = d3.svg.arc()
.innerRadius(innerRadius)
.padAngle(0.02)
.startAngle(function(d) {
return d.startAngle;
})
.endAngle(function(d) {
return d.endAngle;
});

这是经过 2 处更改后的工作代码:

var Width = 500,
Height = 400,
innerRadius = 45,
outerRadius = 100;
var colors = d3.scale.category10();

var svg = d3.select('body')
.append('svg')
.attr({
width: Width,
height: Height
});

var data = [40, 32, 35, 64, 83],
pieData = d3.layout.pie()(data)

var ArcGen = d3.svg.arc()
.padAngle(0.02)
.innerRadius(innerRadius)
.startAngle(function(d) {
return d.startAngle;
})
.endAngle(function(d) {
return d.endAngle;
});

var group = svg.append('g')
.attr('transform', 'translate(' + [Width / 2.0, Height / 2.0] + ')');
var segment = group.selectAll('g')
.data(pieData)
.enter()
.append('g');

segment
.append('path')
.each(function(d) {
d.outerRadius = outerRadius;
})
.attr('d', ArcGen)
.attr('fill', function(d, i) {
return colors(i);
})
.on('mouseover', arcTween(outerRadius * 1.2, 0))
.on('mouseout', arcTween(outerRadius, 150));

function arcTween(oRadius, delay) {
// closure function
return function() {
d3.select(this)
.transition()
.delay(delay)
.attrTween('d', function(d) {
var i = d3.interpolate(d.outerRadius, oRadius);
return function(t) {
d.outerRadius = i(t);
return ArcGen(d);
}
})
};
};
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.17/d3.js"></script>

关于javascript - 为什么 attrTween 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41466068/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com