jQuery находит, когда пользователь прокручивает элемент

#javascript #jquery #css #scroll

#javascript #jquery — запрос #css — файл #прокрутка #jquery #css

Вопрос:

У меня есть 2 divs :

 <div id="div1"></div>
<div id="div2"></div>
  

Я хотел бы добавить css({'position':'relative'}) в div2 ТОЛЬКО тогда, когда пользователь прокручивает страницу, а div1 больше не отображается на странице. Когда div1 снова станет видимым, я хочу удалить правило css.

Кто-нибудь может мне помочь?

Комментарии:

1. Выглядит именно так, как вам нужно: remysharp.com/2009/01/26/element-in-view-event-plugin .

Ответ №1:

Вы могли бы попробовать этот код:

 $(window).bind('scroll', function() {
if ($(document).scrollTop() >= $('#div1').offset().top - $(window).height()) {
    //Change css relative
}else{

}
});
  

Вы должны играть с этим, пока не получите идеальный результат. Удачи

Ответ №2:

это не идеально, но я написал вам быстрый плагин, который позаботится об этом: http://jsfiddle.net/m7ztR/1 /

это можно использовать двумя способами:

это дает вам новый селектор
console.log( $( "#elem" ).is( ":inView" )? "visible":"invisible" );

вы также можете использовать это, чтобы получить все видимые элементы, например console.log( $( "p:inView" ).get() );

и что-то вроде прослушивателя событий $( «#watchThisElement» ).visibilityChange( функция ( видимая){ if( visible ){ // сделайте это … } else{ // сделайте это … } } );

примечание: это не завершено по целому ряду причин!!

  1. он обрабатывает только вертикальную прокрутку
  2. он не обрабатывает фреймы iframes (и может ужасно испортиться при вложенной прокрутке)
  3. нет отмены привязки
  4. это может замедлиться, если вы просматриваете много элементов
  5. не учитывает изменение размера окна

это то, что я быстро взломал из аналогичного кода, который у меня был.

если ссылка jsfiddle когда-либо исчезнет, вот фактический код и разметка:

HTML:

 <div id="status">look at my background color!</div>

<div id="above">lots of space above ... </div>
<div id="trackMe">i'm being tracked!</div>
<div id="below">lots of space below ... </div>
  

css:

 #status{
    position: fixed; 
    right: 0; 
    top: 0; 
    background-color: red; 
}

#above, #below{
    height: 800px; 
    background-color: yellow; 
}
  

javascript:

 /**
 * jquery (in)visibility plugin ... 
 */
(function( $ ){
    var w = $( window ); 

    // add a custom ":inView" selector
    $.expr[':'].inView = function(obj){
        var $this = $(obj);
        var relY = $this.offset().top - w.scrollTop(); 
        return relY >= 0 amp;amp; relY <= w.height(); 
    }; 

    $.fn.visibilityChange = function( fun ) {  
        return this.each(function() {
            var elem = $(this);
            var pVisible = elem.is( ":inView" ); 
            $( document ).scroll( function( e ){
                if( pVisible != elem.is( ":inView" ) ){
                    pVisible = !pVisible; 
                    fun( pVisible ); 
                }
            });
        });
    };
})( jQuery );



$( "#trackMe" ).visibilityChange( function( visible ){
    $( "#status" ).css( "background-color", visible? "green":"red" ); 
} );
  

Ответ №3:

Я думаю, вам следует проделать несколько трюков с window.onscroll, высотой окна и высотой div1. Как in…do некоторый код в методе onscroll … проверяет высоту окна, проверяет высоту div1, выполняет некоторые вычисления над ним и проверяет, находится ли div вне поля зрения … если true … удалите css.

Комментарии:

1. я могу попробовать, но я не могу понять, как контролировать при прокрутке страницы, если div1 все еще становится видимым снова … хм

2. хм, я думаю, что наличие высоты div1 является единственным решением из этого… что вы думаете?

3. Если вы знаете, где находился элемент div перед прокруткой вниз (посмотрите на его положение на странице и высоту), вы должны быть в состоянии определить, должен ли div снова отображаться при прокрутке страницы вверх.

4. вы имеете в виду атрибут onscroll в html? или jquery scroll(), потому что onscroll поддерживается только IE

5. Я имел в виду обычную функцию js, но для кроссбраузерной поддержки вы могли бы использовать jthe Query library: api.jquery.com/scroll