Lightbox next et previous comment faire

Fermé
malo91 Messages postés 53 Date d'inscription mardi 2 février 2021 Statut Membre Dernière intervention 3 août 2022 - 3 juin 2022 à 18:36
malo91 Messages postés 53 Date d'inscription mardi 2 février 2021 Statut Membre Dernière intervention 3 août 2022 - 9 juin 2022 à 12:16
Bonjour à tous!
je galere avec ma lightbox! je debute en javascript, je comprends pas ce que je trouve sur le net alors si vous pouviez me lancer une bouee !! je suis sur un projet de photographe . j'ai un fichier .js ou je veux y mettre ses functions :
function displayLightBox(medias) {
    // On recreer chaque card Html stocker dans cardsDom
    const domLightBox = medias.map((media) => {
        //console.log(medias);
        return typeof media.image !== "undefined"
            ? `<img src="./assets/thumbnails/imagesMedias/${media.image}" alt="imagecloseup view" class="hide" data-media-lightbox="${media.id}"/>`
            : `<video controls width="250" class="hide"><source src="./assets/thumbnails/videosMedias/${media.video}" type="video/mp4"></video>
               <div class="lightbox__title"> ${media.title}`;
    })
    //("")  permet de supprimer les , d'un array*/
    document.querySelector(".lightbox__content").innerHTML = domLightBox.join("");
}

function openLightBox(cardClicked) {
    //console.log('carousel');
    document.getElementById('carousel').classList.remove('hide');  //  open liveBox en supprimant le hide
    document.querySelectorAll('[data-media-lightbox]').forEach((element) => {
        element.classList.add('hide') // on cache les autre images du carousel avec hide
    })
    let id = cardClicked.dataset['media'];    // On trouve la data-media qui identifie la media
    document.querySelector('[data-media-lightbox="' + id + '"]').classList.remove('hide');// on l'affiche en suppr le hide

}

function closeLightBox(){
    document.getElementById('carousel').classList.add('hide');// ajout hide pour close carousel
}

function nextSlide(){
 
}
function previousSlide(){
    // affiche la suivante uniquement
}



l'ouvrir, la fermer, afficher la 1ere media OK avec le code ci-dessus ca fonctionne mais je n'arrive pas :( à faire les defilements des autres)

dans un second fichier js j'ai tous mes evenements :

function dispatchEvent(medias) {
    eventMediaSort(medias);
    eventLightBox();
    eventHeart(medias);

    function eventMediaSort(medias) {
        // 
        document.getElementById("sort-choice").addEventListener("change", function (event) {//on chang les données triees
            let type = document.querySelector("#sort-choice").value;
            sortMediasByType(medias, type)//on trie par type
            displayMedias(medias); //on relance les medias
            displayLightBox(medias); // on lance les medias pour la lightbox
        });
    }

    function eventLightBox(){
        document.querySelector('.gallery-section').addEventListener("click", function (event) {
            const target = event.target;
            if (target.classList.contains('media')) {// si contient media
                openLightBox(target);// ouverture de la lightbox
            }
        });
        document.getElementById('lightboxClose').addEventListener("click", closeLightBox)
    }
   
    // evenement de la modal de contact
    const mdContainer = document.querySelector(".md-container");
    const modalTriggers = document.querySelectorAll(".modal-trigger");
    modalTriggers.forEach(trigger => trigger.addEventListener("click", toggleModal))

    function toggleModal(){
        mdContainer.classList.toggle("active")
    }

    //au clic sur le coeur
    function eventHeart(){
        document.querySelector('.fa-heart').addEventListener("click",
            countClics)
    }
}


et enfin, mes elements DOM dans un fichier à part : (factory)
function headerFactory(photograph) {
  const { name, portrait, city, tagline, id } = photograph;

  const image = `assets/photographers/${portrait}`;

  function getHeaderCardDOM(){
    const linkURL = "photographer.html";
    const url = `${linkURL}?photographer=${id}`;
    return ` 
    <article>
      <div class="profil">
        <h1>${name}</h1>
        <p class="where">${city}</p>
        <p class="tagline">${tagline}</p>
      </div> 
        <button class="modal-btn modal-trigger" id="modal">Contactez moi</button>
      <div>
        <a href=${url}><img src=${image} alt="photo"></ a>
    </div>
    </article>`;
  }
  
  return { name, image, getHeaderCardDOM };
}

/****     elements DOM partie GALERIES    **********/

function galleryFactory(data) {
  const { id, image, title, video, likes, date } = data;
  const imagesMedias = typeof image !== "undefined" 
    ? `assets/thumbnails/imagesMedias/${image}`
    : `https://picsum.photos/200/300`; // a remplacer par le chemin de l'image associé a la vidéo

  const linkURL = "photographer.html";
  const url = `${linkURL}?imagesMedias=${id}`;
  return ` 
    <article>  
      <div class ="gallery-section">
        <figure>
          <img src=${imagesMedias} alt="pictures" tabindex="0" class="media" data-media="${id}">
          <figcaption>
          <p class="infoMedia"> ${title}</p>
          <span class="numberLike" id="clicHeart">${likes}</span><i class="fa fa-solid fa-heart"></i>
         </figcaption>
        </figure>
      </div>
    </article>`;
}

/****************************************************************************/

function displayDataHeader(photographer) {
  const profilHeaderModel = headerFactory(photographer);
  document.querySelector(".photograph-header").innerHTML = profilHeaderModel.getHeaderCardDOM();
  document.getElementById("nameModal").innerHTML = photographer.name;
}

/*********** Affichage  des medias de l ID *******************************/
function displayMedias(medias) {
  // On recreer chaque card Html stocker dans cardsDom
  const cardsDom = medias.map((media) => {
    return galleryFactory(media);
  });

  // On ecrase la section des cards par la nouvelle
  document.querySelector(".gallery-section").innerHTML = cardsDom;
}


incappable d'arriver à mettre mes medias et les faire passer de gauche à droite :( ah oui j'allais oublier : mon html :
    <!-- CAROUSEL  LIGHTBOX    -->
  <div id="carousel" class="lightbox hide">
    <button class="lightbox__close" id="lightboxClose" aria-label="Close">Fermer</button>
    <button class="lightbox__next next" aria-label="next">Suivant</button>
    <button class="lightbox__prev previous"aria-label="previous">Précédent</button>
   
    <div class="lightbox__content"></div>

  </div>


esct ce que vous pouvez m''aider? merci bcp
Configuration: Windows / Chrome 102.0.0.0

2 réponses

Salut,
plutôt que de multiplier les bibliothèques ou Framework en JavaScript(Boostrap, peut-être React?)il serais plus simple de commencer par du pur JavaScript. Les bibliothèques logicielle et Framework n sont qu'une application de JavaScript avec ses particularités. Censé faire gagner du temps cela ne vous aidera pas à comprendre.
Même chose si vous prenez un code sur le net vous ne pouvez pas le copier coller sans le comprendre, il faut comprendre la logique et l'appliquer à votre contexte/page web.

Un exemple de ce que vous voulez(il faudra indiquer des adresses d'images existantes si vous voulez voir quelque chose) qui peut vous aider à comprendre.

Bien sûr il existe des cours et tutos bien mieux faits et plus explicite mais si vous ne comprenez pas cet exemple assez simpliste il vous manque les bases et dans ce cas avant de pouvoir faire une galerie d'images défilantes(c'est plus clair que "lightbox" quand même^^ déjà mettre les bonnes définitions ça aide aussi à comprendre) il faut vous tourner vers un cours débutant en JavaScript:
<!DOCTYPE html>
<html>
<head><meta charset="utf-8"><!-- valide XML-->

</head>
<body>
<img id=galerie src=img0.jpg alt=image0>
<hr/>
<button id=bt-prev >Précédent</button>
<button id=bt-next >Suivant</button>
<script>
"use strict"
const listeImages=['img0.jpg', 'img1.jpg', 'img2.jpg', 'img3.jpg']; /** le tableau peut être modifié sans soucis(nombre d'images, adresse images...) */
const descriptions=['description image0','description image1','description image2','description image3'];/** si modif mettre à jour le texte alternatif aussi bien sûr*/
let positionEnCours=0,/** avec la virgule c'est une écriture raccourcie qui permet d'éviter de répéter const let ou var quand on crée plusieurs varaibles d'affilées*/
	galerie=document.getElementById('galerie'),
	next=document.getElementById('bt-next'),
	prev=document.getElementById('bt-prev');/** le point virgule n'est pas obligatoire en fin de ligne, juste c'est plus clair pour voir où se termine la création des variables*/

prev.addEventListener('click',/** sélectionne l'élément qui a pou id bt-prev et détecte le clic*/
function(){/** événement lors du clic*/
console.log(positionEnCours-1)
 if(positionEnCours-1 < 0){/** si positionEncours-1 est inférieur à 0(la limite inférieure de notre tableau)*/
	positionEnCours = listeImages.length-1 /* on lui donne la taille du tableau listeImages-1(-1 car le premier index d'un tableau est 0) */	
console.log('boucle à l\'index '+(listeImages.length-1))
 }else{ /** sinon on soustrait 1 */
	positionEnCours=positionEnCours-1
 }
 /** mise à jour de l'image et du texte alternatif*/
 galerie.src=listeImages[positionEnCours]
 galerie.setAttribute('alt', descriptions[positionEnCours])
 console.log("position:"+positionEnCours+" , image:"+listeImages[positionEnCours]+", alt:"+descriptions[positionEnCours])
 
})/** fin de lécouteur de clic sur HTMLELementButton.id.bt-prev*/

/** même chose mais dans le sens "inverse" : ajout de 1 à la position , mise à 0 si postion +1 > à la taille du tableau*/
next.addEventListener('click',function(){
	if(positionEnCours+1>listeImages.length-1){
		positionEnCours= 0
	}else{
		positionEnCours++/** opérateur d'affectation identique à: positionEnCours=positionEnCours+1*/
	}
 console.log("position:"+positionEnCours+" , image:"+listeImages[positionEnCours]+", alt:"+descriptions[positionEnCours])
 galerie.src=listeImages[positionEnCours]
 galerie.setAttribute('alt', descriptions[positionEnCours])	
})
</script>

</body>
</html>
0
le JS à part pour la coloration syntaxique, mais bien sûr le mieux est de tester par vous même et d'essayer de refaire en améliorant ou suivre un tuto complet sur le sujet(il en existe pas mal sur le net). Si vous bloquer sur une fonction cherchez simplement dans un manuel de références JavaScript(celui du W3C ou de Mozilla qui sont 2 acteurs majeurs du web par exemple).

"use strict"
const listeImages=['img0.jpg', 'img1.jpg', 'img2.jpg', 'img3.jpg']; /** le tableau peut être modifié sans soucis(nombre d'images, adresse images...) */
const descriptions=['description image0','description image1','description image2','description image3'];/** si modif mettre à jour le texte alternatif aussi bien sûr*/
let positionEnCours=0,/** avec la virgule c'est une écriture raccourcie qui permet d'éviter de répéter const let ou var quand on crée plusieurs varaibles d'affilées*/
 galerie=document.getElementById('galerie'),
 next=document.getElementById('bt-next'),
 prev=document.getElementById('bt-prev');/** le point virgule n'est pas obligatoire en fin de ligne, juste c'est plus clair pour voir où se termine la création des variables*/

prev.addEventListener('click',/** sélectionne l'élément qui a pou id bt-prev et détecte le clic*/
function(){/** événement lors du clic*/
console.log(positionEnCours-1)
 if(positionEnCours-1 < 0){/** si positionEncours-1 est inférieur à 0(la limite inférieure de notre tableau)*/
 positionEnCours = listeImages.length-1 /* on lui donne la taille du tableau listeImages-1(-1 car le premier index d'un tableau est 0) */ 
console.log('boucle à l\'index '+(listeImages.length-1))
 }else{ /** sinon on soustrait 1 */
 positionEnCours=positionEnCours-1
 }
 /** mise à jour de l'image et du texte alternatif*/
 galerie.src=listeImages[positionEnCours]
 galerie.setAttribute('alt', descriptions[positionEnCours])
 console.log("position:"+positionEnCours+" , image:"+listeImages[positionEnCours]+", alt:"+descriptions[positionEnCours])
 
})/** fin de lécouteur de clic sur HTMLELementButton.id.bt-prev*/

/** même chose mais dans le sens "inverse" : ajout de 1 à la position , mise à 0 si postion +1 > à la taille du tableau*/
next.addEventListener('click',function(){
 if(positionEnCours+1>listeImages.length-1){
  positionEnCours= 0
 }else{
  positionEnCours++/** opérateur d'affectation identique à: positionEnCours=positionEnCours+1*/
 }
 console.log("position:"+positionEnCours+" , image:"+listeImages[positionEnCours]+", alt:"+descriptions[positionEnCours])
 galerie.src=listeImages[positionEnCours]
 galerie.setAttribute('alt', descriptions[positionEnCours]) 
})


Plutôt simple non, si on enlève les log et les commentaires il n'y a même pas 30 lignes de codes à comprendre.
Une fois compris le principe vous pouvez faire la même chose avec un script externe comme une grosse bibliothèque ou un script de lightbox trouvé sur le web.
0
malo91 Messages postés 53 Date d'inscription mardi 2 février 2021 Statut Membre Dernière intervention 3 août 2022 1
9 juin 2022 à 12:16
Ok oui merci !! c'est un projet deja fait à à ameliorer, avec certains outils à prendre ou pas , dans le cahier de charges donc merci pour vos conseils, apres je dois suivre les criteres demandés ( formation) merci
0