J'ai configuré une barre de progression de l'interface utilisateur jQuery mais je ne peux pas utiliser jQuery animate pour animer sa valeur. Des idées sur la façon de faire fonctionner cela?
La variable percentDone
contient un nombre compris entre 0 et 100 indiquant la distance que doit parcourir la barre de défilement (cela fonctionne très bien).
J'ai essayé plusieurs choses en vain. Voici ce que j'ai jusqu'à présent:
var progressbar = $("#progressbar1").widget();
progressbar.animate({
value: percentDone
}, 5000, function() {
console.debug('done animating');
});
Notez que si je mets à jour la barre de défilement en utilisant la méthode "value" cela fonctionne très bien mais elle saute à cette valeur au lieu de l'animer en douceur:
$("#progressbar1").progressbar('value', percentDone);
$(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);
});
$(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 */
}
});
Dans une application réelle, vous n'aurez peut-être pas besoin de générer une boucle, par exemple, lors du téléchargement d'un fichier, votre application flash vous indiquera la taille du fichier et vous indiquera lorsque vous aurez atteint la valeur maximale requise, donc mon premier code est destiné à démontrer juste l'utilisation de la barre de progression setter et getter et bien sûr ce qui fait jouer le tout, c'est par exemple la boucle; le second est une adaptation du même concept au sucre.
Avec CSS3, il n'est pas nécessaire d'utiliser JavaScript pour gérer directement la valeur de la barre de progression. Ajoutez simplement ceci à votre style:
.ui-progressbar-value {
transition: width 0.5s;
-webkit-transition: width 0.5s;
}
Vous pouvez en savoir plus sur Transitions CSS .
Voici comment l'animer en douceur, plutôt que la manière quelque peu saccadée suggérée dans la réponse actuellement acceptée de @aSeptik. Il contourne la méthode .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')
une très bonne solution sur le forum jquery
http://forum.jquery.com/topic/smooth-progressbar-animation
la barre de progression doit être initialisée avec disons 0,1 pour fonctionner
$("#progressbar .ui-progressbar-value").animate(
{
width: "67%"
}, {queue: false});
A écrit ce plugin/méthode pour animer très facilement n'importe quelle barre de progression, et fonctionne très bien pour moi, donc j'espère que cela le fera pour tout le monde aussi.
(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 );
Ajoutez simplement ce code en haut de votre page n'importe où et utilisez-le sur un élément en tant que tel
$('#progressbar').animate_progressbar(value [, duration] [, easing] [, complete] );
MODIFIER:
Voici une version réduite du code, qui le charge un peu plus rapidement.
(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);
Voici une solution élégante: Barres de progression de Jquery croissantes
$(function() {
$("#progressbar").progressbar({
value: 1
});
$("#progressbar > .ui-progressbar-value").animate({
width: "37%"
}, 500);
});
Le script suivant anime non seulement la barre de progression, mais augmente/diminue également les valeurs affichées% pas à pas
// '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)) + '%');
}
});
vous pouvez le faire avec une simple progression native 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!');}});