ExtJS 4.0.7 scrollTo()滚动,但不';不移动滚动条滑块?
我有一个树面板,并试图做一个动画滚动到某些位置。我在做这样的事情:ExtJS 4.0.7 scrollTo()滚动,但不';不移动滚动条滑块?,extjs,extjs4,Extjs,Extjs4,我有一个树面板,并试图做一个动画滚动到某些位置。我在做这样的事情: myTreePanel.getView().getEl().scrollTo('top', yCoord, true /*animate*/); 视图会滚动到正确的位置,但滚动条中的“滑块”不会移动。你知道为什么吗 一些附加信息:如果我改为执行以下操作,滚动条滑块将正确移动(当然,scroll()不支持动画--我更喜欢使用.scrollTo(),以便用户可以看到滚动): 谢谢你的帮助/建议 这并不奇怪。他们使用。正确的代码是:
myTreePanel.getView().getEl().scrollTo('top', yCoord, true /*animate*/);
视图会滚动到正确的位置,但滚动条中的“滑块”不会移动。你知道为什么吗
一些附加信息:如果我改为执行以下操作,滚动条滑块将正确移动(当然,scroll()不支持动画--我更喜欢使用.scrollTo(),以便用户可以看到滚动):
谢谢你的帮助/建议 这并不奇怪。他们使用。正确的代码是:
myTreePanel.verticalScroller.setScrollTop(yCoord);
但是,它也不支持动画。因此,我建议像我所描述的那样去掉自定义滚动条,并使用您的原始代码。@molecleman关于禁用自定义滚动条的建议(ExtJS在4.0.x中使用,但在4.1中不使用)确实有效。完成此操作后,您可以调用myTreePanel.getView().getEl().scrollTo('top',yCoord,true),一切都按预期工作:滚动设置动画,滚动条移动。唯一的问题是,如果使用向上/向下箭头键在树中移动,似乎会破坏视图的滚动能力 它不是很优雅,但我要使用的是:
// Animated scroll of tree view
myTreePanel.getView().getEl().scrollTo('top', yCoord, true);
// Wait 300ms then sync the scroll bar with the tree view
setTimeout(function() {
myTreePanel.setScrollTop(yCoord);
}, 300);
这样做的缺点是滚动条“跳跃”到位,而不是随着动画平滑移动,但好处是不会破坏上/下键滚动。此外,因为它不涉及更改配置参数或重写树视图的样式,所以我假设它在升级到ExtJS 4.1后仍然可以工作(即,对setScrollTop()的计时器调用将是不必要的,但不应该破坏任何东西)
请注意,调用setScrollTop()会移动滚动条,但也会导致视图“跳转”到该位置。因此,您需要确保计时器在动画完成之前不会启动。实际上,我使用一些自定义代码每10毫秒轮询一次,查看目标行是否可见,然后调用setScrollTop(),而不是使用总是等待硬编码时间的计时器:
var scrollToRowNum = 5;
var scrollToEl = getElementForNode(myTreePanel.getRootNode().childNodes[scrollToRowNum]);
var yCoord = scrollToEl.getOffsetsTo(scrollToEl.parent())[1];
// Animated scroll of tree view
myTreePanel.getView().getEl().scrollTo('top', yCoord, true);
// Check every 10ms to see if animation is done, then sync scrollbar
var timerId = setInterval(function() {
if( myTreePanel.isTreeElementWithinVisibleArea(scrollToEl) ) {
clearInterval(timerId);
myTreePanel.setScrollTop(yCoord);
}
}, 10);
函数的作用是:检查元素当前的Y坐标(绝对坐标)是否在树状视图框的顶部和底部之间
var scrollToRowNum = 5;
var scrollToEl = getElementForNode(myTreePanel.getRootNode().childNodes[scrollToRowNum]);
var yCoord = scrollToEl.getOffsetsTo(scrollToEl.parent())[1];
// Animated scroll of tree view
myTreePanel.getView().getEl().scrollTo('top', yCoord, true);
// Check every 10ms to see if animation is done, then sync scrollbar
var timerId = setInterval(function() {
if( myTreePanel.isTreeElementWithinVisibleArea(scrollToEl) ) {
clearInterval(timerId);
myTreePanel.setScrollTop(yCoord);
}
}, 10);