Как вы анимируете значение для индикатора прогресса jQuery UI? - PullRequest
35 голосов
/ 19 февраля 2011

Я настроил индикатор выполнения jQuery UI, но не могу использовать jQuery animate для анимации его значения. Любые идеи о том, как сделать эту работу?

Переменная percentDone содержит число от 0 до 100, показывающее, как далеко должна быть полоса прокрутки (это нормально работает).

Я пробовал несколько разных вещей безрезультатно. Вот что у меня есть:

var progressbar = $("#progressbar1").widget();

progressbar.animate({
    value: percentDone
}, 5000, function() {
    console.debug('done animating');
});

Обратите внимание, что если я обновлю полосу прокрутки, используя метод "value", она будет работать нормально, но она перейдет к этому значению вместо плавной анимации:

$("#progressbar1").progressbar('value', percentDone);

Ответы [ 8 ]

59 голосов
/ 19 февраля 2011
  • DEMO 1: первый, подтверждение концепции
$(function() {
    var pGress = setInterval(function() {
        var pVal = $('#progressbar').progressbar('option', 'value');
        var pCnt = !isNaN(pVal) ? (pVal + 1) : 1;
        if (pCnt > 100) {
            clearInterval(pGress);
        } else {
            $('#progressbar').progressbar({value: pCnt});
        }
    },10);
});
  • DEMO 2: : адаптация отклика @ Питера ниже для бога ;-).
$(function() {
    $('#progressbar').progressbar(); // inizializa progressbar widget
    $pVal = $('.ui-progressbar-value').addClass('ui-corner-right');
    var pGress = setInterval(function() { //generate our endless loop
        var pCnt = $pVal.width(); // get width as int
        // generate a random number between our max 100 and it's half 50, 
        // this is optional, and make the bar move back and forth before
        // we reach the end.
        var rDom = Math.floor(Math.random() * (100 - 50 + 1) + 50);
        var step = rDom >= 100 ? 100: rDom; // reached our max ? reset step.
        doAnim(step);
    },1000);
    var doAnim = function(wD) {
        // complete easing list http://jqueryui.com/demos/effect/easing.html
        $pVal.stop(true).animate({width: wD + '%'},1000, 'easeOutBounce');
        if (wD >= 100) clearInterval(pGress) /* run callbacks here */
    }
});

В реальном приложении вам может не потребоваться генерировать цикл, например, при загрузке файла ваше флэш-приложение сообщит вам размер файла и сообщит вам, когда вы достигнете необходимого максимального значения, поэтому мой первый код: намеревался продемонстрировать только использование установщика и получателя прогрессбара и, конечно, то, что заставляет все это играть, например, цикл; второй - адаптация той же концепции с сахаром.

41 голосов
/ 19 июля 2013

Анимация с CSS3

В CSS3 нет необходимости использовать JavaScript для непосредственного управления значением индикатора выполнения.Просто добавьте это в свой стиль:

.ui-progressbar-value {
  transition: width 0.5s;
  -webkit-transition: width 0.5s;
}

Вы можете узнать больше о CSS3 Transitions .

34 голосов
/ 10 июля 2011

Здесь показано, как сделать так, чтобы анимация происходила плавно, а не каким-то резким способом, предложенным в принятом в настоящее время ответе @aSeptik.Обходит метод .progressbar('value, ...).

// On load, make the progressbar inside always have round edges:
// (This makes it look right when 100%, and seems nicer all the time to me.)
$("#progressbar .ui-progressbar-value").addClass("ui-corner-right");

new_width = "50px";  // you will need to calculate the necessary width yourself.
$("#progressbar .ui-progressbar-value").animate({width: new_width}, 'slow')
11 голосов
/ 19 июня 2012

очень хорошее решение на форуме jquery

http://forum.jquery.com/topic/smooth-progressbar-animation

индикатор выполнения должен быть инициализирован, скажем, 0,1, чтобы работать

$("#progressbar .ui-progressbar-value").animate(
{
  width: "67%"
}, {queue: false});
8 голосов
/ 06 декабря 2011

Написал этот плагин / метод, чтобы очень легко анимировать любой индикатор прогресса, и он работает очень хорошо для меня, поэтому я надеюсь, что он подходит и для всех остальных.

(function( $ ) {
    $.fn.animate_progressbar = function(value,duration,easing,complete) {
        if (value == null)value = 0;
        if (duration == null)duration = 1000;
        if (easing == null)easing = 'swing';
        if (complete == null)complete = function(){};
        var progress = this.find('.ui-progressbar-value');
        progress.stop(true).animate({
            width: value + '%'
        },duration,easing,function(){
            if(value>=99.5){
                progress.addClass('ui-corner-right');
            } else {
                progress.removeClass('ui-corner-right');
            }
            complete();
        });
    }
})( jQuery );

Просто добавьте этот код в верхнюю часть вашей страницы в любом месте и используйте его как элемент

$('#progressbar').animate_progressbar(value [, duration] [, easing] [, complete] );

EDIT:

Вот уменьшенная версия кода, она загружается немного быстрее.

(function(a){a.fn.animate_progressbar=function(d,e,f,b){if(d==null){d=0}if(e==null){e=1000}if(f==null){f="swing"}if(b==null){b=function(){}}var c=this.find(".ui-progressbar-value");c.stop(true).animate({width:d+"%"},e,f,function(){if(d>=99.5){c.addClass("ui-corner-right")}else{c.removeClass("ui-corner-right")}b()})}})(jQuery);
3 голосов
/ 18 декабря 2012

Вот элегантное решение: Растущие индикаторы прогресса Jquery

$(function() {
$("#progressbar").progressbar({
value: 1
});
$("#progressbar > .ui-progressbar-value").animate({
width: "37%"
}, 500);
});
1 голос
/ 06 августа 2015

Вы можете сделать это с простым собственным прогрессом html5.
html:

<progress id="score-progress-bar" value="10" max="100"></progress>

js:

$('#score-progress-bar').animate({value: your_value_from_0_to_100}, {duration: time_in_ms, complete: function(){console.log('done!');}});
1 голос
/ 10 марта 2014

Следующий скрипт не только анимирует индикатор выполнения, но и увеличивает / уменьшает отображаемые% значений шаг за шагом

            // 'width' can be any number

               $('#progressbar .ui-progressbar-value').animate(
                {
                  width: width + '%'
                },
                {
                  duration: 3000,
                  step: function (now, fx) {
                      $('.leftvalue').html(parseInt(now) + '%');
                      $('.rightvalue').html((100 - parseInt(now)) + '%');
                  }
                });
...