Find element that's on the middle of the visible screen (viewport), on scroll

前端 未结 3 1999
太阳男子
太阳男子 2021-01-02 10:48

I need to know if there is a way I can determine if a div is in the center of the screen.

HTML:

相关标签:
3条回答
  • 2021-01-02 11:41

    This is nice method: elementFromPoint()

    You can get the element in the center as so:

     var elem = document.elementFromPoint($(window).width()/2, $(window).height()/2);
    
    //if you want jquery element you can get it.
    var jqueryElem = $(elem);
    
    0 讨论(0)
  • 2021-01-02 11:42

    DEMO PAGE

    var findMiddleElement = (function(docElm){
        var viewportHeight = docElm.clientHeight,
            // here i'm using pre-cached DIV elements, but you can use anything you want.
            // Cases where elements are generated dynamically are more CPU intense ofc.
            elements = $('div'); 
    
        return function(e){
            var middleElement;
            if( e && e.type == 'resize' )
                viewportHeight = docElm.clientHeight;
    
            elements.each(function(){
                var pos = this.getBoundingClientRect().top;
                // if an element is more or less in the middle of the viewport
                if( pos > viewportHeight/2.5 && pos < viewportHeight/1.5 ){
                    middleElement = this;
                    return false; // stop iteration 
                }
            });
    
            console.log(middleElement);
        }
    })(document.documentElement);
    
    $(window).on('scroll resize', findMiddleElement);
    

    Another way (for modern browsers only) is to use the intersection API

    0 讨论(0)
  • 2021-01-02 11:44

    The height of the window and the scrollTop() of the window will give you the range of offsets that exist in the users view:

    var minHeight = $(window).scrollTop()
    var maxHeight = $(window).height()
    var middleHeight = (maxHeight + minHeight) / 2;
    

    You could try using a viewport selector such as: http://www.appelsiini.net/projects/viewport This will give you all visible elements. A plugin isn't needed but will ease the selection

    var visibleElements = $("div.box").filter(":in-viewport")
    

    From this selection you can then look for the element closest to the middleHeight:

    var $midElement;
    var distance = null;
    var currDistance = 0;
    visibleElements.each(function(index, element) {
        currDistance = Math.abs(middleHeight - $midElement.offset().top);
        if ( distance == null || currDistance < distance ) {
            $midElement = $(element);
            distance = currDistance;
        }
    });
    

    Haven't tested this but it should be along the right track.

    0 讨论(0)
提交回复
热议问题