Bonjour !
Je cherche à pouvoir modifier l'avancement d'une barre de completion avec un clique de souris en JS (voir le faire glisser à la souris).
Voici le code de ma barre :
Du html :

<div class="bar-content">
   <div class="bar-progression" style="width: 28%">
   </div>
</div>

Du css :

.bar-content{
    width: 100%;
    height: 7px;
    border: 1px rgb(0, 140, 255) solid;
}

.bar-progression{
    height: 100%;
    background-color:rgb(0, 140, 255);
}

Plus bête on sait pas faire.
Je voudrais que quand je clique sur un endroit de "bar-content", "bar-progression" se redimentionne pour venir se mettre à l'endroit où j'ai cliqué. (en bonus, si je clique/glisse sur "bar-content", que "bar-progression" suive le mouvement).

Alors, dit comme çà, la fonctionnalité à l'air toute cruche, mais, soit je m'y prends pas comme il faut, soit va falloir faire une usine à gaz

J'aimerais bien si quelqu'un pouvait déjà m'orienter sur la méthodologie d'une telle feature : comment s'y prendre, par où commencer, la barre est-elle mal conçue dès le départ, p-ê trop simple ? Des jours que je m'y casse les dents. J'étudie JS depuis 2 mois (pour info), peut-être n'est-ce pas de mon niveau... Mais il faut bien progresser, non ? ;-)

Jusqu'à présent j'ai mon eventListener qui capte quand la souris passe, et s'en va de "bar-content" et qui console.log('bonjour') et ('au revoir'), mais c'est tout.

Merci !

4 réponses


****Bonjour,

Il va falloir que tu gères un clic sur ta div (barre de progression) à l'aide de l'event listener: https://developer.mozilla.org/fr/docs/Web/API/EventTarget/addEventListener
Ensuite tu devrais pouvoir récupérer la position grâce à event.target.getBoundingClientRect()

A partir de là tu auras plus qu'à modifier la taille de ta barre en faisant un:

const width = /* ta width en % */
document.querySelector('.bar-progression').style.width = `${width}%`

Le code suivant n'est pas du tout testé, mais devrait donner un axe à suivre:

const barEl = document.querySelector('.bar-progression')

barEl.addEventListener('click', e => {
      const rect = e.target.getBoundingClientRect();
      const x = e.clientX - rect.left; //x position within the element.
      const barTotalWidth = rect.width
      const percent = 100 * (x / barTotalWidth)

      barEl.style.width = `${percent}%`
})
rafalex
Auteur

Bonjour, Et merci Pandazaur (mangeur de panda ? !)

Alors j'ai bien avancé sur mon pb.
Voici le code que j'ai fait :

   resizeContentBarStart  : function(event){
        //console.log(event.currentTarget);
        progressBarContent = event.currentTarget

        // 1- trouver le point de départ en X de la content bar :
        //* getBoundingClientRect() est une fonction JS qui va nous permettre de retrouver les
        //* propriétés de notre élément (positionX, y, largeur, heuteur...)
        const progressBarContentPosition = progressBarContent.getBoundingClientRect();

        // 2- trouver la posistion de la souris: çà s'appelle event.x (ou event.clientX)

        // 3- trouver la barre de progression (bar-progress)
        progressBarElement = progressBarContent.querySelector('.bar-progression');

        // 4- Calculer la nouvelle longueur de la div (on fait juste un produit en croix qu'on arrondis en 0.5)
        const newProgression = Math.round((((event.x - progressBarContentPosition.x) / progressBarContentPosition.width) * 100) * 2)/2 ;    
        // 5- envoyer la nouvelle valeur à la progression-bar
        progressBarElement.style.width = newProgression + "%";
        //console.log(newProgression);
    },

Et donc celà fonctionne (et j'en suis ravi !) Il se lance sur un mousedown et c'est donc bien !
Je m'attaque au bonus et là, je coince encore un peu j'avoue :

Comment faire un event Listener qui, au mousedown traque la position X de la souris et redimentionne la progress-bar en fonction, même si la souris sort du event.target, et ce, tant qu'on a pas d'évenement mouseup ? faudrait faire un while(1) ? J'ai essayé çà marche moyen... Un mousemove ? Il ne fonctionnera pas hors du target...
J'avoue que je sèche un peu... Des pistes ?
Merci !

Tu peux essayer de faire un event listener sur le mousedown qui crée un event listener mousemove et supprimer cet event listener une fois que tu as un mouseup.

function onMouseMove(e) {
     // Ta logique de récupération de la position, etc ...
     console.log({ e }) // affiche l'event 
}

element.addEventListener('mousedown', (e) => {
     element.addEventListener('mousemove', onMouseMove)
})

element.addEventListener('mouseup', (e) => {
     element.removeEventListener('mousemove', onMouseMove)
})
rafalex
Auteur

Pas mal,
Je savais pas qu'on pouvais supprimer des eventListener !
Je vais essayer çà et je fais un retour.
Merci beaucoup !