Скролл элемента .scroll() + событие
Добрый день уважаемые. Появилась необходимость задать элементу событие при его скроллинге, а точнее когда пользователь не видет элемента прокручивая страницу. Вроди бы детский вопрос, но я где-то недопонимаю.
Приведу пример <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script> </head> <style type="text/css"> .field{ border: 1px solid #000; width: 800px; height: 1800px; } .block{ margin: 10%; width: 50px; height: 50px; background-color: red; } </style> <body> <div class="field"> <div class="block"></div> </div> </body> <script type="text/javascript"> window.onload = function () { $("body").scroll(function() { var coord = $('.block').offset().top; if ($('.block').offset().top == 0) { console.log("Елемента больше не видно в браузере"); } else { console.log("Елемент снова в браузере виден"); } }); } </script> </html> Почему оно не срабатывает? Мне необходимо что б при исчезновение элемента из области видимости отписывало сообщение в консоль, при появлении отписывало второе сообщение :help: |
Black_Star,
строка 37 что проверяет? |
Согласно моему пониманию $('.block').offset().top это длинна относительно начала страницы до обёкта (верхней левой точки дива)
|
Цитата:
|
...!
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script> </head> <style type="text/css"> .field{ border: 1px solid #000; width: 800px; height: 1800px; } .block{ margin: 10%; width: 50px; height: 50px; background-color: red; } </style> <body> <div class="field"> <div class="block"></div> </div> </body> <script type="text/javascript"> window.onload = function () { $(window).scroll(function() { var coord = $('.block').offset().top + $('.block').height(); if (coord < $(window).scrollTop()) { console.log("Елемента больше не видно в браузере"); } else { console.log("Елемент снова в браузере виден"); } }); } </script> </html> |
Спасибо, рони, ты как всегда на высоте. :thanks:
Величина то у $('.block').offset() постоянная, и не меняется в процессе скроллинга. туплю. Ещё вопрос, как данный метод модифицировать? Тут получается метод постоянно запрашивает DOM при скролленге что ни есть хорошо. Мне просто этот хак нужно внедрить в блок навигации для сайта. Есть в хедере менюшка с навигацией, когда пользователь опускается ниже этой менюшки, к ней применяется новый CSS стиль, со свойством position: fixed; и теперь данная навигация торчит у пользователя слева от экрана. Когда пользователь откручивает страницу вверх, свойство убирается |
Black_Star,
https://learn.javascript.ru/task/throttle и небольшая отимизация window.onload = function() { var b = true, d = $(".block"),h = d.offset().top; $(window).scroll(function() { var a = h < $(window).scrollTop(); a != b && ((b = a) ? d.addClass('fix'): d.removeClass('fix')) }) }; строка 4 постоянно (смотреть ссылку выше), строка 5 работа с классом только при переходе границы |
фиксация блока при скролле
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script> </head> <style type="text/css"> .field{ position: relative; border: 1px solid #000; width: 800px; height: 1800px; } .block{ margin: 10%; width: 50px; height: 50px; background-color: red; } .block.fix { background-color: #006400; position: fixed; margin-top: -7px; } </style> <body> <div class="field"> <div class="block"></div> </div> </body> <script type="text/javascript"> window.onload = function() { var b = true, d = $(".block"),h = d.offset().top, l = d.css("margin-left"); $(window).scroll(function() { var a = h < $(window).scrollTop(); a != b && ((b = a) ? d.addClass('fix').css({"margin-left": l}) : d.removeClass('fix').css({"margin-left":""})) }) }; </script> </html> |
Спасибо рони.
Я даже нашел библиотеку этой тормозилки https://github.com/cowboy/jquery-throttle-debounce С методом throttle. Только пока что у меня ни чего не работает :write: function scrollNav() { $(window).scroll(function () { var coord = $navigationTop.offset().top + $navigationTop.height(); if ($navigationSite.hasClass('navMob') && $(window).scrollTop() < coord) { function changeNav() { buttonNav.css({display: 'none'}); navBar.show(); $navigationSite.toggleClass('navMob'); } $(window).scroll($.throttle(changeNav, 200)); } else if ($(window).scrollTop() > coord) { buttonNav.css({display: 'block'}); navBar.hide(); $navigationSite.toggleClass('navMob'); } }); } scrollNav(); В консоле выдает ошибку в самой библиотеке, что странно |
Black_Star,
потому что вы написали бред какой-то ... |
Часовой пояс GMT +3, время: 05:31. |