JQuery проверяет, отображается ли элемент в области просмотра

Функция для проверки, находится ли класс div "media" в визуальном окне просмотра браузеров независимо от положения прокрутки окна.

<HTML>
<HEAD>
  <TITLE>My first HTML document</TITLE>
</HEAD>
<BODY>
  <div class="main">
   <div class="media"></div>
  </div>

</BODY>
</HTML>

Попытка использовать этот плагин https://github.com/customd/jquery-visible с этой функцией но я не знаю, как заставить его работать.

$('#element').visible( true );

person Vim Bonsu    schedule 26.12.2013    source источник


Ответы (5)


Согласно документации для этого подключаемого модуля, .visible() возвращает логическое значение, указывающее, является ли элемент видимым. Итак, вы бы использовали это так:

if ($('#element').visible(true)) {
    // The element is visible, do something
} else {
    // The element is NOT visible, do something else
}
person David    schedule 26.12.2013
comment
вы должны удалить (true) в visible () - person slvnperron; 27.12.2013
comment
@slvnperron: Почему? Это допустимое использование плагина и соответствует исходному коду, опубликованному в вопросе. - person David; 27.12.2013
comment
ну, он, вероятно, хочет проверить всю видимость div, аргумент - частичное обнаружение - person slvnperron; 27.12.2013
comment
@slvnperron: True: виден весь элемент, false: видна часть элемента - person ThunderPhoenix; 27.12.2013
comment
@David Итак, этот код работает нормально, НО вот сайт, над которым я работаю dev1.envisionwebdesign.co/johnreid/campaign.html. Сайт представляет собой одностраничный html с 16 разделами. В первом разделе слева нет блока навигации и текста. Все остальные делают. Что мне нужно, так это когда вы прокручиваете до каждого раздела, слайды навигации и текстового блока (они содержатся в одном и том же элементе div media-nav). Я использую этот плагин для ссылки на эффект перехода. - - person Vim Bonsu; 27.12.2013
comment
@David Проблема в том, что переход происходит сразу после загрузки сайта, а не когда элемент виден. Каждый раздел содержится в div с таким классом (.page1, .page2, .page3 ....). медиа-nav класса div содержится в каждом из указанных выше div. Что мне нужно, так это то, что когда отображается div, например .page2, это переходы .media-nav в - - person Vim Bonsu; 27.12.2013
comment
@David Может быть, вы можете предложить что-нибудь для моего проблема здесь? - person Solace; 08.04.2015
comment
Ссылка @David не работает. - person Michael Okoli; 04.12.2017
comment
Хорошая маленькая библиотека. К сожалению, он заброшен и больше не работает с текущими версиями jQuery. Выдает ошибки, подобные Uncaught TypeError: r.getClientRects is not a function, что является обычным явлением для библиотек, несовместимых с jQuery ›3. - person Cerin; 20.11.2020

Проверьте, отображается ли элемент в области просмотра с помощью jquery:

Сначала определите верхнее и нижнее положение элемента. Затем определите положение низа области просмотра (относительно верхней части страницы), добавив положение прокрутки к высоте области просмотра.

Если нижняя позиция области просмотра больше верхней позиции элемента И верхняя позиция области просмотра меньше нижней позиции элемента, элемент находится в области просмотра (по крайней мере, частично). Проще говоря, когда какая-либо часть элемента находится между верхней и нижней границами области просмотра, элемент отображается на экране.

Теперь вы можете написать оператор if / else, где оператор if выполняется только при выполнении вышеуказанного условия.

Приведенный ниже код выполняет то, что было объяснено выше:

// this function runs every time you are scrolling

$(window).scroll(function() {
    var top_of_element = $("#element").offset().top;
    var bottom_of_element = $("#element").offset().top + $("#element").outerHeight();
    var bottom_of_screen = $(window).scrollTop() + $(window).innerHeight();
    var top_of_screen = $(window).scrollTop();

    if ((bottom_of_screen > top_of_element) && (top_of_screen < bottom_of_element)){
        // the element is visible, do something
    } else {
        // the element is not visible, do something else
    }
});

Этот ответ является кратким изложением того, что Крис Бир и Энди обсуждали ниже. Я надеюсь, что это поможет любому, кто столкнется с этим вопросом во время исследования, как это сделал я. Я также использовал ответ на следующий вопрос, чтобы сформулировать свой ответ: Показывать Div при прокрутке позиции.

person ADB    schedule 29.11.2015
comment
Думаю, это должен быть $ (# element) .outerHeight (); - person boblapointe; 10.04.2016
comment
небольшая коррекция; как указывает @boblapointe: он должен быть externalheight (), а точка ('.') отсутствует между offset () top - person Maurice; 10.06.2016
comment
Без плагина ?! как насчет: $ (window) .scroll ?? - person Bruno Casali; 13.10.2016
comment
Вы имеете в виду jquery? - person VeeK; 07.12.2016
comment
предыдущая версия этого ответа также может быть полезной, если вы хотите определить, когда элемент впервые входит в представление / полностью отображается , а затем, когда он начинает покидать представление (когда видна верхняя часть следующего элемента). - person ADB; 20.05.2017
comment
@ADB Это отлично подходит для идентификаторов, но не для классов. Есть ли способ заставить это работать? - person Rob; 03.08.2017
comment
Убийственное решение для простых случаев без необходимости в дополнительном плагине. - person jyoseph; 20.10.2017
comment
Это правильный способ сделать это. Спасибо. - person Andy; 12.09.2019
comment
А как насчет вертикальных границ области просмотра? С ползунками / каруселями элемент, который находится внутри горизонтальных границ области просмотра, может по-прежнему находиться за пределами вертикальных. - person Krzysztof Wołowski; 11.05.2020
comment
Путь к сложному. Вам просто нужно вызвать метод, в который вы вставляете элемент, и он вернет вам, виден он или нет. - person Black; 09.12.2020

Вы можете написать такую ​​функцию jQuery, чтобы определять, находится ли элемент в области просмотра.

Включите это где-нибудь после включения jQuery:

$.fn.isInViewport = function() {
    var elementTop = $(this).offset().top;
    var elementBottom = elementTop + $(this).outerHeight();

    var viewportTop = $(window).scrollTop();
    var viewportBottom = viewportTop + $(window).height();

    return elementBottom > viewportTop && elementTop < viewportBottom;
};

Пример использования:

$(window).on('resize scroll', function() {
    if ($('#Something').isInViewport()) {
        // do something
    } else {
        // do something else
    }
});

Обратите внимание, что при этом проверяются только верхнее и нижнее положение элементов, но не проверяется, находится ли элемент за пределами области просмотра по горизонтали.

person Tom Pažourek    schedule 17.11.2016
comment
При проверке в div (а не в окне) не забудьте вычесть смещение родительского div. - person Karlth; 26.02.2017
comment
вы должны вычесть смещение следующим образом, если ваша кнопка находится сверху, а элемент отображается снизу: return ( elementBottom > viewportTop ) && ( elementTop < viewportBottom - $( this ).height() ); - person Arthur Tarasov; 29.07.2017
comment
Спасибо! Я сделал более полный плагин, используя ваш код в качестве основы: github.com/frontid/jQueryIsInViewport - person Capy; 14.08.2017
comment
$(window).height() не учитывает масштабирование мобильного устройства (по крайней мере, при использовании jQuery v1.9). Лучшее решение - использовать window.innerHeight, который меняется при сжатии экрана для увеличения на мобильном устройстве. - person Steven; 11.04.2018
comment
Кстати, это не работает, если вы используете отладчик Chrome в мобильном режиме и нажимаете на страницу и прокручиваете. Работает, только если я использую колесо прокрутки для прокрутки вверх и вниз. Если я что-то не упускаю - person Si8; 22.08.2018
comment
Это решение не работает, если элемент отсутствует в области просмотра, потому что он находится слишком далеко вправо или влево. - person Black; 09.12.2020
comment
@Black Да, это написано в ответе, пожалуйста, посмотрите последнее предложение. - person Tom Pažourek; 09.12.2020

Вы можете увидеть этот пример.

// Is this element visible onscreen?
var visible = $(#element).visible( detectPartial );

detectPartial:

  • Верно: виден весь элемент
  • false: часть элемента видна

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

person ThunderPhoenix    schedule 26.12.2013
comment
Это не стандартная функция jQuery (видимая - не функция) - person cupiqi09; 20.01.2020

person    schedule
comment
Я не уверен, что использовать селектор классов .media сложно, потому что, если есть много элементов, принадлежащих классу мультимедиа ... - person ThunderPhoenix; 27.12.2013
comment
Это не стандартная функция jQuery (видимая - не функция) - person cupiqi09; 20.01.2020