Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Анимация при прокрутке (https://javascript.ru/forum/jquery/54113-animaciya-pri-prokrutke.html)

kolhoz 04.03.2015 10:27

Анимация при прокрутке
 
Есть некий блок:

<div class="row">
	<div id="year"></div>
	<div id="students"></div>
	<div id="worked"></div>
</div>

<script>
$('#year').animate({ year: 15/* - начало */ }, {
    duration: 2000,
    step: function (year){
        this.innerHTML = (year).toFixed(0)
    }
});

$('#students').animate({ students: 5000/* - начало */ }, {
    duration: 2000,
    step: function (students){
        this.innerHTML = (students).toFixed(0)
    }
});

$('#worked').animate({ worked: 1000/* - начало */ }, {
    duration: 2000,
    step: function (worked){
        this.innerHTML = (worked).toFixed(0)
    }
});
</script>


В этом блоке происходит увеличение заданных чисел. Как сделать так чтобы увеличение происходило только когда при прокрутке страницы этот блок станет видимым? Можно пример небольшой?

kolhoz 04.03.2015 12:09

никто не подскажет?

рони 04.03.2015 12:46

kolhoz,
getBoundingClientRect

kolhoz 04.03.2015 12:57

А можно пример как это сделать? Почитал про getBoundingClientRect но не понял как применить к моему случаю

рони 04.03.2015 13:04

kolhoz,
http://javascript.ru/forum/server/35...tml#post235028
http://javascript.ru/forum/events/11...-brauzera.html
http://javascript.ru/forum/css-html/...jj-chasti.html

kolhoz 04.03.2015 15:01

Пробую так, но все равно анимация начинается сразу при загрузке страницы и к моменту прокрутки до блока заканчивается. Как исправить?

<script>
window.onscroll = function() {
var pageY = window.pageYOffset || document.documentElement.scrollTop;
		$('#year').animate({ year: 15/* - начало */ }, {
			duration: 5000,
			step: function (year){
				this.innerHTML = (year).toFixed(0)
			}
		});

		$('#students').animate({ students: 5000/* - начало */ }, {
			duration: 5000,
			step: function (students){
				this.innerHTML = (students).toFixed(0)
			}
		});

		$('#worked').animate({ worked: 1000/* - начало */ }, {
			duration: 5000,
			step: function (worked){
				this.innerHTML = (worked).toFixed(0)
			}
		});

  }
</script>

рони 04.03.2015 15:05

Цитата:

Сообщение от kolhoz
Как исправить?

почитать примеры в 5 посте - и подумать - наверно должно быть какое то условие -- если елемент виден - в вашем коде этого нет

kolhoz 04.03.2015 16:15

я плохо знаю jquery, а сейчас руки не доходят чтобы подучить. Не подскажете какое условие прописать? У меня из-за другой работы сейчас нет времени читать что-то по js

kolhoz 05.03.2015 08:15

Как прописать условие, что блок row видим в браузере?

рони 05.03.2015 08:54

Запуск счётчика в блоке, когда блок станет видимым
 
kolhoz,
:cray: :cray: :cray: :cray: :cray:
любые варианты были у вас перед глазами
макет по второй ссылке пост 5
<!DOCTYPE HTML>

<html>

<head>
  <title>Untitled</title>
  <meta charset="utf-8">
  <style type="text/css">
  div{
        height: 50px;
        margin: 400px 0;
        border: 1px dotted gray;
    }

  </style>
  <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
  <script>
     $(function(){


	//"самописный" селектор выбирает все элементы на экране, между "верхом" и "низом"
	//(горизонтаьная прокрутка не учитывается, но можно дописать по-аналогии)
	(function(){
		$.belowthefold = function(element) {
			var fold = $(window).height() + $(window).scrollTop();
			return fold <= $(element).offset().top;
		};

		$.abovethetop = function(element) {
			var top = $(window).scrollTop();
			return top >= $(element).offset().top + $(element).height();
		};

		$.inviewport = function(element) {
			return !$.belowthefold(element) && !$.abovethetop(element);
		};

		$.extend($.expr[':'], {
			"inViewport": function(a){return $.inviewport(a);}
		});
	})()
   var timer = 0 ,
	handler = function(){
		//var inViewportList = $('div:inViewport');  //набор элементов, видимых в окне браузера
		//делайте с ними что хотите
		//ваш код
        	$('#year:inViewport').animate({ year: 15/* - начало */ }, {
			duration: 5000,
			step: function (year){
				this.innerHTML = (year).toFixed(0)
			}
		});

		$('#students:inViewport').animate({ students: 5000/* - начало */ }, {
			duration: 5000,
			step: function (students){
				this.innerHTML = (students).toFixed(0)
			}
		});

		$('#worked:inViewport').animate({ worked: 1000/* - начало */ }, {
			duration: 5000,
			step: function (worked){
				this.innerHTML = (worked).toFixed(0)
			}
		});

	};


handler();

//вызывает "handler" с задержкой (500 мс) после "каждого скролла"
//если успел прокрутить дальше, то обрабатывается только "второй скролл" и т.д.
//очень удобно - меньше вычислений - меньше нагрузка на браузер
$(window).scroll(function(){
	if(timer){
		clearTimeout(timer);
		timer = 0;
	}
	timer = setTimeout(handler, 500);
});

});


  </script>

</head>

<body>


<div id='year'></div>
<div id='students'></div>
<div id='worked'></div>

</body>

</html>


Часовой пояс GMT +3, время: 17:58.