Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Гмстограмма с анимацией (https://javascript.ru/forum/dom-window/75226-gmstogramma-s-animaciejj.html)

Igorsrt 15.09.2018 13:13

Еще один вопрос возник: Как заставить анимацию этой диаграммы срабатывать при прокрутке страницы (она у меня оказалась ниже первого экрана)?

j0hnik 15.09.2018 14:07

var fl = true;
onscroll = function(){
	if(document.querySelector("селектор_элемента_с_анимацией").getBoundingClientRect().top - innerHeight < 0 && fl) {
		fl = false;
//сюда запуск анимации
}
};

если запуск нужен ниже, вместо 0 свою цифру -n

Malleys 15.09.2018 15:26

Разве вместо такого сложного и трудно поддерживаемого набора элементов не достаточно было бы использовать только 4 элемента <meter>?


j0hnik, у вас всё время, пока крутишь и видишь элемент, запускается анимация

j0hnik 15.09.2018 15:34

Malleys,
поправил

Malleys 15.09.2018 15:50

Анимация запускается каждый раз, как только элемент входит в область видимости + только 4 <meter>

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<meta name="viewport" content="width=device-width, initial-scale=1.0">
		<style>
			
			.skills { margin: 125vh 0; }
			body::before { content: "Крути вниз!"; }
			.skill {
				width: 100%;
				background: #eee;
				padding-top: 2em;
				display: flex;
				flex-flow: wrap;
			}
			.skill .level {
				flex: 1;
				text-align: right;
				font-size: 125%;
			}
			.skill meter {
				width: 100%;
				background: transparent;
			}
			.skill meter::-webkit-meter-bar {
				background: transparent;
				border: 0; /* убирает рамку в IE */
			}
			.skill meter::-moz-meter-bar {
				background: currentColor;
			}
			.skill meter::-webkit-meter-optimum-value {
				background: currentColor;
			}

		</style>
	</head>
	<body>
		<section class="skills">
			<meter min="0" max="100" value="98" style="color: #464c5c" title="Оптимизация"></meter>
			<meter min="0" max="100" value="100" style="color: #6d747a" title="Кроссплатформенность"></meter>
			<meter min="0" max="100" value="99" style="color: #8c8274" title="Удобство"></meter>
			<meter min="0" max="100" value="99" style="color: #d2c6b4" title="Дизайн"></meter>
		</section>
		<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
		<script>

			jQuery.easing.easeOutQuart =  function(x, t, b, c, d) {
				return -c * (t /= d) * (t - 2) + b
			};

			jQuery(".skills meter").each(function(index, { value, title, style }) {
				const descr = jQuery(`<span class="title">${title}</span>`);
				const level = jQuery(`<span class="level" style="color: ${style.color}"></span>`);
				const skill = jQuery(`<section class="skill"></section>`);

				skill.append(descr, level);
				$(this).replaceWith(skill);
				skill.append(this);
				
				document.addEventListener("meter:animate", () => jQuery({ value: 0 }).animate({ value }, {
					duration: 1600,
                    easing: "easeOutQuart",
					step: value => {
						this.value = value;
						level.text(`${value | 0}%`);
					}
				}));
			});
			
			let _isInView = false;
			
			onscroll = () => {
				const rect = document.querySelector(".skills").getBoundingClientRect();
				const y = rect.bottom / (innerHeight + rect.bottom - rect.top);
				const isInView = y > 0 && y < 1;
				
				if(_isInView !== isInView) {
					_isInView = isInView;
					if(isInView)
						document.dispatchEvent(new Event("meter:animate", { bubbles: true }));
				}
			};
			
		</script>
	</body>
</html>

рони 15.09.2018 17:54

Malleys,
:thanks:

Igorsrt 16.09.2018 01:16

О, прикольно.. А что такое этот <meter> (раньше не видел такого тега). Он везде будет работать?

Igorsrt 16.09.2018 01:41

а, все-таки, может лучше "по старинке": куда что добавить в первоначальный скрипт, что бы он срабатывал при прокрутке до блока с диаграммой один раз? :)

j0hnik 16.09.2018 01:42

Igorsrt,
тогда мой пост смотрите

Igorsrt 16.09.2018 10:57

Цитата:

Сообщение от j0hnik (Сообщение 494788)
Igorsrt,
тогда мой пост смотрите

да, Ваш вариант, вроде бы, подходит, спасибо... только вот одно Но: если все-таки диаграмма изначально попадает в область экрана (например при перезагрузке страницы) , то пока не начнешь прокручивать экран "всё по нулям"... нельзя ли это тоже подправить? ;)


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