Эффективный способ выделить элементы, касающиеся верхнего края области просмотра - PullRequest
4 голосов
/ 27 декабря 2011

Какими были бы эффективные в вычислительном отношении способы выбора элементов, которые касаются верхнего края окна просмотра браузера при прокрутке страницы?

См. Прикрепленное изображение. Зеленые элементы выбраны потому, что они касаются верхнего края.

scrolling

UPDATE

Примером того, как я буду использовать это, является исчезновение элементов, которые выходят за пределы экрана. Их может быть сотни на странице. Вообразите страницу как Pinterest. Вычисление offset и scrollTop для сотен из них со скоростью события прокрутки, даже если регулирование по-прежнему кажется действительно неэффективным.

Ответы [ 2 ]

2 голосов
/ 28 декабря 2011

Это то, что я придумал. Я думаю, что это можно улучшить путем кэширования значений scrollTop, но это довольно хорошо. Я включил структуру для кэширования рабочих столов, но не код реализации. Я также только реализовал прокрутку вниз, чтобы скрыть div. Я оставил повторную демонстрацию их в качестве упражнения для вас.

Когда окно прокручивается, мы получаем последний скрытый div. Мы знаем, что все до этого div уже спрятано. Затем используйте «пока следующий элемент находится за пределами экрана», чтобы скрыть его. Как только div не исчезает с экрана, мы прекращаем работу. Таким образом экономится время от перебора всего списка.

http://jsfiddle.net/kkv3h/2/

//track whether user has scrolled up or down
var prevScrollTop = $(document).scrollTop();

$(document).scroll(function() {
    var currentScrollTop = $(this).scrollTop();
    if (currentScrollTop > prevScrollTop) {
        //down
        var lasthiddenbox = $('.fadeboxhidden:last');
        var nextbox = (lasthiddenbox.length > 0) ? lasthiddenbox.next('.fadebox') : $('.fadebox:first');
        while (nextbox.length) {
            console.log('box: ' + nextbox.offset().top + ' scroll: ' + currentScrollTop);
            if (nextbox.offset().top < currentScrollTop) {
                nextbox.animate({ opacity: 0 }, 3000).addClass('fadeboxhidden');
            }
            else { return; } 
            nextbox = nextbox.next('.fadebox:first');
        }        
    } else {
        //up          
    }
    prevScrollTop = currentScrollTop ;
});

//create an object to hold a list of box top locations
var boxtops = new Object;


//gather all boxes and store their top location
$('.fadebox').each( function(index) {    
    //you may want to dynamically generate div ids here based on index. I didn't do this
    //because i was already using the id for positioning.
    var divid = $(this).prop('id');
    boxtops[divid] = $(this).offset().top;
    //console.log(boxtops[divid]);    
});
0 голосов
/ 27 декабря 2011

Я думаю, что лучшим способом было бы пометить элементы, с помощью которых вы хотите определить тестирование попаданий каким-либо классом, например, «hit-test-visible» или что-то в этом роде.Затем для этих элементов в событии прокрутки вы сможете найти их смещение по сравнению с документом - см. jQuery offset , а затем на основе значения прокрутки, если смещение меньше прокрутки, а смещение + высота элемента больше, чем смещение прокрутки, тогда элемент должен «касаться» верхнего края.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...