Я пытаюсь сделать div только, когда элементы определенного класса видны в окне просмотра.
Я получил почти все это через http://jsfiddle.net/blowsie/M2RzU/
$(document).ready(function(){
$('.myclass').bind('inview', function (event, visible) {
if (visible == true) {
// element is now visible in the viewport
$(this).removeClass('myclass');
alert('found h2!')
} else {
// element has gone out of viewport
$(this).addClass('myclass');
}
});
});
но, как вы можете видеть по этому редактированию http://jsfiddle.net/deenbag/6D9x5/, событие запускается каждый раз, когда любой элемент с классом входит или выходит из окна просмотра, поэтому выходящий элемент отключает желаемый эффект, даже если отображается другой элемент с соответствующим классом.
я также возился с этим плагином, но не мог понять, как заставить его применять то, что я хочу делать. http://opensource.teamdf.com/visible/examples/demo-basic.html
Просто отслеживайте видимые элементы в массиве:
var visibleEls = [];
$('.myclass').bind('inview', function (event, visible) {
if (visible == true) {
// element is now visible in the viewport
if(!~visibleEls.indexOf(this)) visibleEls.push(this);
} else {
// element has gone out of viewport
var i=visibleEls.indexOf(this);
if(~i) visibleEls.splice(i, 1);
}
$('body').toggleClass('red', !!visibleEls.length);
});
Обратите внимание, что вы можете упростить
var counter = 0;
$('.myclass').bind('inview', function (event, visible) {
counter += visible*2-1;
$('body').toggleClass('red', !!counter);
});
но это может быть более подверженным ошибкам.
inview
, так что, возможно, есть лучшее решение, но вы можете попробовать запустить document.documentElement.scrollTop += 1
при загрузке
Поскольку у меня недостаточно репутации для комментариев, я собираюсь попытаться ответить. Что делать, если вы добавили счетчик, который отслеживал, сколько элементов с классом myclass "находится в поле зрения", и каждый раз при запуске события "inview" вы можете обновить счетчик, и если вы включите 1, если он отключен, если это все, что вы ничего не делаете. Вот мой jsfiddle.
$(document).ready(function(){
numInView = 0;
$('.myclass').bind('inview', function (event, visible) {
if (visible) {
numInView++;
} else {
numInView--;
}
if (numInView === 1) {
// element is now visible in the viewport
$("h2").removeClass('myclass');
$('body').css('color','red');
} else if (numInView === 0) {
// element has gone out of viewport
$("h2").addClass('myclass');
$('body').css('color','black');
}
});
});
Pro-tip: при тестировании условия вам не нужно сравнивать его с истинным, если вы не пытаетесь угадать "правдивые" значения (например, число 1), но не верно. Если вещь, которую вы тестируете, истинна, тогда условие будет проходить, не сравнивая его со значением true. Это поможет вам сохранить код:
if (visible == true) {
bar();
} else {
bazz();
}
делает то же самое, что и
if (visible) {
bar();
} else {
bazz()
}
в этом сценарии.