【发布时间】:2019-04-09 19:50:14
【问题描述】:
我正在使用 scrollama javascript 库来编写一篇“滚动讲述”文章,其中涉及在用户滚动时将 D3 图形移入和移出视图。它大部分都在工作,但如果我滚动得太快,这些图表就会堆积在一起。
Here is a jsfiddle 基于此example by the scrollama author。在我的示例中,彩色圆点应该一次淡入一个。如果您要快速滚动到最后,则不应出现间歇性点。以下 sn-ps 显示了我是如何设置转换的:
我定义了一些创建“图表”的函数,然后调用它们。
var makeCircle0 = function(){
g.append("circle")
.attr("cx", 50)
.attr("cy", 100)
.attr("r", 20)
.attr("fill", "red")
.attr("class", "redcircle")
g.selectAll(".redcircle")
.attr("opacity", 0)
}
makeCircle0();
// Do this for makeCircle1, 2, and 3, also.
然后,我创建函数来处理转换。这个说让红色圆圈淡入并将其他圆圈设置为 0 不透明度。我对所有圈子/阶段都这样做。
var showCircle0 = function(){
g.selectAll(".redcircle")
.transition()
.duration(1000)
.attr("opacity", 1)
g.selectAll(".yellowcircle").attr("opacity", 0)
g.selectAll(".greencircle").attr("opacity", 0)
g.selectAll(".bluecircle").attr("opacity", 0)
}
本部分创建了一个我的转换函数数组,以便我可以在您滚动时在页面中的特定步骤调用它们。这类似于Jim Vallandingham handled his scroller。
var activateFunctions = [];
activateFunctions[0] = showCircle0;
activateFunctions[1] = showCircle1;
activateFunctions[2] = showCircle2;
activateFunctions[3] = showCircle3;
最后,这会在页面的正确步骤调用所需的函数。它确实......但并非没有停止在上一步中触发的其他转换,导致多个点出现在各个阶段。
function handleStepEnter(response) {
step.classed('is-active', function (d, i) {
return i === response.index;
})
figure.call(activateFunctions[response.index])
}
如何防止这种情况发生?
【问题讨论】:
-
我认为this 是您正在寻找的东西(过渡与左侧的段并不完全一致,但圆圈与数字匹配)。这是正确的吗?
-
@AndrewReid 这太棒了!所以你所做的只是在开始任何新的转换之前先“interrupt()”?
-
差不多 - interrupt() 将取消选择的任何转换。
-
好吧,有趣。如果我有几个可能正在转换的课程(如 redcircle、yellowcircle 等),我将不得不中断所有课程?
-
如果存在他们仍在过渡的风险 - 这就是为什么我使用 class 来选择它们并使用 id 来单独选择一个。