gpt4 book ai didi

javascript - 使用 d3 链接(同步)依赖转换

转载 作者:行者123 更新时间:2023-12-03 10:42:22 26 4
gpt4 key购买 nike

我正在编写一个小部件,该小部件显示一个值,并且能够在需要时以动画方式呈现新值。数字显示的一部分是显示符号的能力。例如百分比符号 (%)。

我已经能够使用 d3 和颜色正确编码转换。该值完美运行。符号颜色的过渡有效,但符号位置的过渡不同步。

我的示例代码演示了随机值变化。但符号的位置始终是之前的随机值,而不是当前值。

问题的JSFiddle在这里:https://jsfiddle.net/metalskin/ektvL7kj/

代码如下:

<!doctype html>
<html style="height: 100%">
<head>
<meta charset="UTF-8">
<title>Test Arc Graph</title>
<style>
body {
width: 100%;
height: 100%;
}
.mainDiv {
width: 100%;
height: 25%;
display: block;
overflow: hidden;
}
.widget {
width: 25%;
height: 100%;
float: left;
}
#numWidget {
width: 100%;
height: 100%;
}
</style>
</head>
<body>
<div class="mainDiv">
<div id="widgetDiv" class="widget" />
</div>
<script type="text/javascript" src="js/d3.min.js"></script>
<script>

var value = setValue(0, 0, false);

var svg = d3.select("#widgetDiv").append("svg")
.attr("id", "numWidget")
.attr("viewBox", "0 0 100 100")
.attr("perserveAspectRatio", "meet")
.append("g");

var textInst = svg.append("text")
.attr("id", "numValue")
.attr("dx", 50)
.attr("dy", 50)
.text(value)
.attr("text-anchor", "middle")
.attr("dominant-baseline", "central")
.attr("font-family", "sans-serif")
.style("font-weight", "bold")
.style("font-size", "3em")
.attr("fill", determineForegroundColor(value));

var symbolInst = svg.append("text")
.attr("id", "numSymbol")
.attr("dx", 51 + ( textInst.node().getBBox().width / 2))
.attr("dy", 53)
.text("%")
.attr("text-anchor", "begin")
.attr("baseline-shift", "super")
.attr("font-family", "sans-serif")
.style("font-weight", "bold")
.style("font-size", "1em")
.attr("fill", determineForegroundColor(value));

setInterval(function() {
var min = -120;
var max = 120;
// calc a int random value between min and max
var newValue = Math.floor(Math.random() * (max - min)) + min;
value = setValue(value, newValue, true, textInst, symbolInst);
}, 1500);

function determineForegroundColor(val) {
if(val <= 80) {
return "rgb(100,100,100)";
} else if(val >= 100) {
return "rgb(200,50,50)";
}

return "rgb(200,200,50)";
}

function setValue(oldValue, newValue, redraw, textValueInst, symbolInst) {
var format = d3.format("f");

if(redraw) {
(function(replacementValue, textInst) {
textInst.transition()
.duration(750)
.ease('linear')
.style("fill", determineForegroundColor())
.tween('text', function() {
var ip = d3.interpolate(oldValue, replacementValue);
return function(t) {
this.textContent = format(ip(t));
};
})
// .each(function() {
// d3.select(this);
// symbolInst
// .style("fill", determineForegroundColor())
// .attr("dx", 51 + ( textInst.node().getBBox().width / 2));
// })
;

symbolInst.transition()
.duration(750)
.ease('linear')
.style("fill", determineForegroundColor())
.attr("dx", 51 + ( textInst.node().getBBox().width / 2));
})(newValue, textValueInst);
}

return newValue;
};

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

注释掉的代码是使用each的尝试。当取消注释并且注释掉之后的转换时,行为不会改变。我认为通过使用 each 我会在转换期间获得一个 event,这样我就可以根据值文本组件的当前值偏移符号。我发现一些 doco 建议执行 d3.select(this),但我无法弄清楚问题是什么。

我怀疑使用 each 是正确的方法,只是找不到与我正在做的事情相对应的关于如何使用它的示例或讨论。

最佳答案

您可以在 tween 函数中对文本元素的过渡进行分组并偏移 % 符号。

textInst.transition()
.duration(750)
.ease('linear')
.style("fill", determineForegroundColor())
.tween('text', function() {
var ip = d3.interpolate(oldValue, replacementValue);
return function(t) {
this.textContent = format(ip(t));
symbolInst
.style("fill", determineForegroundColor())
.attr("dx", 51 + ( textInst.node().getBBox().width / 2));
};
});

这是您的updated fiddle

关于javascript - 使用 d3 链接(同步)依赖转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28715020/

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