当我单击按钮时,我希望能够平滑自动滚动到Polymer 1.0铁清单中的特定元素。
现在,有了scrollToIndex方法,我有了一个简单的自动滚动。
但是我想要一个平滑的动画,如jQuery动画$("#list").animate({ scrollTop: 300 }, 2000);
,但没有jQuery。
我遇到的最大问题之一是,由于Iron-List不能一次显示所有项目,因此我无法找到特定项目的scrollTop位置,因为它尚未在DOM中。
我在这里开始了JSFiddle:http://jsfiddle.net/c52fakyf/2/
谢谢你的帮助!
最佳答案
我刚刚通过requestAnimationFrame学习了动画,然后我想到了这个问题。我做了一个简单的动画方法:
animate: function(callbackObj, duration) {
var requestAnimationFrame = window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame;
var startTime = 0, percentage = 0, animationTime = 0;
duration = duration*1000 || 1000;
var animate = function(timestamp) {
if (startTime === 0) {
startTime = timestamp;
} else {
animationTime = timestamp - startTime;
}
if (typeof callbackObj.start === 'function' && startTime === timestamp) {
callbackObj.start();
requestAnimationFrame(animate);
} else if (animationTime < duration) {
if (typeof callbackObj.progress === 'function') {
percentage = animationTime / duration;
callbackObj.progress(percentage);
}
requestAnimationFrame(animate);
} else if (typeof callbackObj.done === 'function'){
callbackObj.done();
}
};
return requestAnimationFrame(animate);
},
它基本上是一种递归方法,每次刷新屏幕时都会更新。该方法采用在.start,.progress和.done属性下具有函数的回调对象。
我对您的代码做了一些修改:
_autoScroll: function() {
var sequenceObj = {};
var seconds = 2;
var rangeInPixels = 500;
sequenceObj.progress = (function(percentage) {
this.$.itemList.scroll(0, this.easeInOutQuad(percentage)*rangeInPixels);
}).bind(this);
this.animate(sequenceObj, seconds);
},
我从Robert Penner的缓动功能获得了easyInOut:
easeInOutQuad: function (t) { return t<.5 ? 2*t*t : -1+(4-2*t)*t },
和violá:
http://jsfiddle.net/5uLhu6qa/
这并不是您所要的,但这是您可以继续的起点。
关于javascript - 在Polymer 1.0中使用铁列表平滑自动滚动,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44886934/