如何在 d3.js 中检测当前元素的位置并取消动画
How to detect current element's position and cancel an animation in d3.js?
我有一个使用 jQuery 的 Web 应用程序,我正在更新它以使用 d3.js 代替。这是一个游戏,其中有一个动画的瓷砖并从屏幕顶部掉落,直到它撞到"地板"或其他物体上。
我能够创建动画,使元素从屏幕的顶部到底部以线性形式落下,如下所示(mcve):
var wh = window.innerHeight - 40;
d3.select("#tile")
.transition()
.duration(2000)
.style("top", wh + "px")
.ease("linear");
#tile {
width:40px;
height:40px;
position:absolute;
top:0px;
left:0px;
background:#336699;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script>
<div id="tile"></div>
如果没有任何对象挡住,这工作正常,但如果有,我发现两个问题:
-
使用 jQuery,我将
animate()
与step
方法一起使用,这样我就可以获取元素的当前位置,从而检测与其他元素的冲突。在 d3.js 中是否有等同于transition()
的step()
? -
一旦检测到碰撞,如何取消动画以使元素停止移动?(类似于jQuery中的
stop()
)。
在网上做一些研究,我发现我可以创建一个持续时间为 0 的空过渡,这将回答第二点,但我想知道是否有更直接的方法。
如果您编写自己的 tween
函数,则可以完全控制转换。 在每次迭代中,您可以检查冲突并在必要时取消。
var wh = window.innerHeight - 40;
d3.select("#tile")
.transition()
.duration(2000)
.ease("linear")
.tween("fall", function() {
var i = d3.interpolateNumber(0, wh);
var self = d3.select(this);
return function(t) {
var isCollision = (t > 0.5); // some condition to cancel
if (isCollision) {
self.transition(); // cancel transition
} else {
self.style("top", i(t) + "px"); // continue falling
}
};
});
#tile {
width:40px;
height:40px;
position:absolute;
top:0px;
left:0px;
background:#336699;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script>
<div id="tile"></div>
相关文章:
- 使用javascript查找元素位置的最快方法
- 当静态元素与滚动上的固定元素位置重叠时进行检测
- 另一个元素JAVAscript中的元素位置
- CSS.滚动后元素位置发生变化
- JQuery Mobile单击事件不起作用,具体取决于HTML中的元素位置
- 正在查找表行中的td元素位置
- jquery追加元素位置始终为0
- 如何通过JS移动元素位置而不闪烁
- 当按钮点击更改元素位置时,Javascript
- 在事件发生时获取元素位置的当前页面 URL,并将该 URL 输出到另一个页面上
- 更改 JS/D3 页上的元素位置
- 字典中由元素:位置对组成的移动元素
- 观察元素位置并对 AngularJS 中的更改做出反应
- JavaScript 设置宽度尺寸会更改元素位置
- Angularjs 获取元素位置
- 按类名获取元素位置
- 从数组中获取元素位置
- 如何在更改选择元素宽度时固定所有元素位置
- 破解以在滚动条出现时保持水平元素位置
- 将第一个数组中的元素位置与另一个数组进行比较