Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #11 (permalink)  
Старый 15.09.2018, 14:07
Аватар для j0hnik
Профессор
Отправить личное сообщение для j0hnik Посмотреть профиль Найти все сообщения от j0hnik
 
Регистрация: 01.12.2016
Сообщений: 3,650

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

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

Последний раз редактировалось j0hnik, 15.09.2018 в 15:33.
Ответить с цитированием
  #12 (permalink)  
Старый 15.09.2018, 15:26
Аватар для Malleys
Профессор
Отправить личное сообщение для Malleys Посмотреть профиль Найти все сообщения от Malleys
 
Регистрация: 20.12.2009
Сообщений: 1,714

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


j0hnik, у вас всё время, пока крутишь и видишь элемент, запускается анимация
Ответить с цитированием
  #13 (permalink)  
Старый 15.09.2018, 15:34
Аватар для j0hnik
Профессор
Отправить личное сообщение для j0hnik Посмотреть профиль Найти все сообщения от j0hnik
 
Регистрация: 01.12.2016
Сообщений: 3,650

Malleys,
поправил
Ответить с цитированием
  #14 (permalink)  
Старый 15.09.2018, 15:50
Аватар для Malleys
Профессор
Отправить личное сообщение для Malleys Посмотреть профиль Найти все сообщения от Malleys
 
Регистрация: 20.12.2009
Сообщений: 1,714

Анимация запускается каждый раз, как только элемент входит в область видимости + только 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>

Последний раз редактировалось Malleys, 15.09.2018 в 16:15. Причина: Добавил надпись: «Крути вниз!»
Ответить с цитированием
  #15 (permalink)  
Старый 15.09.2018, 17:54
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,126

Malleys,
Ответить с цитированием
  #16 (permalink)  
Старый 16.09.2018, 01:16
Профессор
Отправить личное сообщение для Igorsrt Посмотреть профиль Найти все сообщения от Igorsrt
 
Регистрация: 21.02.2016
Сообщений: 271

О, прикольно.. А что такое этот <meter> (раньше не видел такого тега). Он везде будет работать?
Ответить с цитированием
  #17 (permalink)  
Старый 16.09.2018, 01:41
Профессор
Отправить личное сообщение для Igorsrt Посмотреть профиль Найти все сообщения от Igorsrt
 
Регистрация: 21.02.2016
Сообщений: 271

а, все-таки, может лучше "по старинке": куда что добавить в первоначальный скрипт, что бы он срабатывал при прокрутке до блока с диаграммой один раз?
Ответить с цитированием
  #18 (permalink)  
Старый 16.09.2018, 01:42
Аватар для j0hnik
Профессор
Отправить личное сообщение для j0hnik Посмотреть профиль Найти все сообщения от j0hnik
 
Регистрация: 01.12.2016
Сообщений: 3,650

Igorsrt,
тогда мой пост смотрите
Ответить с цитированием
  #19 (permalink)  
Старый 16.09.2018, 10:57
Профессор
Отправить личное сообщение для Igorsrt Посмотреть профиль Найти все сообщения от Igorsrt
 
Регистрация: 21.02.2016
Сообщений: 271

Сообщение от j0hnik Посмотреть сообщение
Igorsrt,
тогда мой пост смотрите
да, Ваш вариант, вроде бы, подходит, спасибо... только вот одно Но: если все-таки диаграмма изначально попадает в область экрана (например при перезагрузке страницы) , то пока не начнешь прокручивать экран "всё по нулям"... нельзя ли это тоже подправить?
Ответить с цитированием
  #20 (permalink)  
Старый 16.09.2018, 13:41
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,126

анимация чисел в зоне видимости гистограмма jquery
<!DOCTYPE html>

<html>
<head>
  <title>Untitled</title>
  <meta charset="utf-8">
  <style type="text/css">
  .meter {
      width: 100%;
      height: 8px;
      color: #fff ;
      text-align: center;
      margin: 30px 0;
      position: relative;
  }
  .meter:after {
      font-size: 18px;
      content: attr(data-max);
      color: #000;
      position: absolute;
      right: 5px;
      top: -20px;
  }
  .meter:before {
      font-size: 18px;
      content: attr(data-title);
      color: #000;
      position: absolute;
      left: 5px;
      top: -20px;
  }
  p {
      height: 2000px;
  }
  </style>
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>

  <script>
$(function() {
    jQuery.easing.easeOutQuart =  function(x, t, b, c, d) {
				return -c * (t /= d) * (t - 2) + b
			};
    var num = $(".meter");
    var duration = 1200;
    num.each(function(indx, el) {
        var max = $(el).data("max");
        var color = $(el).data("color");
        var visibility = checkViewport(el);
        $(el).on("animeNum", function() {
            $({
                n: 0
            }).animate({
                n: max
            }, {
                easing: "easeOutQuart",
                duration: duration,
                step: function(now, fx) {
                    now |= 0;
                    now += "%";
                    var gradient = "linear-gradient(to right, " + color + " , " + color + "  " + now + ", #FFFFFF " + now + ")";
                    $(el).attr("data-max", now).css({
                        "backgroundImage": gradient
                    })
                }
            })
        }).data("visibility", visibility);
        visibility && $(el).trigger("animeNum")
    });

    function checkViewport(elem) {
        var rect = elem.getBoundingClientRect();
        var y = rect.bottom / (innerHeight + rect.bottom - rect.top);
        var isInView = y > 0 && y < 1;
        return isInView
    }
    jQuery.fn.scrollComplete = function(fn, ms) {
        var timer = null;
        this.scroll(function() {
            if (timer) clearTimeout(timer);
            timer = setTimeout(fn, ms)
        })
    };
    $(window).scrollComplete(function() {
            num.each(function(indx, el) {
                var visibility = checkViewport(el);
                el = $(el);
                var old = el.data("visibility");
                old != visibility && el.data("visibility", visibility) && !old && el.trigger("animeNum")
            })
        },
        100)
});
  </script>
</head>

<body>
<p></p>
<div class="meter" data-max="98" data-title="Оптимизация" data-color="#464c5c"></div>
<div class="meter" data-max="100" data-title="Кроссплатформенность" data-color="#6d747a"></div>
<div class="meter" data-max="99" data-title="Удобство" data-color="#8c8274"></div>
<div class="meter" data-max="99" data-title="Дизайн" data-color="#d2c6b4"></div>
<p></p>
</body>
</html>
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Циклический список с анимацией на сайте. Shrederr Javascript под браузер 1 31.03.2018 19:56
Подскажите пожалуйста пример приложения с анимацией elly Общие вопросы Javascript 1 25.04.2015 09:18
Проблема с анимацией сдвига изображения по оси y Alyona97 Общие вопросы Javascript 3 13.01.2015 23:34
Проблема с анимацией flytracer jQuery 1 31.03.2012 02:20
Помогите оптимизировать скрипт смены изображений с анимацией Khmelevsky Элементы интерфейса 5 06.03.2010 19:02