Jquery проверява дали елементът се вижда в прозореца за изглед

Функция за проверка дали класът „media“ на div е във визуалния прозорец на браузъра, независимо от позицията на превъртане на прозореца.

<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 ....). класът div media-nav се съдържа във всеки от горните 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: трябва да е outerheight() и липсва точка ('.') между 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 (не в прозореца), тогава не забравяйте да извадите отместването на родителските divs. - 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 функция (visible не е функция) - person cupiqi09; 20.01.2020

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