IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaScript Discussion :

Animation continue d'images dans une fenêtre


Sujet :

JavaScript

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2019
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2019
    Messages : 35
    Points : 30
    Points
    30
    Par défaut Animation continue d'images dans une fenêtre
    Bonjours à vous, je fais face a un problème dans mon code j'ai deux images Vélo, quand je clique sur démarrer le premier vélo avance vers la droite et une fois que la roue du vélo touche le mur de couleur vert et bien le deuxième vélo fait sont apparition du coté gauche en sortant du mur de couleur vert pour aller en direction droite et le tout doit toujours bouclé a l'infinie sauf si l'utilisateur clique sur arrêter.

    présentement l'animation fonctionne seulement une seul fois pour mon velo2.
    exemple:
    Nom : Sans titre.jpg
Affichages : 275
Taille : 101,0 Ko


    mon code est loin d’être parfait et n'est pas adapter pour tous les écrans.

    Code HTML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    <!DOCTYPE html>
    <html class="clip-path lang="fr">
      <head>
        <meta charset="UTF-8" />
        <title>Exercice2: animation d'un vélo</title>
        <style>
          html {
            background-color: aquamarine;
          }
     
          
     
          body {
            width: 80%;
            margin: auto;
            background: white;
            clip-path: inset(0 0 0 0);
          }
     
          input {
            margin: 20px;
            padding: 5px;
          }
     
          #animation {
            position: relative;
            height: 200px;
          }
     
          #velo1,
          #velo2 {
            position: absolute;
            width: 342px;
            height: 200px;
          }
     
          img {
            position: absolute;
            display: block;
          }
     
          .velo {
            width: 100%;
          }
     
          .roue-arriere {
            bottom: 8px;
            left: 8px;
            width: 122px;
          }
     
          .roue-avant {
            bottom: 8px;
            left: 209px;
            width: 122px;
          }
     
          p {
            padding: 20px;
          }
        </style>
     
        <script>
          window.addEventListener("load", function() {
            // recuperation des images stocker dans un tableau
            var oImages = document.getElementsByTagName("img");
            
            // recuperation des images stocker dans un tableau
            var oVelo = document.getElementById("velo1");
            var oVelo2 = document.getElementById("velo2");
     
     
            //recuperation du bouton demarrer.
            var oDemarrer = document.getElementById("demarrer");
            //recuperation du bouton arreter
            var oArreter = document.getElementById("arreter");
            //recuperation de l'id duree
            var oDuree = document.getElementById("duree");
     
            //sens initial du deplacement
            var direction = "aDroite";
     
            var i = 0;
            var j = -1500;
            var debut;
     
            // fonction pour animation du velo du frame et des roues
            function animationVelo(temps) {
              if (direction == "aDroite") {
                i++;
                oVelo.style.left = i + "px";
                oImages[0].style.transform = "rotate(" + i + "deg)";
                oImages[1].style.transform = "rotate(" + i + "deg)";
              }
     
              if (direction == "aGauche") {
                i++;
                i = 0;
                oVelo.style.left = i + "px";
              }
     
              if (i === 1550) {
                direction = "aGauche";
                pass = true;
              }
     
              if (i === 0) {
                direction = "aDroite";
              }
     
              animationId = setTimeout(animationVelo, 1);
            }
     
     
     
            function animationVelo2() {
            
              if (direction == "aDroite") {
                j++;
                oVelo2.style.left = j + "px";
                oImages[3].style.transform = "rotate(" + j + "deg)";
                oImages[4].style.transform = "rotate(" + j + "deg)";
              }
     
              if (direction == "aGauche") {
                j++;
                j = 0;
                oVelo2.style.left = j + "px";
              }
     
              if (j === 1550) {
                direction = "aGauche";
              }
     
              if (j === -0) {
                direction = "aDroite";
              }
     
              animationId2 = setTimeout(animationVelo2, 1);
               
            }
           
          
     
     
     
            //fonction qui calcul les secondes de l'animation
            function timer(temps) {
              if (debut === 0) {
                debut = temps;
              }
              var duree = temps - debut;
              oDuree.innerHTML = Math.floor(duree / 1000);
     
              timerId = requestAnimationFrame(timer);
            }
     
            var timerId;
            var animationId;
            var animationId2;
            
     
            oDemarrer.addEventListener("click", function() {
              oDemarrer.type = "hidden";
              animationId = setTimeout(animationVelo, 1);
              animationId2 = setTimeout(animationVelo2, 1);
              timerId = requestAnimationFrame(timer);
              debut = 0;
              oArreter.type = "button";
            });
     
            oArreter.addEventListener("click", function() {
              oArreter.type = "hidden";
              clearTimeout(animationId);
              clearTimeout(animationId2);
              cancelAnimationFrame(timerId);
              oDemarrer.type = "button";
            });
     
          });
        </script>
      </head>
      <body>
        <input type="button" id="demarrer" value="Démarrer" />
        <input type="hidden" id="arreter" value="Arrêter" />
        <div id="animation">
          <div id="velo1">
            <img class="roue-arriere" src="images/roue.png" alt="" />
            <img class="roue-avant" src="images/roue.png" alt="" />
            <img class="velo" src="images/velo.png" alt="" />
          </div>
     
          <div id="velo2">
            <img class="roue-arriere" src="images/roue.png" alt="" />
            <img class="roue-avant" src="images/roue.png" alt="" />
            <img class="velo" src="images/velo.png" alt="" />
          </div>
        </div>
        </div>
        <p>Durée de l'animation: <span id="duree">0</span> s</p>
      </body>
    </html>

  2. #2
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    16 956
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 16 956
    Points : 44 116
    Points
    44 116
    Par défaut
    Bonjour,
    il ne t'es peut-être pas utile de gérer 2 « timeout » mais pour commencer je dirais que tes tests aux bornes ne sont pas corrects
    .
    Il est plus simple de considérer que le bord gauche de ton « image de gauche », celle que tu appelles velo2 est quoiqu'il arrive à une distance de constante de ton « image de droite », celle que tu appelles velo1, cette distance est égale à la largeur de la fenêtre de défilement, ton élément <div id="animation">.
    Au départ donc tu devrais avoir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    const LARG_FENETRE = document.getElementById("animation").clientWidth;
    const LARG_IMAGE = document.getElementById("velo1").clientWidth;
    et au démarrage tu positionnes tes éléments
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    let posX = -LARG_IMAGE;
    oVelo.style.left = posX + "px";
    oVelo2.style.left = (posX - LARG_FENETRE) + "px";
    Maintenant, nous allons faire abstraction de la rotation des roues pour ne se faire déplacer que les éléments oVelo et oVelo2.

    Il te suffit d'une seule fonction d'animation pour arriver à tes fins, par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    function animationVelo(temps) {
      posX += 1;
      if (posX > LARG_FENETRE) {
        posX = 0;
      }
      oVelo.style.left = posX + "px";
      oVelo2.style.left = (posX - LARG_FENETRE) + "px"
      animationId = setTimeout(animationVelo, 1);
    }
    c'est simplifié mais le principe est là !

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2019
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2019
    Messages : 35
    Points : 30
    Points
    30
    Par défaut
    WOW génial je connaissais pas clientWidth c'est très efficace, une belle découverte pour moi, tout fonctionne à merveille.

    merci de partager ton expérience avec la communauté

  4. #4
    Expert confirmé
    Avatar de javatwister
    Homme Profil pro
    danseur
    Inscrit en
    Août 2003
    Messages
    3 681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : danseur

    Informations forums :
    Inscription : Août 2003
    Messages : 3 681
    Points : 5 221
    Points
    5 221
    Par défaut
    ptite mise en situation loufoque: http://javatwist.imingo.net/animvelo.htm

    attention, clientWidth n'est pas une propriété standard

  5. #5
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    16 956
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 16 956
    Points : 44 116
    Points
    44 116
    Par défaut
    attention, clientWidth n'est pas une propriété standard
    tout comme offsetWidth, scrollWidth mais qui sont unanimement reconnues depuis IE, le presque plus ancien, et pour cause c'est IE qui les a introduites. De plus elles font parties des drafts donc pas franchement de risque à l'utilisation.

    Pour en revenir à l'animation je verrais quand même deux points d'amélioration
    • Utilisation d'une transformation, translate, plutôt que de modifier les propriétés left ou encore margin-left ;
    • Utilisation d'un conteneur unique contenant toutes les images et modifier uniquement celui-ci.

  6. #6
    Expert confirmé
    Avatar de javatwister
    Homme Profil pro
    danseur
    Inscrit en
    Août 2003
    Messages
    3 681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : danseur

    Informations forums :
    Inscription : Août 2003
    Messages : 3 681
    Points : 5 221
    Points
    5 221
    Par défaut
    Ah oui dis donc! translate - que je n'ai jamais utilisé - est prometteur; surtout si ça évite de fixer des positions (absolute, relative);
    Utilisation d'un conteneur unique contenant toutes les images et modifier uniquement celui-ci
    Très intéressant pour une kyrielle de vélos (mais je garderais quand même 2 éléments img, disons, en faisant une boucle sur le src);

  7. #7
    Expert confirmé
    Avatar de javatwister
    Homme Profil pro
    danseur
    Inscrit en
    Août 2003
    Messages
    3 681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : danseur

    Informations forums :
    Inscription : Août 2003
    Messages : 3 681
    Points : 5 221
    Points
    5 221
    Par défaut
    ptite maj pour série de x images;


    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>...</title>
    <link rel="preload" href="velo1.png" as="image">
    <link rel="preload" href="velo2.png" as="image">
    <link rel="preload" href="velo3.png" as="image">
    <link rel="preload" href="velo4.png" as="image">
    <style>
    #cadre {position:relative;padding:0px;margin:0px auto;width:800px;overflow:hidden;border:yellow solid 2px;height:200px}
    #v1,#v2{margin:0px;background:transparent;position:absolute;top:50px;left:-200px;width:200px;height:100px}
    button {display:block;margin:10px auto}
    </style>
    </head>
    <body>
     
    <div id="cadre">
    <img src="velo1.png" id="v1" alt="vélo 1" />
    <img src="velo2.png" id="v2" alt="vélo 2" />
    </div>
    <button id="but">arrêter</button>
     
    <script>
    window.addEventListener("load",()=>{
            let other, im=1, pos=[-200,-1000], actu=1, timer=setInterval(go,actu);
            function go(){
                    pos[0]+=2; pos[1]+=2;
                    for(let i=0;i<pos.length;i++){
                            if(pos[i]==600){
                                    other= i==0 ? 1 : 0;
                                    pos[other]=-200;
                                    im= im==4 ? 1 : (im+1);
                                    document.images[other].src="velo"+im+".png"
                            }
                    }
                            document.images[0].style.left=pos[0]+"px";      
                            document.images[1].style.left=pos[1]+"px";      
            }
            document.getElementById("but").addEventListener("click",function(e){
                    if(!timer){timer=setInterval(go,actu);e.target.textContent="arrêter"}
                    else{clearInterval(timer);e.target.textContent="repartir";timer=false}
            })
    })
    </script>
    </body>
    </html>

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Défilement d'images dans une fenêtre
    Par vince351 dans le forum AWT/Swing
    Réponses: 3
    Dernier message: 03/05/2007, 14h13
  2. [PB 10.5] Afficher une image dans une fenêtre
    Par cagoule dans le forum Powerbuilder
    Réponses: 2
    Dernier message: 27/02/2007, 22h22
  3. Problème d'insertion d'image dans une fenêtre.
    Par Antigonos Ier Gonatas dans le forum Tkinter
    Réponses: 2
    Dernier message: 26/08/2006, 12h44
  4. afficher une image dans une fenêtre windows
    Par yashiro dans le forum Bibliothèques
    Réponses: 3
    Dernier message: 02/05/2006, 16h30
  5. Affichage d'images dans une fenêtre
    Par tonycalv dans le forum MFC
    Réponses: 6
    Dernier message: 20/04/2005, 20h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo