11486 sujets

JavaScript, DOM et API Web HTML5

Bonjour,

Je suis en train de travailler sur un site en bootstrap dans le cadre d'un cours. Sur celui-ci j'ai ajouté des barres de progression :

<div class="col-md-6">
                        <p class="competences-titres">Compétences</p>
                        <p class="competences-logiciel">Photoshop</p>
                        <div class="progress">
                        <div class="progress-bar" role="progressbar" aria-valuenow="65" aria-valuemin="0" aria-valuemax="100" style="width: 65%;">
                            <span class="sr-only">65% Complete</span>
                          </div>
                        </div>
                        
                        <p class="competences-logiciel">Indesign</p>
                        <div class="progress">
                        <div class="progress-bar" role="progressbar" aria-valuenow="90" aria-valuemin="0" aria-valuemax="100" style="width: 90%;">
                            <span class="sr-only">90% Complete</span>
                          </div>
                        </div>
                        
                         <p class="competences-logiciel">Illustrator</p>
                        <div class="progress">
                        <div class="progress-bar" role="progressbar" aria-valuenow="90" aria-valuemin="0" aria-valuemax="100" style="width: 90%;">
                            <span class="sr-only">90% Complete</span>
                          </div>
                        </div>
                        
                         <p class="competences-logiciel">HTML/CSS</p>
                        <div class="progress">
                        <div class="progress-bar" role="progressbar" aria-valuenow="40" aria-valuemin="0" aria-valuemax="100" style="width: 40%;">
                            <span class="sr-only">40% Complete</span>
                          </div>
                        </div>
                
                    </div>


J'aimerais animer ces dernières avec du javascript de manière a ce que l'on perçoive bien la progression. J'ai trouvé ça :

$(function (){
    function timer(n) {
        $(".progress-bar").css("width", n + "%");
        if(n = 100) {
                setTimeout(function() {
                    timer(n + 10);
            }, 200);
        }
    }
 
    timer(0); 
}); 


Les barres s'animent mais pas correctement. Etant débutante en javascript je n'arrive pas à changer les paramètres car je ne comprend pas tout. Si quelqu'un pouvait m'expliquer tout cela ce serait avec plaisir ! Smiley biggrin

Merci d'avance Smiley smile
Modifié par Celiadel (13 Apr 2017 - 22:41)
Bonjour.

Je ne suis pas une spécialiste du Javascript, je ne peux pas faire du sur-mesure.

À votre place, j'utiliserais l'élément 'progress' :
<section>
	<progress value="0" max="100" id="progress_selectionne"></progress>
</section>


Et pour le javascript :

var progress = document.querySelector('#progress_selectionne');

for (var i = 0; i<66; i++)
	{
	setTimeout((function(arg)
		{
		return function()
			{
			progress.value = arg;
			}})(i), i*100);
	}

Pas sûre que ce soit ce que vous voulez, car "les barres s'animent mais pas correctement", c'est un peu mystérieux...

Pour l'explication, la valeur i est 'capturée' à chaque tour de la boucle et utilisée immédiatement dans la fonction de retour. Enfin, c'est l'idée, car avec ces histoires de 'closures', je me sens un peu 'out of the loop'...

Smiley smile
Bonsoir,

Merci pour votre aide, malheureusement ça ne marche pas avec mon code bootstrap et si je mets votre html, cela change tout et je n'ai pas moyen de changer les css comme je veux Smiley ohwell

Quand je dis que "les barres s'animent mais pas correctement", j'entend par la que les barres sont au début a leur pourcentage, reviennent à 0 puis se remplissent au maximum...

Si quelqu'un a une idée je suis preneuse Smiley biggrin
C'est bien ce que fait ton code :
<div class="progress-bar" role="progressbar" aria-valuenow="65" aria-valuemin="0" aria-valuemax="100" style="width: 65%;">

Donc ta barre commence à 65% puis ton js se lance et donc la barre repart de zéro.
Modifié par bzh (14 Apr 2017 - 23:26)
Bonsoir,
if(n = 100)

Avec l'opérateur ==, ça devrait déjà aller mieux Smiley cligne
Et comme le dit bzh, votre code repart systématiquement à 0. Si vous adaptez pour partir à la valeur initiale de la progressbar, il se peut que la valeur 100 ne soit jamais atteinte, préférez donc une inégalité, ou forcez `n` à prendre la valeur 100 si n est supérieur à 100.
Bonsoir,

Merci pour votre aide, mais cela ne fonctionne pas. Je m'explique : pour la barre Photoshop par exemple, celle ci est au debut à 65%, puis elle se vide à 0 et ne se re-rémpli pas..

Si quelqu'un voir ce qui cloche, j'attends vos réponses Smiley biggrin
Encore merci Smiley smile
Autant* pour moi, ça marche mieux avec if(n < 100). Mais de toutes façons, le script est mal pensé puisque vous changez la largeur de toutes les barres avec une valeur unique qui démarre à 0 et pas à la valeur initiale déterminée par l'attribut aria-valuenow.
Voici votre script modifié en ajoutant en paramètre à timer la barre concernée :
$(function (){
  function timer(p,n) {
    n=Math.min(n,100);
    p.css("width", n + "%").text(n+"% Complete");
    if(n < 100) {
      setTimeout(function() {
        timer(p, n + 10);
      }, 200);
    }
  }
  $(".progress-bar").each(function(i,pb){
    timer($(pb),$(pb).attr("aria-valuenow")); 
  });
}); 
Merci beaucoup pour votre aide

Je pense que je fais mal quelque chose... Les barres partent ici de leur pourcentage de base pour remplir la barre entièrement. Or, je souhaiterais que la barre parte de 0 et arrive à 65% par exemple

Je suis désolée je suis vraiment débutante en java Smiley ohwell
Avec les bonnes informations, on va peut-être y arriver !
$(function (){
  function timer(p,n) {
    n=Math.min(n,p.attr("aria-valuenow"));
    p.css("width", n + "%").text(n+"% Complete");
    if(n < p.attr("aria-valuenow")) {
      setTimeout(function() {
        timer(p, n + 10);
      }, 200);
    }
  }
  $(".progress-bar").each(function(i,pb){
    timer($(pb),0); 
  });
}); 

Comprenez-vous ce code, au moins ?
Merci beaucoup ! ça marche Smiley biggrin

Désolée si je me suis mal exprimée Smiley ohwell
Dernière petite question, y a t 'il moyen de recharger les barres régulièrement pour que l'on voir leur mouvement si on n'y a pas prêter attention au début ?

Je vous avoue que je ne comprend pas vraiment..
Ok, je vous explique :
$(".progress-bar").each(function(i,pb){
    timer($(pb),0); 
  });

recherche tous les éléments ayant une classe "progress-bar", et pour chacun de ces éléments, on appelle la fonction timer en passant la progress-bar (sous la forme d'un objet jquery) et la valeur initiale, à savoir 0.
La fonction timer commence par ajuster la valeur reçue pour ne pas dépasser la valeur max. Pour cela, on prend la valeur minimale entre la valeur transmise et l'attribut "aria-valuenow".
On modifie la largeur (et le texte, je l'ai ajouté pour debuggage) et si on n'est pas à la valeur max, on rappelle timer 0.2s plus tard en incrémentant de 10 la progression (avis perso : c'est beaucoup plus fluide avec un incrément de 1 toutes les 10ms).

Pour renouveler le phénomène, il faut rappeler le code qui lance l'animation.
  function animate(){
    $(".progress-bar").each(function(i,pb){
      timer($(pb),0); 
    });
    setTimeout(animate,10000);
  }
  animate();
Merci beaucoup pour votre explication ! Smiley biggrin
et bien évidemment merci pour aide et votre patience Smiley smile
Modifié par Celiadel (17 Apr 2017 - 16:09)