d3.js - D3 共享缩放/过渡
问题描述
我希望有人可以深入了解我在共享缩放和使用过渡重置时遇到的 D3 问题。
我有一个包含多个 SVG 的应用程序,我都共享一个缩放/平移行为。这似乎工作得很好。但随后我添加了一个“重置”按钮,我想使用该按钮使用 D3 的平滑过渡功能返回到身份转换。这行得通,除了...
如果只有一个 SVG 监听缩放,工作完美
/
流畅
这似乎是某种竞争条件,但我不确定我是否编码错误,或者违反了共享缩放的使用规则。
下面是该行为的简化工作演示代码(您可以输入不同#s 的 SVG 进行绘制,然后您可以将它们平移/缩放在一起,然后点击重置按钮):
您可以在 codepen 上尝试此操作:https: //codepen.io/MatthewMJ/pen/ZEEEjPE
感谢您的任何见解。
<!DOCTYPE html>
<head>
<meta charset="utf-8">
<script src="https://d3js.org/d3.v4.js"></script>
<script src="https://d3js.org/d3-random.v2.min.js"></script>
</head>
<body>
How many rows? <input id="numrows"/><button onClick="repaint()">repaint</button>
<br><br>
<div id="block" display="block"></div>
<button onClick="reset()">reset zoom/pan</button>
<script>
// One Zoom to Zoom them All
var zoom = d3.zoom();
// we'll have a user-specified # of SVGs of same size/layout defined here
var dims = {
width: 800,
height: 50,
svg_dx: 100,
svg_dy: 25
};
// max value for made-up data
var pointMax = 1000;
var xScale = d3.scaleLinear()
.domain([0, pointMax])
.range([dims.svg_dx, dims.width - (dims.svg_dx * 2)]);
function repaint() {
d3.selectAll("svg").remove(); // clear out everything to start over
for (var i = 0; i < document.getElementById("numrows").value; i++) {
paint_one_row(i);
}
}
function paint_one_row(i) {
// generate 10 random points
var data = d3.range(10).map(d3.randomInt(pointMax));
// create the SVG into which we'll paint
var svg = d3.select('#block')
.append("div")
.append("svg")
.attr("width", dims.width)
.attr("height", dims.height);
// draw the circles
var circles = svg.selectAll('circle')
.data(data)
.enter()
.append('circle')
.attr('r', 7)
.attr('cx', function (d) {
return xScale(d);
})
.attr('cy', 10);
// hook this SVG in with the central zoom
svg.call(zoom);
zoom.on('zoom.row' + i, zoomed.bind(svg));
// each row should have it's own closure of 'zoomed' with differing 'circles'
function zoomed() {
var transform = d3.event.transform;
// Zoom the circles
var xNewScale = transform.rescaleX(xScale);
circles
.attr("cx", function (d) {
return xNewScale(d);
});
}
}
function reset() {
d3.selectAll("svg").transition().duration(750).call(zoom.transform, d3.zoomIdentity);
}
</script>
</body>
解决方案
推荐阅读
- c# - 如何让我流畅的第三人称动作不再抖动?
- node.js - Electron 应用程序渲染器进程在加载新的 html 页面时崩溃
- sass - 引用 SCSS 中元素的父级
- discord - TypeError:无法读取未定义的属性“fetchMembers”
- android - 使用 sslEngine 在 android 中获取 SSL 协议异常
- javascript - 通过从另一个文件发送刷新信号来重新渲染 FlatList?
- php - 我希望将文本类型存储在数据库中,而不是 id Ajax Laravel 7
- timestamp - 时刻js获取直到当前时间的日期
- hl7-fhir - 如何从规范生成原型文件(如 google-fhir 原型是从 FHIR 规范生成的)?
- text - 将多行文本转换为数组