我制作了一个简单的抓取演示页面。它没有任何缓动/加速。我想使用 JavaScript 在kulesh.info(Flash 网站)上做同样的缓动/加速。我怎样才能做到这一点?
JavaScript 中平滑抓取(滚动、拖动)的任何示例以及与语言无关的算法都会有所帮助。
我制作了一个简单的抓取演示页面。它没有任何缓动/加速。我想使用 JavaScript 在kulesh.info(Flash 网站)上做同样的缓动/加速。我怎样才能做到这一点?
JavaScript 中平滑抓取(滚动、拖动)的任何示例以及与语言无关的算法都会有所帮助。
我认为这是使用 jQuery 可以获得的最佳效果:[演示]
jQuery.fx.interval = 1; // since v1.4.3
var photos = $(".photos");
var scrollLeft = photos[0].scrollLeft;
var $el = $(photos[0]);
var lastTime = +new Date();
$(window).mousemove(function(event){
var now = +new Date();
var elapsed = now - lastTime;
if (dragging && elapsed > 10) {
scrollLeft += x - event.clientX;
$el.stop().animate({scrollLeft: scrollLeft}, 300, "easeOutCubic");
x = event.clientX;
lastTime = +new Date();
}
});
$(window).mouseup(function(event){
dragging = false;
$el.stop().animate({scrollLeft: scrollLeft}, 500, "easeOutCubic");
});
请注意,目前无法纠正所有可能的(轻微)迟缓,因为它与现代浏览器的图像渲染性能有关。测试- 简单的线性动画,没有事件,没有 jQuery
您可以使用有时被称为芝诺悖论的缓动方程来获得闪光外观。
position += (destination - position) / damping
我修改了你的 jsFiddle 以利用它:看看
如果您希望我更详细地描述芝诺悖论,请告诉我,我会在此处发布一两张图片。
尝试替换此行:
photos[0].scrollLeft += x - event.clientX;
有了这个(更新的演示):
photos.animate({ scrollLeft : '+=' + (x - event.clientX) }, 12, 'easeOutCirc');
请注意,我单击了 jQuery UI 以包含缓动选项。此外,它在 jFiddle(使用 Firefox)演示中非常令人兴奋,但是当我在桌面上测试它或在 Chrome 中查看该演示时,它根本不会这样做。理想情况下,最好使用缓动函数而不使用 jQuery animate。但这应该给你一个想法。
var dragging = false;
var x, startX, startTime, stopTime;
var photos = $(".photos");
photos.mousedown(function(event){
dragging = true;
startX = x = event.clientX;
startTime = new Date();
event.preventDefault();
});
$(window).mousemove(function(event){
if (dragging) {
photos[0].scrollLeft += x - event.clientX;
stopTime = new Date();
x = event.clientX;
}
});
$(window).mouseup(function(event){
dragging = false;
var left = photos[0].scrollLeft;
var dx = (startX - event.clientX);
var time = stopTime - startTime;
var speed =time/dx;
photos.animate({ scrollLeft : (left + dx*time/500), easing :'swing' }, 100/time*1000);
});