Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 28.02.2020, 20:30
Кандидат Javascript-наук
Отправить личное сообщение для Lefseq Посмотреть профиль Найти все сообщения от Lefseq
 
Регистрация: 19.04.2019
Сообщений: 124

Как сделать, чтобы прогресс бар отработал не один раз, а несколько?
Привет. Подскажите, как сделать следующее... Имеется прогресс бар, который за указанное время (3 секунды) отрабатывает лишь один раз. Мне же нужно чтобы он отработал пять раз (например): сначала 3 секунды, затем 5 секунд, 9 секунд, 4 секунды, и 7 секунд. Как это можно сделать?

<progress id="user-progress" value="0" max="100"></progress>


function userProgress(time){
var start = 0;
var time = Math.round(time*1000/100);
var progressElement = document.getElementById('user-progress');
var intervalId = setInterval(function(){
    if (start>100) {
	    clearInterval(intervalId);
	}
	else {
	  progressElement.value = start;
	}
	start++;
}, time);
}
userProgress(3);
Ответить с цитированием
  #2 (permalink)  
Старый 28.02.2020, 21:03
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,795

<progress id="user-progress" value="0" max="100"></progress>
<script>
    function userProgress(time) {
        var start = 0;
        var time = Math.round(time * 1000 / 100);
        var progressElement = document.getElementById('user-progress');
        
        return new Promise(function (resolve) {
            var intervalId = setInterval(function() {
                if (start++ > 100) {
                    clearInterval(intervalId);
                    resolve();
                } else {
                    progressElement.value = start;
                }
            }, time);
        });
    }

    userProgress(3).then(function () {
        return userProgress(5);
    }).then(function () {
        return userProgress(9);
    });
</script>
Ответить с цитированием
  #3 (permalink)  
Старый 28.02.2020, 23:36
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,126

progress animate loop
Lefseq,

<!DOCTYPE html>
<html>
<head>
  <title>Untitled</title>
  <meta charset="utf-8">
  <style type="text/css">
  progress {
      width: 300px;
      font-size: .6em;
      height: 12px;
      border: none;
      border-radius: 8px;
      background-color: #a9a9a9;
      line-height: 12px;
      padding: 2px 1px;
  }
  progress::-webkit-progress-bar {
      height: 12px;
      font-size: .6em;
      border: 1px solid  transparent;
      border-radius: 8px;
      background-color: #a9a9a9;
      line-height: 8px;
  }
  progress::-webkit-progress-value {
      height: 8px;
      background-color: var(--color, #f00);
      border-radius: 5px;
  }
  progress::-moz-progress-bar {
      height: 8px;
      background-color: var(--color, #f00);
      border-radius: 5px;
  }
  </style>
  <script>
  </script>
</head>
<body>
<progress id="user-progress" value="0" max="100"></progress>
  <script>
document.addEventListener( "DOMContentLoaded" , function() {
  const animate = ({timing, draw, duration, resolve}) => {
  let start = performance.now();
  const loop = time => {
    let timeFraction = (time - start) / duration;
    if (timeFraction > 1) timeFraction = 1;
    let progress = timing(timeFraction);
    draw(progress);
    if (timeFraction < 1) {
      requestAnimationFrame(loop);
    }
    else resolve();
  };
  requestAnimationFrame(loop);
};
  function inOutQuad(n){
    n *= 2;
    if (n < 1) return 0.5 * n * n;
    return - 0.5 * (--n * (n - 2) - 1);
  };
  function easeOutExpo( t ) {
    if( t === 1 ) {
        return 1;
    }
    return ( -Math.pow( 2, -10 * t ) + 1 );
 }
 function linear(t)
 {
    return t;
 }
const data = [ 3, 5, 9, 4, 7];
const progressElement = document.getElementById('user-progress');
const draw = progress => progressElement.value = Math.round(progress * 100) ;
data.reduce((promise, sec) => {
  return promise.then(() => new Promise((resolve, reject) => {
  const color = '#' + ('00000'+(Math.random()*(1<<24)|0).toString(16)).slice(-6);
  progressElement.style.setProperty("--color", color);
  const option = {timing : inOutQuad, draw, duration : sec * 1000, resolve};
  animate(option);
      }));
}, Promise.resolve())
    });
 </script>
</body>
</html>
Ответить с цитированием
  #4 (permalink)  
Старый 29.02.2020, 13:14
Кандидат Javascript-наук
Отправить личное сообщение для Lefseq Посмотреть профиль Найти все сообщения от Lefseq
 
Регистрация: 19.04.2019
Сообщений: 124

Nexus,
рони,
Спасибо
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как сделать клик по элементу только один раз в день Alexodiy Events/DOM/Window 7 19.01.2018 15:23
Как сделать так чтобы по нажатию на кнопку выполнялась функция? Zombie_Killer Общие вопросы Javascript 11 06.07.2017 21:34
как сделать чтобы цикл не запускался второй раз Brook Events/DOM/Window 5 12.05.2013 21:43
Как сделать kwicks цикл один раз alexvost jQuery 3 22.03.2012 18:07
Как сделать, чтобы 2 ссылки отображались как hover при наведении мышкой на любую? Ava Элементы интерфейса 5 19.05.2009 23:24