【问题标题】:How to make a scroll as real as clicking the scroll bar arrows?如何使滚动像单击滚动条箭头一样真实?
【发布时间】:2015-05-26 13:59:08
【问题描述】:

我想通过悬停某些元素来模拟滚动条箭头的点击。 基本示例:

function scrollBody(dir, speed){
    $('html, body').animate(
        {'scrollTop': dir+'='+speed+'px'},
        {duration: 300, easing: 'easeOutQuad'}
    );
};
$('#top').hover(function(){scrollBody('-', '50')});
$('#bottom').hover(function(){scrollBody('+', '50')});
$('#top-fast').hover(function(){scrollBody('-', '150')});
$('#bottom-fast').hover(function(){scrollBody('+', '150')});
#content{width: 300px}
.scroller{
    position: fixed;
    background-color: grey;
    color: white;
    right:0;
    padding: 5px;
    width: 35px;
}
.scroller:hover{background-color:green}
#top{top:35px}
#bottom{bottom:35px}
#top-fast{top:0}
#bottom-fast{bottom:0}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.16/jquery-ui.min.js"></script>
<div id="content">
  Lorem ipsum dolor sit amet   Lorem ipsum dolor sit amet   Lorem ipsum dolor sit amet   Lorem ipsum dolor Lorem ipsum dolor sit amet   Lorem ipsum dolor sit amet   Lorem ipsum dolor Lorem ipsum dolor sit amet   Lorem ipsum dolor sit amet   Lorem ipsum dolor Lorem ipsum dolor sit amet   Lorem ipsum dolor sit amet   Lorem ipsum dolor Lorem ipsum dolor sit amet   Lorem ipsum dolor sit amet   Lorem ipsum dolor sit amet   Lorem ipsum dolor sit amet   Lorem ipsum dolor sit amet   Lorem ipsum dolor sit amet   Lorem ipsum dolor sit amet   Lorem ipsum dolor sit amet   Lorem ipsum dolor sit amet   Lorem ipsum dolor sit amet   Lorem ipsum dolor sit amet   Lorem ipsum dolor sit amet   Lorem ipsum dolor sit amet   Lorem ipsum dolor sit amet   Lorem ipsum dolor sit amet Lorem ipsum dolor sit amet   Lorem ipsum dolor sit amet   Lorem ipsum dolor sit amet   Lorem ipsum dolor Lorem ipsum dolor sit amet   Lorem ipsum dolor sit amet   Lorem ipsum dolor Lorem ipsum dolor sit amet   Lorem ipsum dolor sit amet   Lorem ipsum dolor Lorem ipsum dolor sit amet   Lorem ipsum dolor sit amet   Lorem ipsum dolor Lorem ipsum dolor sit amet   Lorem ipsum dolor sit amet   Lorem ipsum dolor sit amet   Lorem ipsum dolor sit amet   Lorem ipsum dolor sit amet   Lorem ipsum dolor sit amet   Lorem ipsum dolor sit amet   Lorem ipsum dolor sit amet   Lorem ipsum dolor sit amet   Lorem ipsum dolor sit amet   Lorem ipsum dolor sit amet   Lorem ipsum dolor sit amet   Lorem ipsum dolor sit amet   Lorem ipsum dolor sit amet   Lorem ipsum dolor sit amet Lorem ipsum dolor sit amet   Lorem ipsum dolor sit amet   Lorem ipsum dolor sit amet   Lorem ipsum dolor Lorem ipsum dolor sit amet   Lorem ipsum dolor sit amet   Lorem ipsum dolor Lorem ipsum dolor sit amet   Lorem ipsum dolor sit amet   Lorem ipsum dolor Lorem ipsum dolor sit amet   Lorem ipsum dolor sit amet   Lorem ipsum dolor Lorem ipsum dolor sit amet   Lorem ipsum dolor sit amet   Lorem ipsum dolor sit amet   Lorem ipsum dolor sit amet   Lorem ipsum dolor sit amet   Lorem ipsum dolor sit amet   Lorem ipsum dolor sit amet   Lorem ipsum dolor sit amet   Lorem ipsum dolor sit amet   Lorem ipsum dolor sit amet   Lorem ipsum dolor sit amet   Lorem ipsum dolor sit amet   Lorem ipsum dolor sit amet   Lorem ipsum dolor sit amet   Lorem ipsum dolor sit amet 
</div>
<div id="top" class="scroller">
  2Top
</div>
<div id="bottom" class="scroller">
  2Bot
</div>
<div id="top-fast" class="scroller">
  2T++
</div>
<div id="bottom-fast" class="scroller">
  2B++
</div>

我知道,它非常简单,更糟糕的是,它有问题...您需要四处移动光标以使其保持滚动。 我想把它变成一个连续平滑的滚动。

在这之后我simply turned it recursively (fiddle) 但我得到了堆栈溢出(控制台),我应该在某个时候使用stopPropagation(在几次递归之后)还是循环而不是使用悬停的切换(到不悬停时停止)或其他什么?

如果你知道其他方法(没有 jQuery-UI 来平滑它,甚至根本没有 jQuery),我将不胜感激!

【问题讨论】:

    标签: javascript jquery html scroll onhover


    【解决方案1】:

    为某个类提供您想要此悬停行为的所有元素。
    脏检查鼠标是否在这些元素上方。
    以所需的速度发送相应的点击/激活滚动,或者只要悬停处于活动状态。

    更新

    这是一个有效的 sn-p。除了 JS 之外,小提琴没有任何变化。 由于超时,停止滚动有点延迟。 相关文档:

    var actions;
    
    function scroll(dir, speed){
            $('html, body').animate(
            {'scrollTop': dir+'='+speed+'px'},
            {duration: 300, easing: 'easeOutQuad'}
            );
    };
    
    function startScroll(dir, speed){
        actions = setTimeout(function(){
            scroll(dir, speed);
            startScroll(dir, speed);
        }, 300);
    
    };
    
    function endScroll(){
        clearTimeout(actions);    
    }
    $('#top').hover(function(){startScroll('-', '50')}, endScroll);
    $('#bottom').hover(function(){startScroll('+', '50')}, endScroll);
    $('#top-fast').hover(function(){startScroll('-', '150')}, endScroll);
    $('#bottom-fast').hover(function(){startScroll('+', '150')}, endScroll);
    

    hover,尤其是鼠标离开时的第二次回调。
    clearTimeout,因为我们需要它来关闭滚动并停止无限循环。

    【讨论】:

    • 谢谢,在我的 sn-p 中,所有元素都有 scroller 类,我分别为每个元素分配了一个悬停事件,并相应地为它们设置动画。你能提供一个sn-p你的想法吗? (顺便说一句,复制我的,我很感激 :)
    • 好的,我来看看fiddle。不过你真的很亲近。本质上,我会尝试利用hover's handlerOut function。因此,您的第一个函数将开始在给定方向上滚动,而您的第二个函数将结束滚动。我必须查找文档以清除/停止。这有帮助吗?
    • 已更新。不漂亮,但应该让你顺利。请清理干净!
    • +1 非常感谢 :) 非常有创意,从来没有想过会这样! Here's the updated fiddle。但是,我仍然想找到一种方法来停止打嗝(暂停和启动)。如果没有人弄清楚,我会在稍后将答案标记为已接受。
    • 打嗝只是与较长的超时有关。尝试使用它们,为无限循环的每次迭代滚动延迟和距离。 (尽管可以公平地假设它会随着您的应用程序变得非常大而再次变慢。)
    猜你喜欢
    • 2010-11-20
    • 2013-11-03
    • 1970-01-01
    • 2020-11-17
    • 1970-01-01
    • 2020-04-28
    • 2012-02-06
    • 2015-03-24
    • 2017-09-23
    相关资源
    最近更新 更多