Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 26.07.2021, 14:31
Профессор
Отправить личное сообщение для Янковиц Посмотреть профиль Найти все сообщения от Янковиц
 
Регистрация: 17.11.2014
Сообщений: 403

Плавное увеличение значения progress
Добрый день. Использую библиотеку alpine.js, и хотел сделать плавное увеличение значения в теге <progress> при появлении элемента в области просмотра. Запуск анимации реализовал через IntersectionObserver. Прошу помощи с плавным увеличением значения, если возможно вместо setTimeout на requestAnimationFrame:
<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<meta http-equiv="X-UA-Compatible" content="IE=edge">
	<meta name="viewport" content="width=device-width, initial-scale=1">
	<title>Progress</title>
	<script defer src="https://unpkg.com/alpinejs@3.x.x/dist/cdn.min.js"></script>
	<script>
	document.addEventListener( 'alpine:init', () => {
		Alpine.data( 'progress', ( to, time, wait ) => ( {
			init() {
				let elem = this.$el;
				const observer = new IntersectionObserver( ( entries, imgObserver ) => {
					entries.forEach( ( entry ) => {
						console.log( entry );
						if ( entry.isIntersecting ) {
							var target   = entry.target,
								delay    = parseInt( wait ) || 100,
								duration = parseInt( time ) || 2000;
							if ( entry.intersectionRatio > 0 && !target.classList.contains( 'is-active' ) ) {
								target.classList.add( 'is-active' );
								setTimeout( () => {
									var start    = new Date().getTime();
									var interval = setInterval( function() {
										var progress = ( ( new Date().getTime() ) - start ) / duration,
											from     = target.getAttribute( 'value' ) || 0,
											result   = Math.floor( ( to - from ) * progress + from ),
											value    = progress < 1 ? result : to;

										console.log( value );

										elem.setAttribute( 'value', value );
										if ( value == to ) {
											clearInterval( interval );
										}
									}, 10 );
								}, delay );
								imgObserver.unobserve( target );
							}
					}
					} )
				} );
				observer.observe( elem );
			}
		} ) );
	} )
	</script>
</head>
<body>
	<progress class="progress" max="100" x-data="progress(100, 2000)"></progress>
</body>
</html>


В консоли когда проверяю, сейчас значения могут так идти: 1-1-2-3-4-4-4-5-4-5-6-7-8...

Последний раз редактировалось Янковиц, 26.07.2021 в 14:40.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как скриптом сделать плавное увеличение ставок для плавного набора просмотров? mik888em Events/DOM/Window 2 08.11.2020 16:32
Массив и увеличение значения Элемента массива Romzes Общие вопросы Javascript 46 15.11.2017 19:01
Плавное увеличение / уменьшение картинки. Бесконечный цикл. LLIypuk jQuery 1 11.04.2017 10:31
Увеличение значения в нескольких type=text new_guy Элементы интерфейса 8 14.10.2014 11:33
Плавное увеличение картинки sash_ok.83 Events/DOM/Window 2 30.06.2012 12:22