当光标位于屏幕的顶部或底部边缘时,如何使用 JQuery/Javascript 向下滚动页面?

Posted

技术标签:

【中文标题】当光标位于屏幕的顶部或底部边缘时,如何使用 JQuery/Javascript 向下滚动页面?【英文标题】:How use JQuery/Javascript to scroll down a page when the cursor at the top or bottom edge of the screen? 【发布时间】:2012-02-25 04:02:44 【问题描述】:

简单,我只想拥有它,这样当用户拖动项目并到达视口的最底部或顶部时(10px 左右),页面 (大约 3000 像素长) 轻轻向下或向上滚动,直到他们将光标 (因此被拖动的项目)移出该区域

一个项目是一个 li 标签,它使用 jquery 使列表项可拖动。具体来说:

../jquery-ui-1.8.14.custom.min.js http://code.jquery.com/jquery-1.6.2.min.js

我目前使用 window.scrollBy(x=0,y=3) 滚动页面并具有以下变量:

    e.pageY ... 提供页面上光标的绝对 Y 坐标(与屏幕无关) $.scrollTop() ... 提供从页面顶部的偏移量(当滚动条一直向上时,它是 0) $.height()... 提供用户浏览器/视口中可视区域的高度 body.offsetHeight ...整个页面的高度

我怎样才能实现这一点,哪个事件最能适应这一点(目前它在鼠标悬停中)? 我的想法:

    使用 if/else 检查它是在顶部还是底部,如果 e.pageY 显示它在顶部,则向上滚动,如果 e.page& 在底部则向下滚动,然后调用 $(' li').mouseover() 事件迭代...
      使用 do while 循环...实际上效果不错,但很难停止滚动到远处。但我不确定如何控制迭代......

我最近的尝试:

          ('li').mouseover(function(e) 

            totalHeight = document.body.offsetHeight;
            cursor.y = e.pageY;
            var papaWindow = window;
            var $pxFromTop = $(papaWindow).scrollTop();
            var $userScreenHeight = $(papaWindow).height();
            var iterate = 0;

            do 
                papaWindow.scrollBy(0, 2);
                iterate++;
                console.log(cursor.y, $pxFromTop, $userScreenHeight);
            

            while (iterate < 20);
      );

【问题讨论】:

仅供参考,我只是担心新的浏览器,主要是 FF 和 Chrome……IE 7 或更低版本在我的“世界”中不存在 嗨,你现在有解决这个问题的有效方法吗?你能贴出来吗?我在这里发布了类似的问题:***.com/questions/11222047/… 【参考方案1】:

现在工作得很好,用户有时只需要在拖动项目时“摇晃”鼠标以保持滚动,但对于仅使用鼠标位置滚动它非常可靠。这是我最终使用的:

 $("li").mouseover(function(e) 

  e = e || window.event; var cursor =  y: 0 ; cursor.y = e.pageY; //Cursor YPos
  var papaWindow = parent.window;
  var $pxFromTop = $(papaWindow).scrollTop();
  var $userScreenHeight = $(papaWindow).height();

  if (cursor.y > (($userScreenHeight + $pxFromTop) / 1.25)) 

         if ($pxFromTop < ($userScreenHeight * 3.2)) 

                   papaWindow.scrollBy(0, ($userScreenHeight / 30));
             
        
  else if (cursor.y < (($userScreenHeight + $pxFromTop) * .75)) 

        papaWindow.scrollBy(0, -($userScreenHeight / 30));

        

   ); //End mouseover()

【讨论】:

if ($pxFromTop 是为了让用户无法向下滚动到列表底部 应该有一个);在你的代码之后。否则会引发错误。 (我无法编辑,因为它少于 6 个字符) 谢谢@LunaticNeko,我更新了,一定是在复制粘贴中漏掉了【参考方案2】:

这不起作用,因为该事件仅在您将鼠标悬停在 li 上时才会触发。

('li').mouseover(function(e)  );

当一个项目被拖动时,您需要能够知道鼠标相对于视口的位置。当用户开始拖动项目时,将“mousemove”事件附加到主体,然后在其中检查鼠标位置并在必要时滚动。

$("body").on("mousemove", function(event) 
// Check mouse position - scroll if near bottom or top
);

不要忘记在用户停止拖动时删除您的事件。

$("body").off("mousemove", function(event) 
// Check mouse position - scroll if near bottom or top
);

【讨论】:

谢谢乔恩!我将努力尝试用这个想法来实现它,但乍一看,这似乎解决了我使用哪个事件的困境。如果您可以提供有关计算相对于当前视口的光标位置的公式/逻辑的任何其他内容,我也很想听听!谢谢! 只要我能让它发挥作用,大多数人肯定会接受你的回答。我没有忘记你! (但是鼠标定位逻辑现在真的难倒我,最坏的情况我会接受你的,因为你首先回答了有用的信息) 有什么特别困扰你? 基本上,使用上述变量,试图找到一种动态方法来计算鼠标的位置,并决定我应该向上还是向下滚动。此外,弄清楚如何循环效果或迭代效果,直到用户移动鼠标或放开他们拖动的 li 项目。类似于: if (cursor.y > scrolltop() + $userScreenHeight) scrollBy(0,-rate) else if ( cursor.y 。更喜欢动态计算速率,但将其硬编码为 3 很好,并且可以提供用户可以看到的合理滚动。 您不需要迭代它 - 每次移动鼠标时都会触发 mousemove 事件。如果您在拖动开始时添加事件并在拖动停止时将其删除,那么除了计算鼠标与屏幕顶部或底部的距离外,您无需担心任何事情。您也可以通过增加鼠标越靠近屏幕顶部或底部来改变速率(尽管我会让它以恒定的滚动速率工作,然后再担心)。【参考方案3】:

这可能不是您想要的,但它可能会有所帮助。当鼠标悬停在“屏幕边框”(用户定义的区域)上时,它将自动滚动。假设屏幕右侧有一个 40px 宽的条,如果鼠标到达第一个 1px,它将开始滚动。你每移动一个像素,速度就会增加。它甚至还有一个不错的缓动动画。

http://www.smoothdivscroll.com/v1-2.htm

【讨论】:

看起来很有趣,我明天早上去看看 当然很有帮助,可能是这个解决方案最优雅的形式,但是我需要稍微改进一下。目前,该插件仅配置为左右滚动,而不是上下滚动。我想改变它应该不会太难,如果可以的话,这将是完美的解决方案。不过现在工作太多了!感谢您的回答【参考方案4】:

我收到来自 CodeProject 的每周简报(电子邮件),其中包含一些看起来肯定会解决我的问题的内容......希望这可以帮助其他人:

    http://johnpolacek.github.com/scrollorama/ -- 基于 JQuery 并为滚动设置动画

    https://github.com/IanLunn/jQuery-Parallax -- 基于JQuery,类似上面

    http://remysharp。 com/2009/01/26/element-in-view-event-plugin/ -- JQuery,检测元素当前是否在用户的视野中(对这个问题非常有帮助!)

    #2 中的网站也有一些有趣的代码:

    var windowHeight = $window.height();
    var navHeight = $('#nav').height() / 2;
    var windowCenter = (windowHeight / 2);
    var newtop = windowCenter - navHeight;
    //ToDo: Find a way to use these vars and my original ones to determine scroll regions
    

【讨论】:

以上是关于当光标位于屏幕的顶部或底部边缘时,如何使用 JQuery/Javascript 向下滚动页面?的主要内容,如果未能解决你的问题,请参考以下文章

iOS7 UIToolbar 上缺少阴影(细线)

将动态视图捕捉到屏幕顶部、底部或中间的统一行为

当按钮覆盖在tableview顶部时,如何防止tableview单元注册一个tap?

如果使用 SliverStack,如何使小部件位于屏幕底部?

如何让网页可以用遥控器控制监听

当按钮覆盖在表格视图顶部时,如何防止表格视图单元格注册点击?