Py学习  »  Jquery

当内容位于可见视区时启动jquery动画

Cray • 4 年前 • 1798 次点击  

我正在通过ajax加载元素。其中一些只有向下滚动页面时才可见。
有没有办法让我知道一个元素现在是否在页面的可见部分?

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/44325
 
1798 次点击  
文章 [ 30 ]  |  最新文章 4 年前
pie6k
Reply   •   1 楼
pie6k    7 年前

我更喜欢使用jquery expr

jQuery.extend(jQuery.expr[':'], {  
    inview: function (elem) {
        var t = $(elem);
        var offset = t.offset();
        var win = $(window); 
        var winST = win.scrollTop();
        var elHeight = t.outerHeight(true);

        if ( offset.top > winST - elHeight && offset.top < winST + elHeight + win.height()) {
            return true;    
        }    
        return false;  
    }
});

所以你可以用这种方式

$(".my-elem:inview"); //returns only element that is in view
$(".my-elem").is(":inview"); //check if element is in view
$(".my-elem:inview").length; //check how many elements are in view

你可以很容易地在里面添加这样的代码 scroll 事件功能等,每次用户滚动视图时检查。

Sonny Lloyd
Reply   •   2 楼
Sonny Lloyd    8 年前

我正在寻找一种方法来查看元素是否会很快出现在视图中,因此通过扩展上面的片段,我成功地做到了这一点。我想我会把这个留在这里以防万一

elm=要检查的元素是否在视图中

scrollement=您可以通过 窗口 或具有滚动条的父元素

offset=如果你想在元素在屏幕前200px时触发它,那么通过200

function isScrolledIntoView(elem, scrollElement, offset)
        {
            var $elem = $(elem);
            var $window = $(scrollElement);
            var docViewTop = $window.scrollTop();
            var docViewBottom = docViewTop + $window.height();
            var elemTop = $elem.offset().top;
            var elemBottom = elemTop + $elem.height();
            
            return (((elemBottom+offset) >= docViewBottom) && ((elemTop-offset) <= docViewTop)) || (((elemBottom-offset) <= docViewBottom) && ((elemTop+offset) >= docViewTop));
        }
hashchange
Reply   •   3 楼
hashchange    9 年前

我已经写了 a component 对于任务,设计用于处理大量元素 extremely fast (1000个元素的10毫秒 在慢速移动设备上 )

它适用于您可以访问“窗口、html元素、嵌入iframe、派生子窗口”的每种类型的滚动容器,并且在检测到的内容上非常灵活( full or partial visibility , border box or content box 习俗 tolerance zone , etc )

一个巨大的,主要是自动生成的测试套件确保了它能像宣传的那样工作, cross-browser .

如果你愿意,可以试试: jQuery.isInView . 否则,您可能会在源代码中找到灵感,例如。 here .

Lorenz Lo Sauer
Reply   •   4 楼
Lorenz Lo Sauer    9 年前

我修改了这个简短的jquery函数扩展,您可以随意使用(mit license)。

/**
 * returns true if an element is visible, with decent performance
 * @param [scope] scope of the render-window instance; default: window
 * @returns {boolean}
 */
jQuery.fn.isOnScreen = function(scope){
    var element = this;
    if(!element){
        return;
    }
    var target = $(element);
    if(target.is(':visible') == false){
        return false;
    }
    scope = $(scope || window);
    var top = scope.scrollTop();
    var bot = top + scope.height();
    var elTop = target.offset().top;
    var elBot = elTop + target.height();

    return ((elBot <= bot) && (elTop >= top));
};
Derrick J Wippler
Reply   •   5 楼
Derrick J Wippler    9 年前

可滚动div(container)的简单修改

var isScrolledIntoView = function(elem, container) {
    var containerHeight = $(container).height();
    var elemTop = $(elem).position().top;
    var elemBottom = elemTop + $(elem).height();
    return (elemBottom > 0 && elemTop < containerHeight);
}

注意:如果元素大于可滚动div,则此操作不起作用。

Rafael Garcia
Reply   •   6 楼
Rafael Garcia    9 年前

如果元素的任何部分在页面上可见,则此方法将返回true。在我的情况下效果更好,可能会帮助别人。

function isOnScreen(element) {
  var elementOffsetTop = element.offset().top;
  var elementHeight = element.height();

  var screenScrollTop = $(window).scrollTop();
  var screenHeight = $(window).height();

  var scrollIsAboveElement = elementOffsetTop + elementHeight - screenScrollTop >= 0;
  var elementIsVisibleOnScreen = screenScrollTop + screenHeight - elementOffsetTop >= 0;

  return scrollIsAboveElement && elementIsVisibleOnScreen;
}
Community Fernando Kosh
Reply   •   7 楼
Community Fernando Kosh    6 年前

一个基于 this answer 检查一个元素是否75%可见(即屏幕上显示的元素少于25%)。

function isScrolledIntoView(el) {
  // check for 75% visible
  var percentVisible = 0.75;
  var elemTop = el.getBoundingClientRect().top;
  var elemBottom = el.getBoundingClientRect().bottom;
  var elemHeight = el.getBoundingClientRect().height;
  var overhang = elemHeight * (1 - percentVisible);

  var isVisible = (elemTop >= -overhang) && (elemBottom <= window.innerHeight + overhang);
  return isVisible;
}
bmlkc
Reply   •   8 楼
bmlkc    9 年前

这里是一种使用mootools在水平、垂直或两者中实现相同功能的方法。

Element.implement({
inVerticalView: function (full) {
    if (typeOf(full) === "null") {
        full = true;
    }

    if (this.getStyle('display') === 'none') {
        return false;
    }

    // Window Size and Scroll
    var windowScroll = window.getScroll();
    var windowSize = window.getSize();
    // Element Size and Scroll
    var elementPosition = this.getPosition();
    var elementSize = this.getSize();

    // Calculation Variables
    var docViewTop = windowScroll.y;
    var docViewBottom = docViewTop + windowSize.y;
    var elemTop = elementPosition.y;
    var elemBottom = elemTop + elementSize.y;

    if (full) {
        return ((elemBottom >= docViewTop) && (elemTop <= docViewBottom)
            && (elemBottom <= docViewBottom) && (elemTop >= docViewTop) );
    } else {
        return ((elemBottom <= docViewBottom) && (elemTop >= docViewTop));
    }
},
inHorizontalView: function(full) {
    if (typeOf(full) === "null") {
        full = true;
    }

    if (this.getStyle('display') === 'none') {
        return false;
    }

    // Window Size and Scroll
    var windowScroll = window.getScroll();
    var windowSize = window.getSize();
    // Element Size and Scroll
    var elementPosition = this.getPosition();
    var elementSize = this.getSize();

    // Calculation Variables
    var docViewLeft = windowScroll.x;
    var docViewRight = docViewLeft + windowSize.x;
    var elemLeft = elementPosition.x;
    var elemRight = elemLeft + elementSize.x;

    if (full) {
        return ((elemRight >= docViewLeft) && (elemLeft <= docViewRight)
            && (elemRight <= docViewRight) && (elemLeft >= docViewLeft) );
    } else {
        return ((elemRight <= docViewRight) && (elemLeft >= docViewLeft));
    }
},
inView: function(full) {
    return this.inHorizontalView(full) && this.inVerticalView(full);
}});
evanmcd
Reply   •   9 楼
evanmcd    10 年前

修改了接受的答案,以便元素必须将其display属性设置为“none”以外的值,才能使质量保持可见。

function isScrolledIntoView(elem) {
   var docViewTop = $(window).scrollTop();
  var docViewBottom = docViewTop + $(window).height();

  var elemTop = $(elem).offset().top;
  var elemBottom = elemTop + $(elem).height();
  var elemDisplayNotNone = $(elem).css("display") !== "none";

  return ((elemBottom <= docViewBottom) && (elemTop >= docViewTop) && elemDisplayNotNone);
}
Samiya Akhtar
Reply   •   10 楼
Samiya Akhtar    11 年前

如果你想调整这个在另一个div中滚动项目,

function isScrolledIntoView (elem, divID) 

{

    var docViewTop = $('#' + divID).scrollTop();


    var docViewBottom = docViewTop + $('#' + divID).height();

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

    return ((elemBottom <= docViewBottom) && (elemTop >= docViewTop)); 
}
Romain Linsolas
Reply   •   11 楼
Romain Linsolas    15 年前

我的应用程序中有这样一个方法,但它不使用jquery:

/* Get the TOP position of a given element. */
function getPositionTop(element){
    var offset = 0;
    while(element) {
        offset += element["offsetTop"];
        element = element.offsetParent;
    }
    return offset;
}

/* Is a given element is visible or not? */
function isElementVisible(eltId) {
    var elt = document.getElementById(eltId);
    if (!elt) {
        // Element not found.
        return false;
    }
    // Get the top and bottom position of the given element.
    var posTop = getPositionTop(elt);
    var posBottom = posTop + elt.offsetHeight;
    // Get the top and bottom position of the *visible* part of the window.
    var visibleTop = document.body.scrollTop;
    var visibleBottom = visibleTop + document.documentElement.offsetHeight;
    return ((posBottom >= visibleTop) && (posTop <= visibleBottom));
}

编辑:这种方法对i.e.(至少版本6)很有效。请阅读注释以了解与FF的兼容性。

Community Fernando Kosh
Reply   •   12 楼
Community Fernando Kosh    6 年前

建造 this great answer ,您可以使用ES2015+进一步简化它:

function isScrolledIntoView(el) {
  const { top, bottom } = el.getBoundingClientRect()
  return top >= 0 && bottom <= window.innerHeight
}

如果你不在乎顶部从窗口出来,只在乎底部已经被看到,这可以简化为

function isSeen(el) {
  return el.getBoundingClientRect().bottom <= window.innerHeight
}

甚至是一行

const isSeen = el => el.getBoundingClientRect().bottom <= window.innerHeight
Vasuki Dileep
Reply   •   13 楼
Vasuki Dileep    9 年前

您可以使用jquery插件“onscreen”在滚动时检查元素是否在当前视图中。 当选择器出现在屏幕上时,插件将选择器的“:on screen”设置为true。 这是插件的链接,可以包含在项目中。 “ http://benpickles.github.io/onScreen/jquery.onscreen.min.js

你可以试试下面这个对我有用的例子。

$(document).scroll(function() {
    if($("#div2").is(':onScreen')) {
        console.log("Element appeared on Screen");
        //do all your stuffs here when element is visible.
    }
    else {
        console.log("Element not on Screen");
        //do all your stuffs here when element is not visible.
    }
});

HTML代码:

<div id="div1" style="width: 400px; height: 1000px; padding-top: 20px; position: relative; top: 45px"></div> <br>
<hr /> <br>
<div id="div2" style="width: 400px; height: 200px"></div>

CSS:

#div1 {
    background-color: red;
}
#div2 {
    background-color: green;
}
Pedro Bernardo Denis Matafonov
Reply   •   14 楼
Pedro Bernardo Denis Matafonov    5 年前

纯香草味,检查元素是否( el )在可滚动div中可见( holder )

function isElementVisible (el, holder) {
  holder = holder || document.body
  const { top, bottom, height } = el.getBoundingClientRect()
  const holderRect = holder.getBoundingClientRect()

  return top <= holderRect.top
    ? holderRect.top - top <= height
    : bottom - holderRect.bottom <= height
},

使用jquery:

var el = $('tr:last').get(0);
var holder = $('table').get(0);
isVisible =  isScrolledIntoView(el, holder);
Brett Zamir Pigmalión
Reply   •   15 楼
Brett Zamir Pigmalión    9 年前

我需要检查可滚动div容器中元素的可见性

    //p = DIV container scrollable
    //e = element
    function visible_in_container(p, e) {
        var z = p.getBoundingClientRect();
        var r = e.getBoundingClientRect();

        // Check style visiblilty and off-limits
        return e.style.opacity > 0 && e.style.display !== 'none' &&
               e.style.visibility !== 'hidden' &&
               !(r.top > z.bottom || r.bottom < z.top ||
                 r.left > z.right || r.right < z.left);
    }
Adrian P.
Reply   •   16 楼
Adrian P.    10 年前

这是另一个解决方案 http://web-profile.com.ua/

<script type="text/javascript">
$.fn.is_on_screen = function(){
    var win = $(window);
    var viewport = {
        top : win.scrollTop(),
        left : win.scrollLeft()
    };
    viewport.right = viewport.left + win.width();
    viewport.bottom = viewport.top + win.height();

    var bounds = this.offset();
    bounds.right = bounds.left + this.outerWidth();
    bounds.bottom = bounds.top + this.outerHeight();

    return (!(viewport.right < bounds.left || viewport.left > bounds.right ||    viewport.bottom < bounds.top || viewport.top > bounds.bottom));
 };

if( $('.target').length > 0 ) { // if target element exists in DOM
    if( $('.target').is_on_screen() ) { // if target element is visible on screen after DOM loaded
        $('.log').html('<div class="alert alert-success">target element is visible on screen</div>'); // log info       
    } else {
        $('.log').html('<div class="alert">target element is not visible on screen</div>'); // log info
    }
}
$(window).scroll(function(){ // bind window scroll event
if( $('.target').length > 0 ) { // if target element exists in DOM
    if( $('.target').is_on_screen() ) { // if target element is visible on screen after DOM loaded
        $('.log').html('<div class="alert alert-success">target element is visible on screen</div>'); // log info
    } else {
        $('.log').html('<div class="alert">target element is not visible on screen</div>'); // log info
    }
}
});
</script>

看到它 JSFiddle

ness-EE
Reply   •   17 楼
ness-EE    5 年前

有一个 plugin for jQuery called inview 增加了一个新的“因维”事件。


以下是不使用事件的jquery插件的一些代码:

$.extend($.expr[':'],{
    inView: function(a) {
        var st = (document.documentElement.scrollTop || document.body.scrollTop),
            ot = $(a).offset().top,
            wh = (window.innerHeight && window.innerHeight < $(window).height()) ? window.innerHeight : $(window).height();
        return ot > st && ($(a).height() + ot) < (st + wh);
    }
});

(function( $ ) {
    $.fn.inView = function() {
        var st = (document.documentElement.scrollTop || document.body.scrollTop),
        ot = $(this).offset().top,
        wh = (window.innerHeight && window.innerHeight < $(window).height()) ? window.innerHeight : $(window).height();

        return ot > st && ($(this).height() + ot) < (st + wh);
    };
})( jQuery );

我在这里的评论中发现了这个( http://remysharp.com/2009/01/26/element-in-view-event-plugin/ )一个叫詹姆斯的家伙

Brent Barbata
Reply   •   18 楼
Brent Barbata    9 年前

这将考虑元素所具有的任何填充、边框或边距以及大于视口本身的元素。

function inViewport($ele) {
    var lBound = $(window).scrollTop(),
        uBound = lBound + $(window).height(),
        top = $ele.offset().top,
        bottom = top + $ele.outerHeight(true);

    return (top > lBound && top < uBound)
        || (bottom > lBound && bottom < uBound)
        || (lBound >= top && lBound <= bottom)
        || (uBound >= top && uBound <= bottom);
}

用这样的话来称呼它:

var $myElement = $('#my-element'),
    canUserSeeIt = inViewport($myElement);

console.log(canUserSeeIt); // true, if element is visible; false otherwise
Pascal Gagneur
Reply   •   19 楼
Pascal Gagneur    14 年前
function isScrolledIntoView(elem) {
    var docViewTop = $(window).scrollTop(),
        docViewBottom = docViewTop + $(window).height(),
        elemTop = $(elem).offset().top,
     elemBottom = elemTop + $(elem).height();
   //Is more than half of the element visible
   return ((elemTop + ((elemBottom - elemTop)/2)) >= docViewTop && ((elemTop + ((elemBottom - elemTop)/2)) <= docViewBottom));
}
Robert
Reply   •   20 楼
Robert    10 年前

牛角豆视图 是一个非常需要的函数,所以我尝试了它,它对比视窗高的元素有效,但是如果元素比视窗大,它就不起作用。为了解决这个问题很容易改变状况

return ((elemBottom <= docViewBottom) && (elemTop >= docViewTop));

对此:

return (docViewBottom >= elemTop && docViewTop <= elemBottom);

请参见此处的演示: http://jsfiddle.net/RRSmQ/