javascript - 在 JavaScript/jQuery 中,是否可以在滚动时跟踪页面上多个 HTML 元素的可见性?

标签 javascript jquery html css scroll

我正在做一个元素,我正在跟踪页面上的某些元素当前是否在 View 中。到目前为止,我有:

// wait til code loads so it can grab DOM elements
$(window).load(function () {  
  // scrolling...
  $(window).scroll(function () {
    // do this if any of the element is within view; otherwise, it is invisible
    if ( ($('div').offset().top < ( $(window).height() + $(window).scrollTop() )) && ( ($('div').offset().top + $('div').height()) > $(window).scrollTop() ) ) {
      console.log( $('div').attr('class') + " visible");
    } else {
      console.log( $('div').attr('class') + " invisible");
    }
  });
});

这会准确地跟踪一个元素,即第一个加载到页面上的 div。诀窍是使用类似 var element = document.querySelectorAll('div'); 的方式收集数组。然而,我的实现仍然没有成功:

$(window).load(function() {
    var elems, i;
    // select all div elements
    elems = document.querySelectorAll("div");
    // iterate through array
    for (i = 0; i < elems.length; i++) {
        document.addEventListener("scroll", function() {
            if ( ($(elems[i]).offset().top < ( $(window).height() + $(window).scrollTop() )) && ( ($(elems[i]).offset().top + $(elems[i]).height()) \
> $(window).scrollTop() ) ) {
                console.log( $(elems[i].html()) + " visible");
            } else {
                console.log( $(elems[i]).html() + " invisible");
            }
        });
    }
});

假设页面上有 5 个 div。是否可以同时跟踪每个 div 的可见性(或者我们选择使用 document.querySelectorAll("...") 选择的任何内容?

非常感谢您的帮助,我希望很多人都能试一试这段代码,因为使用它非常有趣!

最佳答案

我很确定已经有一个插件可以做到这一点(我敦促你去寻找一个),但为了解释:

$.expr[':'].inview = function(a, i, m) {
    var $win = $(window),
        $elem = $(a),
        viewportTop = $win.scrollTop(),
        viewportBottom = viewportTop + $win.height(),
        elemTop = $elem.offset().top,
        elemBottom = elemTop + $elem.height();

    return (elemTop >= viewportTop && elemTop < viewportBottom) ||
           (elemBottom > viewportTop && elemBottom <= viewportBottom);
};

现在您可以:

$(function () {  
    $(window).scroll(function () {
       $("div:inview").whatever();
    });
});

$(function () {  
    $(window).scroll(function () {
       $("div:not(:inview)").whatever();
    });
});

关于javascript - 在 JavaScript/jQuery 中,是否可以在滚动时跟踪页面上多个 HTML 元素的可见性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26921536/

相关文章:

javascript - 在服务器上的 session 管理的所有请求中传递参数

javascript - JS - 在 JSON 文件中插入、删除和添加数据

android - 如何使用 jquery 或元标记禁用 android webview 中的缩放 View ?

html - 在移动设备上禁用所有 CSS

html - css hover 想显示一个框

JavaScript:获取对象的第一个也是唯一的属性名称

javascript - 在 Javascript 中以增量顺序显示问题列表

jQuery 渲染为 pdf

html - 尽管删除了旧的样式表,替换后的导航栏仍具有与旧的样式表冲突的样式表

javascript - 如何将 Liquid 数组转换为 Javascript 数组?