繁体   English   中英

跟踪元素之外的滚动位置

[英]Track the scroll position beyond elements

我正在组装一个jQuery插件。 该插件将面板,并自动调整其高度。 所以我从这样的事情开始:

<div class="panel">Test 1</div>
<div class="panel">Test 2</div>
<div class="panel">Test 3</div>

该代码看起来像:

    sizePanels: function(){
      panels.each(function(){
        $(this).height(docHeight);
      });
    },

有一个向下按钮,单击该按钮会将用户带到下一个$(“。panel):

nextPanel: function(){
  $.scrollTo($(".panel:eq(" + panelIndex + ")"), 250, { easing: "swing" });
}

这样,我就可以跟踪其所在的面板索引:

    if (panelIndex < (panelCount - 1) ) {
      panelIndex += 1;
    }

我试图找出一种方法来跟踪它们是否发生手动滚动,并传递一个元素,然后增加“ panelIndex”,以使按钮不会将它们向上而不是向下移动,因为它从未由于用户使用滚动条而不是按钮,因此适当地增加了。 这是我到目前为止的内容:

   $(window).scroll(function(){
    panels.each(function(index){
      if ($(window).scrollTop() > $(this).scrollTop()) { 
        panelIndex = index; 
        // console.log(index);
      }
    });

    if (panelIndex < panelCount - 1){
      s.showDownButton();
    }
  });

该代码检查过多,感觉有些落伍。 有更好的方法吗?

一种简单的优化方法是只计算一次scrollTop,并在找到匹配项时退出每个循环。 您可以通过返回false退出$ .each循环。

$(window).scroll(function(){
    var scrollTop = $(window).scrollTop();
    panels.each(function(index){
        if (scrollTop > $(this).scrollTop()) { 
            panelIndex = index; 
        } else {
            return false;
        }
    });

    if (panelIndex < panelCount - 1){
        s.showDownButton();
    }
});

我建议优化的另一种方法是在页面加载时(以及调整视口大小时)预先计算每个面板的scrollTop。 如果将这些值存储在数组中,则可以非常快速地遍历它们。

这是一些粗略的代码来说明这个想法:

var panelTops = [];

findPanelTops(); // calculate on load
$(window).on("resize", findPanelTops); // calculate on resize

function findPanelTops() {
    panelTops = [];
    panels.each(function(index) {
        panelTops.push($(this).scrollTop());
    });
}

$(window).scroll(function(){
    var scrollTop = $(window).scrollTop();
    for (var i = 0; i < panelTops.length; i++) {
        if (scrollTop > panelTops[i]) { 
            panelIndex = i;
        } else {
            break;
        }
    };

    if (panelIndex < panelCount - 1){
        s.showDownButton();
    }
});

滚动事件可以快速触发很多事件,因此您希望将计算量保持在最小限度。 解决所有这些问题的一种方法是实现一个scrollend处理程序。 仅在滚动事件似乎已停止时才触发。

这是执行此操作的一些基本代码。 当滚动事件停止超过500毫秒时,它将触发:

var scrollTimeout = null;

function onScroll() {
    if (scrollTimeout) {
        clearTimeout(scrollTimeout);
    }
    scrollTimeout = setTimeout(onScrollEnd, 500);
}

function onScrollEnd() {
    // Scrolling has stopped
    // Do stuff ...

   scrollTimeout = null;
}

$(window).on("scroll", onScroll);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM