#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{ // сделайте это … } } );
примечание: это не завершено по целому ряду причин!!
- он обрабатывает только вертикальную прокрутку
- он не обрабатывает фреймы iframes (и может ужасно испортиться при вложенной прокрутке)
- нет отмены привязки
- это может замедлиться, если вы просматриваете много элементов
- не учитывает изменение размера окна
это то, что я быстро взломал из аналогичного кода, который у меня был.
если ссылка 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