Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 17.12.2016, 13:49
Аватар для Black_Star
Профессор
Отправить личное сообщение для Black_Star Посмотреть профиль Найти все сообщения от Black_Star
 
Регистрация: 11.07.2016
Сообщений: 300

Скролл элемента .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>

Почему оно не срабатывает? Мне необходимо что б при исчезновение элемента из области видимости отписывало сообщение в консоль, при появлении отписывало второе сообщение
Ответить с цитированием
  #2 (permalink)  
Старый 17.12.2016, 14:20
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,124

Black_Star,
строка 37 что проверяет?
Ответить с цитированием
  #3 (permalink)  
Старый 17.12.2016, 14:49
Аватар для Black_Star
Профессор
Отправить личное сообщение для Black_Star Посмотреть профиль Найти все сообщения от Black_Star
 
Регистрация: 11.07.2016
Сообщений: 300

Согласно моему пониманию $('.block').offset().top это длинна относительно начала страницы до обёкта (верхней левой точки дива)
Ответить с цитированием
  #4 (permalink)  
Старый 17.12.2016, 15:15
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,124

Сообщение от Black_Star
это длинна относительно начала страницы до обёкта
и в каком случае эта величина будет ноль?
Ответить с цитированием
  #5 (permalink)  
Старый 17.12.2016, 15:17
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,124

...!
<!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>
Ответить с цитированием
  #6 (permalink)  
Старый 17.12.2016, 16:01
Аватар для Black_Star
Профессор
Отправить личное сообщение для Black_Star Посмотреть профиль Найти все сообщения от Black_Star
 
Регистрация: 11.07.2016
Сообщений: 300

Спасибо, рони, ты как всегда на высоте.
Величина то у $('.block').offset() постоянная, и не меняется в процессе скроллинга. туплю.
Ещё вопрос, как данный метод модифицировать? Тут получается метод постоянно запрашивает DOM при скролленге что ни есть хорошо. Мне просто этот хак нужно внедрить в блок навигации для сайта. Есть в хедере менюшка с навигацией, когда пользователь опускается ниже этой менюшки, к ней применяется новый CSS стиль, со свойством position: fixed; и теперь данная навигация торчит у пользователя слева от экрана. Когда пользователь откручивает страницу вверх, свойство убирается
Ответить с цитированием
  #7 (permalink)  
Старый 17.12.2016, 17:20
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,124

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 работа с классом только при переходе границы
Ответить с цитированием
  #8 (permalink)  
Старый 17.12.2016, 18:11
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,124

фиксация блока при скролле
<!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>
Ответить с цитированием
  #9 (permalink)  
Старый 17.12.2016, 19:46
Аватар для Black_Star
Профессор
Отправить личное сообщение для Black_Star Посмотреть профиль Найти все сообщения от Black_Star
 
Регистрация: 11.07.2016
Сообщений: 300

Спасибо рони.
Я даже нашел библиотеку этой тормозилки https://github.com/cowboy/jquery-throttle-debounce
С методом throttle. Только пока что у меня ни чего не работает

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();


В консоле выдает ошибку в самой библиотеке, что странно
Ответить с цитированием
  #10 (permalink)  
Старый 17.12.2016, 20:20
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,124

Black_Star,
потому что вы написали бред какой-то ...
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Событие при выборе элемента из выпадающего списка в input type="email" Алексей Горохов Events/DOM/Window 4 27.12.2013 10:38
Событие удаления элемента из DOM Danxil Events/DOM/Window 1 11.11.2013 22:54
Событие загрузки элемента, но не load grecha Events/DOM/Window 2 08.05.2013 01:31
focus() для элемента, не поддерживающего событие focus mosgaz jQuery 11 06.12.2011 17:51
Как прокрутить скролл до элемента PAMAC Общие вопросы Javascript 2 04.10.2010 09:56