Как вы можете оживить значение для панели прогресса jQuery UI?
Я установил jQuery UI progressbar, но не могу использовать анимацию jQuery, чтобы оживить ее значение. Любые идеи о том, как сделать эту работу?
Переменная percentDone
содержит число от 0 до 100, показывающее, насколько далеко по полосе прокрутки (это отлично работает).
Я пробовал несколько разных вещей безрезультатно. Вот что я до сих пор:
var progressbar = $("#progressbar1").widget();
progressbar.animate({
value: percentDone
}, 5000, function() {
console.debug('done animating');
});
Обратите внимание, что если я обновляю полосу прокрутки с помощью метода "значение", она отлично работает, но она переходит к этому значению, а не плавно анимирует его:
$("#progressbar1").progressbar('value', percentDone);
Ответы
Ответ 1
- 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:: адаптация ответа @Peter ниже ради хорошего;-).
$(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 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 */
}
});
В реальном приложении вам может не понадобиться генерировать цикл, например, при загрузке файла, ваша флеш-аппликация сообщит вам размер файла и сообщит вам, когда вы достигнете максимального значения, поэтому мой первый код предназначенный для демонстрации просто использования мастера настройки прогресса и геттера и, конечно же, что заставляет все это играть, то есть цикл; вторая - адаптация той же концепции с сахаром.
Ответ 2
Анимация с помощью CSS3
С CSS3 нет необходимости использовать JavaScript для непосредственного управления значением индикатора выполнения. Просто добавьте это в свой стиль:
.ui-progressbar-value {
transition: width 0.5s;
-webkit-transition: width 0.5s;
}
Вы можете узнать больше о переходах CSS3.
Ответ 3
Вот, как заставить его плавно анимировать, а не несколько отрывистый способ, предложенный в принятом в настоящее время ответе @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')
Ответ 4
очень хорошее решение на форуме jquery
http://forum.jquery.com/topic/smooth-progressbar-animation
должен быть инициализирован индикатор прогресса, и пусть 0,1 работает
$("#progressbar .ui-progressbar-value").animate(
{
width: "67%"
}, {queue: false});
Ответ 5
Написал этот плагин/метод, чтобы очень легко анимировать любой прогрессбар, и работает очень хорошо для меня, поэтому я надеюсь, что это и для всех остальных.
(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);
Ответ 6
Вот изящное решение: Растущие JQuery Progress Bars
$(function() {
$("#progressbar").progressbar({
value: 1
});
$("#progressbar > .ui-progressbar-value").animate({
width: "37%"
}, 500);
});
Ответ 7
После script не просто анимировать прогресс, но и увеличивать/уменьшать отображаемые% значений шаг за шагом
// '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)) + '%');
}
});
Ответ 8
вы можете сделать это с помощью простого собственного прогресса 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!');}});