检测可滚动div中的元素何时不在视图中

Ron*_*nny 17 html javascript jquery tracking viewport

我需要找到一个解决以下问题的好方法.我看到很多人都在询问是否有一个元素在页面或浏览器窗口的视图Port的内部或外部.我需要能够复制这个动作,但是在滚动的DIV中,有溢出:滚动例如.有没有人知道这个具体行动的好例子?

提前致谢.

Akr*_*awy 27

我以前遇到过同样的问题,我最后得到了以下函数.第一个参数是元素检查,第二个是检查元素是否部分in-view.it仅用于垂直检查,你可以扩展检查水平滚动.

function checkInView(elem,partial)
{
    var container = $(".scrollable");
    var contHeight = container.height();
    var contTop = container.scrollTop();
    var contBottom = contTop + contHeight ;

    var elemTop = $(elem).offset().top - container.offset().top;
    var elemBottom = elemTop + $(elem).height();

    var isTotal = (elemTop >= 0 && elemBottom <=contHeight);
    var isPart = ((elemTop < 0 && elemBottom > 0 ) || (elemTop > 0 && elemTop <= container.height())) && partial ;

    return  isTotal  || isPart ;
}
Run Code Online (Sandbox Code Playgroud)

jsFiddle上查看它.

  • 谢谢。我已经看到了不同的解决方案,这是完成它的最清晰、最干净的方法。谢谢! (2认同)

Ada*_*eis 19

这是一个纯粹的javascript版本的接受答案,不依赖于jQuery,并修复部分视图检测和支持顶视图.

function checkInView(container, element, partial) {

    //Get container properties
    let cTop = container.scrollTop;
    let cBottom = cTop + container.clientHeight;

    //Get element properties
    let eTop = element.offsetTop;
    let eBottom = eTop + element.clientHeight;

    //Check if in view    
    let isTotal = (eTop >= cTop && eBottom <= cBottom);
    let isPartial = partial && (
      (eTop < cTop && eBottom > cTop) ||
      (eBottom > cBottom && eTop < cBottom)
    );

    //Return outcome
    return  (isTotal  || isPartial);
}
Run Code Online (Sandbox Code Playgroud)

作为奖励,此功能可确保元素在视图中(如果不是(部分或完整)):

function ensureInView(container, element) {

    //Determine container top and bottom
    let cTop = container.scrollTop;
    let cBottom = cTop + container.clientHeight;

    //Determine element top and bottom
    let eTop = element.offsetTop;
    let eBottom = eTop + element.clientHeight;

    //Check if out of view
    if (eTop < cTop) {
      container.scrollTop -= (cTop - eTop);
    }
    else if (eBottom > cBottom) {
      container.scrollTop += (eBottom - cBottom);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 现在这个 `element.scrollIntoView()` 函数可以正常工作:https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollIntoView 对于确保元素可见很有用 (2认同)

Jon*_*gan 6

基于最佳答案。而不是仅仅告诉你一个元素是否部分可见。我添加了一些额外的内容,以便您可以传入一个百分比 (0-100),告诉您元素是否超过 x% 可见。

function (container, element, partial) {
    var cTop = container.scrollTop;
    var cBottom = cTop + container.clientHeight;
    var eTop = element.offsetTop;
    var eBottom = eTop + element.clientHeight;
    var isTotal = (eTop >= cTop && eBottom <= cBottom);
    var isPartial;

    if (partial === true) {
        isPartial = (eTop < cTop && eBottom > cTop) || (eBottom > cBottom && eTop < cBottom);
    } else if(typeof partial === "number"){
        if (eTop < cTop && eBottom > cTop) {
            isPartial = ((eBottom - cTop) * 100) / element.clientHeight > partial;
        } else if (eBottom > cBottom && eTop < cBottom){ 
            isPartial = ((cBottom - eTop) * 100) / element.clientHeight > partial;
        }
    }
    return (isTotal || isPartial);
}
Run Code Online (Sandbox Code Playgroud)

  • 是的,我喜欢避免使用 jQuery (4认同)