0

我用鼠标滚动了一个图像。

图像滚动到基于窗口高度的鼠标位置百分比的位置。

$(imageContainer).mouseenter(function(e){
    var scrollingTo = ((e.pageY/$(this).height())-.083) * ( $(imageContainer).prop('scrollHeight') - $(imageContainer).height() );
    hijacked = true;
    $(imageContainer).animate({scrollTop:scrollingTo},300,function(){hijacked=false;});
}).mousemove(function(e){
    if(hijacked) return;
    var scrollingTo = ((e.pageY/$(this).height())-.083) * ( $(imageContainer).prop('scrollHeight') - $(imageContainer).height() );
    $(imageContainer).scrollTop(scrollingTo);
}); 

所以。在那一行

$(imageContainer).animate({scrollTop:scrollingTo},300,function(){hijacked=false;});

我想要那个 scrollingTo 改变。因为在动画期间,用户可以移动鼠标,改变 scrollingTo 变量。

4

1 回答 1

2

好吧,我设法一起制作了一种动态改变动画的骇人听闻的方法。我对 jQuery 的内部动画队列的理解不是很好,但据我所知,除了让它停止之外,没有办法改变排队的动画。无论如何,这是改变位置的示例的关键代码,它应该适用于滚动(以小提琴形式):

$(document).ready(function () {
    var last_update = 0;
    $(document).on("mousemove", function (e) {
        if (Date.now() - last_update > 50) {
            $mover = $("#mover");
            $mover.stop(); 
            $mover.animate({ left: e.pageX, top: e.pageY}, 200, "linear");            
            last_update = Date.now();
        }
    });                    
});

有一些技巧可以让它发挥作用,我将通过它们并尝试解释我认为它们如何适应滚动:

  • 主要思想是,在 mousemove 上,先前的事件被取消,并开始一个新的事件。我认为这不需要任何滚动更改。

  • 某些形式的动画在动画过程中会加速/减速 - 在不断变化的动画中保持这一点太难了(至少在没有编写自定义动画函数的情况下),因此动画缓动设置为“线性”。

  • 快速变化的动画需要时间(尤其是对于像 mousemove 这样常见的事件),因此动画的变化频率是有限制的。在对动画进行更改之前,确保在最后 0.05 秒内没有进行任何更改(这是通过“last_update”完成的)。

我相信如果您只是将动画属性换成自己的(scrollTop),这应该可以满足您的需求。

于 2012-09-13T19:22:31.447 回答