Отображение индикатора выполнения обратного отсчета времени

#jquery #css

#jquery #css

Вопрос:

Я наткнулся на этот индикатор выполнения на этом сайте.

Что я хочу сделать, так это провести 3-минутный обратный отсчет и показать, сколько минут и секунд осталось. Поэтому вместо отображения процента я хочу отобразить оставшееся время.

Я использую следующий код:

JS

 progress(100, $('#progressBar')); // This is what the timer should update each second

function progress(percent, $element) {
    var progressBarWidth = percent * $element.width() / 100;
    $element.find('div').animate({ width: progressBarWidth }, 500).html(percent   " minutes/seconds to go");
};
  

HTML

 <div id="progressBar">
  <div></div>
</div>
  

CSS

  #progressBar {
  width: 923px;
  margin: 10px auto;
  height: 22px;
  background-color: #0A5F44;
}

#progressBar div {
  height: 100%;
  text-align: right;
  padding: 0 10px;
  line-height: 22px; /* same as #progressBar height if we want text middle aligned */
  width: 0;
  background-color: #CBEA00;
}
  

Комментарии:

1. Я думаю, что процентное соотношение в порядке для визуализации. Но в тексте должно отображаться, сколько времени осталось.

Ответ №1:

Вам нужно будет немного изменить эту функцию :

  • Используйте 3 параметра ( timeleft , timetotal , element ) вместо 2 фактических
  • Используйте setTimeout() для обновления индикатора выполнения каждую секунду
  • Проверьте timeleft , чтобы узнать, нужно ли вам обновить индикатор выполнения
 function progress(timeleft, timetotal, $element) {
    var progressBarWidth = timeleft * $element.width() / timetotal;
    $element
        .find('div')
        .animate({ width: progressBarWidth }, 500)
        .html(timeleft   " seconds to go");
    if(timeleft > 0) {
        setTimeout(function() {
            progress(timeleft - 1, timetotal, $element);
        }, 1000);
    }
};

progress(180, 180, $('#progressBar'));
  

Кроме того, вы должны добавить этот CSS, чтобы индикатор выполнения не переполнял контейнер :

 #progressBar div {
  box-sizing: border-box;
}
  

Фрагмент:

 function progress(timeleft, timetotal, $element) {
    var progressBarWidth = timeleft * $element.width() / timetotal;
    $element.find('div').animate({ width: progressBarWidth }, 500).html(timeleft   " seconds to go");
    if(timeleft > 0) {
        setTimeout(function() {
            progress(timeleft - 1, timetotal, $element);
        }, 1000);
    }
};

progress(180, 180, $('#progressBar'));  
 #progressBar {
  width: 90%;
  margin: 10px auto;
  height: 22px;
  background-color: #0A5F44;
}

#progressBar div {
  height: 100%;
  text-align: right;
  padding: 0 10px;
  line-height: 22px; /* same as #progressBar height if we want text middle aligned */
  width: 0;
  background-color: #CBEA00;
  box-sizing: border-box;
}  
 <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="progressBar">
  <div></div>
</div>  

[Совет]

Если вы хотите, чтобы индикатор выполнения плавно и постоянно уменьшался, используйте вместо этого этот код :

 .animate({ width: progressBarWidth }, timeleft == timetotal ? 0 : 1000, "linear")
  

Комментарии:

1. Таким образом, это уменьшает ширину от 100% до 0%, что, если бы я хотел сделать это наоборот, от 0 до 100?

2. продолжайте, это было «var progressBarWidth = (timetotal-timeleft) * ($element.width()/timetotal);»

3. Привет @zessx, как отключить индикатор выполнения из animate при загрузке страницы?