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 :

Changement de photo avec effets différents


Sujet :

JavaScript

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Pour le plaisir
    Inscrit en
    Novembre 2012
    Messages
    178
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Pour le plaisir
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Novembre 2012
    Messages : 178
    Par défaut Changement de photo avec effets différents
    Bonjour
    je n'arrive pas a changer l'ancienne photo qui à l'effet de rotation.
    Actuellement ça fait l'effet 1 et 2 avec la photo cliqué.
    pourtant dans la console ça m'affiche bien l'ancienne photo avant clic


    Code : 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
    function displayPics()
    {
      var photos = document.getElementById('galerie_mini') ;
      // On récupère l'élément ayant pour id galerie_mini
      var liens = photos.getElementsByTagName('a') ;
      // On récupère dans une variable tous les liens contenu dans galerie_mini
      var big_photo = document.getElementById('big_pict') ;
      // Ici c'est l'élément ayant pour id big_pict qui est récupéré, c'est notre photo en taille normale
      var back_photo = document.getElementById('zomclic') ;
     
     
      //var titre_photo = document.getElementById('photo').getElementsByTagName('dt')[0] ;
      // Et enfin le titre de la photo de taille normale
      // Une boucle parcourant l'ensemble des liens contenu dans galerie_mini
      for (var i = 0 ; i < liens.length ; ++i) {
        // Au clique sur ces liens 
        liens[i].onclick = function() {
    		var urlfoto = this.href;
    		var backgroun = "url("+urlfoto+")";
    		var srcimg = back_photo.getElementsByTagName('img'); // collection d’éléments IMG
    		var linkimg = srcimg.item(0).src; // premier élément IMG, puis attribut src
    big_photo.src = linkimg; 
    setTimeout(() => {
    big_photo.removeAttribute("class");	 
    back_photo.removeAttribute("style");
    big_photo.classList.add('effetfoto');
      }, 50);
     
    console.log(linkimg); 
          big_photo.src = this.href; // On change l'attribut src de l'image en le remplaçant par la valeur du lien
          //big_photo.alt = this.title; // On change son titre
          //titre_photo.firstChild.nodeValue = this.title; // On change le texte de titre de la photo
     
     
    setTimeout(() => {
    	back_photo.removeAttribute("style");
        big_photo.removeAttribute("class");
    	big_photo.classList.add('effetfoto2');
    	back_photo.style.backgroundImage = backgroun;
      }, 150);
    	 return false; // Et pour finir on inhibe l'action réelle du lien
        };
      }
    }
     
    // Il ne reste plus qu'à appeler notre fonction au chargement de la page
    window.onload = displayPics;
    Code CSS : 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
    .effetfoto {
     
    	animation: efoto .25s;
    }
    @keyframes efoto {
      0% {
    transform:rotate(0deg);
      }
      100% {
        opacity: 1;
    transform:rotate(360deg) scale(0,0);
      }
    }
     
    .effetfoto2 {
    	animation: efoto2 .25s;
    }
    @keyframes efoto2 {
      0% {
    transform:scale(1,0);
    	opacity:0;
      }
      100% {
    transform:scale(1,1);
    	opacity:1;
      }
    }


    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
    <div id="galerie">
      <dl id="photo">
        <dt>&nbsp;</dt>
        <dd><figure id="zomclic" class="zoome centbvente" onmousemove="zoomf(event)" style="background-image: url(&quot;http://webcom/photos/9-astuce.jpg&quot;); background-position: 0.285714% 59%;"><img id="big_pict" name="princ_pict" src="http://webcom/photos/9-astuce.jpg" alt="photo de Soulager les piqures de moustique" class="effetfoto2"></figure>
    	</dd>
      </dl>
     
     
           <div id="carousel">
       <div id="contentcara">	   
    	   <ul id="galerie_mini">
     
     
     
        <li>
          <a href="./photos/9-astuce.jpg" title="9-astuce.jpg"><img src="./photos/9-astuce.jpg" alt="photo de Soulager les piqures de moustique"></a>   
    	  </li>
     
     
        <li>
          <a href="./photos/10-astuce.jpg" title="10-astuce.jpg"><img src="./photos/10-astuce.jpg" alt="photo de Soulager les piqures de moustique"></a>   
    	  </li>
     
     
        <li>
          <a href="./photos/11-astuce.jpg" title="11-astuce.jpg"><img src="./photos/11-astuce.jpg" alt="photo de Soulager les piqures de moustique"></a>   
    	  </li>
     
     
        <li>
          <a href="./photos/13-astuce.jpg" title="13-astuce.jpg"><img src="./photos/13-astuce.jpg" alt="photo de Soulager les piqures de moustique"></a>   
    	  </li>
     
     
        <li>
          <a href="./photos/14-astuce.jpg" title="14-astuce.jpg"><img src="./photos/14-astuce.jpg" alt="photo de Soulager les piqures de moustique"></a>   
    	  </li>
     
     
        <li>
          <a href="./photos/15-astuce.jpg" title="15-astuce.jpg"><img src="./photos/15-astuce.jpg" alt="photo de Soulager les piqures de moustique"></a>   
    	  </li>
     
     
        <li>
          <a href="./photos/16-astuce.jpg" title="16-astuce.jpg"><img src="./photos/16-astuce.jpg" alt="photo de Soulager les piqures de moustique"></a>   
    	  </li>
     
     
        <li>
          <a href="./photos/18-astuce.jpg" title="18-astuce.jpg"><img src="./photos/18-astuce.jpg" alt="photo de Soulager les piqures de moustique"></a>   
    	  </li>
     
     
    	</ul>
    </div>	
    	 <button id="prev"></button>
        <button id="next" style="display: none;"></button>
    	</div>
    </div>

  2. #2
    Membre chevronné Avatar de ASCIIDEFOND
    Homme Profil pro
    Autodidacte
    Inscrit en
    Novembre 2002
    Messages
    235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Landes (Aquitaine)

    Informations professionnelles :
    Activité : Autodidacte

    Informations forums :
    Inscription : Novembre 2002
    Messages : 235
    Par défaut
    Salut maxtrident,

    Si j'ai bien compris ce que tu recherches, c'est que l'ancienne image doit s'afficher en haut à gauche après un clique sur une nouvelle image.
    J'ai donc allégé un peu la partie JavaScript, modifier un peu tes codes CSS et HTML pour atteindre la résultat attendu.
    Ce n'est pas la panacée mais si cela te convient ?

    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
    <!DOCTYPE html>
    <html lang="en">
      <head>
        <meta charset="UTF-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <title>Document</title>
        <style>
          img {
            width: 200px;
            height: 150px;
          }
     
          .effetfoto {
            animation: efoto 0.25s;
          }
     
          #zomclic {
            height: 500px;
            background-repeat: no-repeat;
            background-size: contain;
          }
     
          @keyframes efoto {
            0% {
              transform: rotate(0deg);
            }
     
            100% {
              opacity: 1;
              transform: rotate(360deg) scale(0, 0);
            }
          }
     
          .effetfoto2 {
            animation: efoto2 0.25s;
          }
     
          @keyframes efoto2 {
            0% {
              transform: scale(1, 0);
              opacity: 0;
            }
     
            100% {
              transform: scale(1, 1);
              opacity: 1;
            }
          }
        </style>
      </head>
     
      <body>
        <div id="galerie">
          <dl id="photo">
            <dt>&nbsp;</dt>
            <dd>
              <figure
                id="zomclic"
                class="zoome centbvente"
                data-image="http://webcom/photos/photos/9-astuce.jpg"
                style="background-image: url('http://webcom/photos/photos/9-astuce.jpg')"
              >
                <img
                  id="big_pict"
                  name="princ_pict"
                  src="http://webcom/photos/photos/9-astuce.jpg"
                  alt="photo de Soulager les piqures de moustique"
                  class="effetfoto2"
                />
              </figure>
            </dd>
          </dl>
     
          <div id="carousel">
            <div id="contentcara">
              <ul id="galerie_mini"></ul>
            </div>
            <button id="prev"></button>
            <button id="next" style="display: none"></button>
          </div>
        </div>
     
        <script>
          const images = [
            // On crée un tableau avec les noms et infos des images
            { nomimage: '9-astuce.jpg', titre: 'Info de photo 9' },
            { nomimage: '10-astuce.jpg', titre: 'Info de photo 10' },
            { nomimage: '11-astuce.jpg', titre: 'Info de photo 11' },
            { nomimage: '13-astuce.jpg', titre: 'Info de photo 13' },
            { nomimage: '14-astuce.jpg', titre: 'Info de photo 14' },
            { nomimage: '15-astuce.jpg', titre: 'Info de photo 15' },
            { nomimage: '16-astuce.jpg', titre: 'Info de photo 16' },
            { nomimage: '18-astuce.jpg', titre: 'Info de photo 18' }
          ]
     
          const photos = document.getElementById('galerie_mini'),
            big_photo = document.getElementById('big_pict'),
            back_photo = document.getElementById('zomclic'),
            titre_photo = document.getElementsByTagName('dt')[0]
     
          var baliseli = ''
     
          titre_photo.innerText = images[0].titre // On affiche le titre de la première image
     
          for (let indeximg of images) {
            baliseli += `<li><img class="baliseLien" src="http://webcom/photos/${indeximg.nomimage}" title="${indeximg.titre}" alt="photo de Soulager les piqures de moustique"></li>`
          }
     
          photos.innerHTML = baliseli // On affiche les balises li dans "galerie-mini"
          
          //On boucle pour créer un array des balises li
          for (let baliseLienSelect of document.querySelectorAll('.baliseLien')) {      
            let backgroun = back_photo.dataset.nameimage //On récupère le nom de l'ancienne image via l'attribut "data-image"
     
            baliseLienSelect.addEventListener('click', () => {
              titre_photo.innerText = baliseLienSelect.title // Titre de l'image sélectionnée
     
              setTimeout(() => {
                back_photo.style.backgroundImage = `url("${baliseLienSelect.src}")` // l'url = au li sélectionné
                big_photo.classList.remove('effetfoto2')
                big_photo.classList.add('effetfoto')
                big_photo.src = back_photo.dataset.image //l'image précédente affichée en haut à gauche
              }, 50)
     
              setTimeout(() => {
                big_photo.classList.remove('effetfoto')
                big_photo.classList.add('effetfoto2')
                back_photo.style.backgroundImage = backgroun // Nom de l'ancienne image pour l'url de "background-image"
                back_photo.dataset.image = baliseLienSelect.getAttribute('src') // Nom de la nouvelle image pour l'attribut "data-image"
              }, 150)
            })
          }
        </script>
      </body>
    </html>

  3. #3
    Modérateur

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

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 207
    Par défaut
    Bonjour,
    Actuellement ça fait l'effet 1 et 2 avec la photo cliqué.
    ... perso je n'ai pas tout bien compris mais je vais faire une supposition.

    Est ce que ce que tu veux est que la grande image disparaisse avec l'effet #1 et que l'image cliquée vienne prendre sa place en apparaissant avec l'effet #2.

    Plusieurs remarques :

    Inutile de surcharger le HTML avec des balises <a> qui ne servent à rien d'autant que tu en annules leur action par défaut, autant ne rien mettre.

    Lorsque l'on veut synchroniser des animations on le fait en écoutant l'événement animationend de l'élément en cours d'animation mais pas en mettant une ribambelle de setTimeout qui peuvent ne pas correspondre aux délais des différentes animations en cours.

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    // supprime la class en fin d'animation
    oImg.addEventListener('animationend', function(e){
      this.classList.remove('show-hide');
    });

  4. #4
    Membre confirmé
    Homme Profil pro
    Pour le plaisir
    Inscrit en
    Novembre 2012
    Messages
    178
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Pour le plaisir
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Novembre 2012
    Messages : 178
    Par défaut
    bonjour
    je n'avais pas vue les réponses
    @ASCIIDEFOND
    merci pour ta modif mais ça ne fonctionnera pas pour moi car les photos sont différentes pour chaque page et je ne vois pas comment faire le tableau venant de php et la photo doit être remplacer img id= "big_pict"
    php
    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
    <div id="galerie">
      <dl id="photo" >
        <dt>&nbsp;</dt>
        <dd><figure id="zomclic" class="zoome centbvente" onmousemove="zoomf(event)" style="background-image: url(<?php echo $repfoto.$listfoto[0]; ?>)"><img id="big_pict" name="princ_pict" class="effetfoto" src="<?php echo $repfoto.$listfoto[0]; ?>" alt="photo de <?php echo $titre_astuce; ?>"/></figure>
    	</dd>
      </dl>
     
     
           <div id="carousel">
       <div id="contentcara">	   
    	   <ul id="galerie_mini">
     
     
      	<?php
            foreach ($listfoto as $foto){
            ?>
     
        <li>
          <a href="<?php echo $repfoto.$foto; ?>" title="<?php echo $foto; ?>"><img src="<?php echo $repfoto.$foto; ?>" alt="photo de <?php echo $titre_astuce; ?>" /></a>   
    	  </li>
     
    	<?php
            }
            ?>
     
    	</ul>

    @NoSmoking

    oui c'est bien ça " la grande image disparaisse avec l'effet #1 et que l'image cliquée vienne prendre sa place en apparaissant avec l'effet #2."
    je ne comprend pas car l'ancienne image et bien indiqué dans console.log(linkimg); mais l'effet 1 se fait sur la photo cliquée et refait éffet2
    j'ai enlever pour test le style="background-image: qui sert pour le zoom mais c'est pareille.

    pour remplacer le "a" par un div en plus une class et le css pour le pointer, je ne sait pas si c'est quifquif pour surcharger le HTML.

    j'ai mis les animationend mais toujours pareille et l'effet 1 ne fonctionne pas...si j'ai bien compris ça attend que l'effet soit terminé pour l'effacer

    Code : 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
    function displayPics()
    {
      var photos = document.getElementById('galerie_mini') ;
      // On récupère l'élément ayant pour id galerie_mini
      var liens = photos.getElementsByTagName('a') ;
      // On récupère dans une variable tous les liens contenu dans galerie_mini
      var big_photo = document.getElementById('big_pict') ;
      // Ici c'est l'élément ayant pour id big_pict qui est récupéré, c'est notre photo en taille normale
      var back_photo = document.getElementById('zomclic') ;
     
     
      //var titre_photo = document.getElementById('photo').getElementsByTagName('dt')[0] ;
      // Et enfin le titre de la photo de taille normale
      // Une boucle parcourant l'ensemble des liens contenu dans galerie_mini
      for (var i = 0 ; i < liens.length ; ++i) {
        // Au clique sur ces liens 
        liens[i].onclick = function() {
    		var urlfoto = this.href;
    		var backgroun = "url("+urlfoto+")";
    		var srcimg = back_photo.getElementsByTagName('img'); // collection d’éléments IMG
    		var linkimg = srcimg.item(0).src; // premier élément IMG, puis attribut src
    big_photo.src = linkimg; 
     
    big_photo.removeAttribute("class");	 
    big_photo.classList.add('effetfoto');
     
      // supprime la class en fin d'animation
    big_photo.addEventListener('animationend', function(e){
      this.classList.remove('effetfoto');
    });
     
    console.log(linkimg); 
    big_photo.src = this.href; // On change l'attribut src de l'image en le remplaçant par la valeur du lien
          //big_photo.alt = this.title; // On change son titre
          //titre_photo.firstChild.nodeValue = this.title; // On change le texte de titre de la photo
     
    	back_photo.removeAttribute("style");
    	back_photo.style.backgroundImage = backgroun;
     
        big_photo.removeAttribute("class");
    	big_photo.classList.add('effetfoto2');
     
     
        // supprime la class en fin d'animation
    big_photo.addEventListener('animationend', function(e){
      this.classList.remove('effetfoto2');
    });
    	 return false; // Et pour finir on inhibe l'action réelle du lien
        };
      }
    }
     
    // Il ne reste plus qu'à appeler notre fonction au chargement de la page
    window.onload = displayPics;
     
     
    function zoomf(e){
      var zoomer = e.currentTarget;
      e.offsetX ? offsetX = e.offsetX : offsetX = e.touches[0].pageX
      e.offsetY ? offsetY = e.offsetY : offsetX = e.touches[0].pageX
      x = offsetX/zoomer.offsetWidth*100
      y = offsetY/zoomer.offsetHeight*100
      zoomer.style.backgroundPosition = x + '% ' + y + '%';
    }
    effet actuel
    Nom : 20231007_133825_edit1.gif
Affichages : 210
Taille : 1,54 Mo

  5. #5
    Modérateur

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

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 207
    Par défaut
    Le fait d'afficher ton image en background en plus de ton image en avant plan pollue le visuel de ton effet, il te faut procéder par ordre, une fois l'effet en place tu passes à la suite.

    Concernant l'approche « basique » ta fonction pourrait ressembler à :
    Code : 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
    function displayPics() {
      const EFFET_1 = "effetfoto";
      const EFFET_2 = "effetfoto2";
      // récup. des éléments
      const liens = document.querySelectorAll("#galerie_mini a");
      const big_photo = document.getElementById('big_pict');
      const back_photo = document.getElementById('zomclic');
     
      liens.forEach((elem) => {
        // Au clic sur ces liens  
        elem.onclick = function(e) {
          // inhibe action par défaut
          e.preventDefault();
          // récup. image concernée
          const objImg = this.firstElementChild;
          // récup.src et title
          const srcImage = objImg.getAttribute("src");
          const titleImg = objImg.getAttribute("alt");
          // change animation
          big_photo.classList.remove(EFFET_2);
          big_photo.classList.add(EFFET_1);
     
          big_photo.onanimationend = function(e) {
            // change l'image
            big_photo.src = srcImage;
            // restaure l'animation
            big_photo.classList.remove(EFFET_1);
            big_photo.classList.add(EFFET_2);
          };
        };
      });
    }
    une fois en place il te faudra te poser la question de l'affichage/masquage du background et/ou de l'image.

    Je note que tu fais un affichage de l'image zoomée dans la même zone c'est donc au survol de celle-ci qu'il va te falloir opérer cette opération en JavaScript ou en CSS simplement.

  6. #6
    Membre confirmé
    Homme Profil pro
    Pour le plaisir
    Inscrit en
    Novembre 2012
    Messages
    178
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Pour le plaisir
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Novembre 2012
    Messages : 178
    Par défaut
    merci mais ça ne fonctionne pas.
    j'ai utilisé onanimationend de effet2 pour afficher le backgroundImage
    et pour l'effet1 j'ai repris la fonction de melka one
    https://www.developpez.net/forums/d2.../#post11974767
    reste quelque truc à bidouiller mais tous est bien responsive.

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 16/08/2022, 19h05
  2. Exercice : mise en place galerie photo avec effet
    Par Espagnol_Mtl dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 24/12/2019, 20h13
  3. effet loupe et changement de photo
    Par hakazizi dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 11/01/2011, 17h14
  4. List de photo avec effet
    Par fabigol dans le forum Flex
    Réponses: 3
    Dernier message: 03/02/2010, 10h40
  5. Créer galerie photo avec changement de page toutes les x img
    Par finalfx dans le forum Général JavaScript
    Réponses: 10
    Dernier message: 23/12/2006, 22h30

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