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

jQuery Discussion :

Cacher tous les éléments sauf celui cliqué


Sujet :

jQuery

  1. #1
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 160
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 160
    Par défaut Cacher tous les éléments sauf celui cliqué
    Bonjour à tous

    J'ai cette structure qui est répétée 10 fois

    Code HTML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    <figure class="fig">
    	<img src="[[++site_url]][[+tv.img-actualite]]" alt="[[+pagetitle]]" class="img-fluid image">
     
    	<figcaption class="overlay">
    		<div class="text">
    			<h4>[[+pagetitle]]</h4>
    			[[+content]]
    		</div>
    	</figcaption>
     
    </figure>

    Elles se trouvent dans un wrapper

    Code HTML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <div class="gallery">
    <!-- ici toutes mes figures -->
    </div>

    Je souhaiterais faire en sorte que lorsque je clique sur une figure, toutes les autres figures se cache, puis que le figcaption s'affiche à droite (ou à gauche si l'image se trouve à droite du wrapper 'gallery').

    Ce que j'essaye de faire déjà est de cacher toutes les figures à l'exception de celui qui vient de cliquer.

    Ceci fonctionne, mais celui que j'ai cliqué disparait aussi
    Code jquery : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    $('#page_5 .gallery figure').on("click", function()
    		{
    			$(this).css("border","1px solid red");
     
    			$(this).parent().parent().find('.gallery').each(function(){
     
    				$(this).fadeOut(300);
    			});
     
    		});

    Puis, après 3 secondes, j'aimerais que tous les éléments caché réapparaisse.

    Merci pour vos lumières

  2. #2
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 658
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 658
    Billets dans le blog
    1
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $(this).silbings().not(this)
    sélectionne tous les éléments frères sauf celui cliqué

    d'ailleurs même pas besoin du not(this)...

    https://jsfiddle.net/g76yep21/
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  3. #3
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 160
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 160
    Par défaut
    Hello
    Merci ca marche

    Code JQUERY : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $(this).addClass("clicked");
     
    $(this).siblings().fadeOut(300);
     
    setTimeout(function(){
      $(this).children('.overlay').fadeIn(300);
      alert('dd');
    },1000);

    Le problème que je rencontre, maintenant, j'aimerais un petit délais après le sibling.fadeOut, avant que le texte apparait.
    J'ai mis ce setTime, mais la ligne

    Code JQUERY : Sélectionner tout - Visualiser dans une fenêtre à part
    $(this).children('.overlay').fadeIn(300);
    ne fonctionne pas quand elle est dans le setTimeout.
    Par contre l'alert() fonctionne.

    J'avais aussi essayé en remplaçant le children par le find.

    Donc comment laisser le temps que toutes mes boites disparaissent avant que le texte de la boite cliuqé apparaisse?

  4. #4
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 160
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 160
    Par défaut
    J'essaye mille trucs sans succès
    Voici ma dernière tentative pour qu'après le sibling/fadeout, le reste s'apique

    Code JQUERY : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    $(this).siblings().fadeOut(300, function(){
      alert('fff');		
      $(this).parent().removeClass("galleryWebkit");					
      $(this).addClass("clicked");
      $(this).find('.overlay').hide().delay(300).fadeIn(300);
     
    });

    Mais tout ce qui se trouve dans le callback du fadeout ne s'applique pas

  5. #5
    Inactif  
    Homme Profil pro
    Webmaster
    Inscrit en
    Juin 2021
    Messages
    645
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juin 2021
    Messages : 645
    Par défaut
    bonjour,

    $(this) change selon le contexte.
    Il faut définir de quoi on parle.

    Code js : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    let ceci = $(this);
    ceci.siblings().fadeOut(300, function(){
    	alert('fff');		
    	ceci.parent().removeClass("galleryWebkit");					
    	ceci.addClass("clicked");
    	ceci.find('.overlay').hide().delay(300).fadeIn(300);
    });

  6. #6
    Modérateur

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

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 198
    Par défaut
    Bonjour,
    Citation Envoyé par jreaux62
    $(this) change selon le contexte.
    le $(this) et bien le même dans ce cas.


    Citation Envoyé par pierrot10
    Mais tout ce qui se trouve dans le callback du fadeout ne s'applique pas
    ne serait ce pas plutôt que tu n'obtiens pas ce que tu souhaites !


    Citation Envoyé par pierrot10
    Ce que j'essaye de faire déjà est de cacher toutes les figures à l'exception de celui qui vient de cliquer.
    Ça c'est donc réglé via l'utilisation de siblings.


    Citation Envoyé par pierrot10
    Puis, après 3 secondes, j'aimerais que tous les éléments caché réapparaisse.
    Là il y a un soucis d'affectation et de hiérarchisation de tes actions.
    De plus, d'après la construction HTML que tu montres, si tu caches les éléments .overlay ils n'apparaitront donc plus par la suite.
    Lorsque tu écris : $(this).find('.overlay').hide().delay(300).fadeIn(300), les méthodes delay et fadeIn s'appliquent à l'élément .overlay, est ce que tu veux ?

    Je partirais sur quelque chose comme :
    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
    $(this).siblings().fadeOut(300, function() {
      $(this)
        .parent()
        .removeClass("galleryWebkit");
     
    /* pas compris l'utilité !!
      $(this)
        .find('.overlay')
        .hide()
    /*--*/
     
      $(this)
        .addClass("clicked")
        .delay(3000)        // le delay est en ms, ici 3s donc
        .fadeIn(300);
    });

  7. #7
    Inactif  
    Homme Profil pro
    Webmaster
    Inscrit en
    Juin 2021
    Messages
    645
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juin 2021
    Messages : 645
    Par défaut
    Bonjour NoSmoking,

    Citation Envoyé par NoSmoking Voir le message
    le $(this) et bien le même dans ce cas.
    toi-même

    Petit exemple :
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <div>DIV 1</div>
    <div>DIV 2</div>
    <div>DIV 3</div>
    <div>DIV 4</div>
    <div>DIV 5</div>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $(function(){
      $('div').on('click',function() {
        $(this).siblings().fadeOut(300, function(){ // CE $(this) correspond au DIV cliqué
            $(this).addClass("clicked"); // CE $(this) correspond aux DIVs 'siblings'
          });
      });
    });
    La classe "clicked" est alors assignée aux "siblings".
    Pas glop.

    Pour que ce soit bien le DIV cliqué qui prenne la classe "clicked", il faut écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $(function(){
      $('div').on('click',function() {
        ce_div = $(this);    
        ce_div.siblings().fadeOut(300, function(){ // ce_div correspond au DIV cliqué
          ce_div.addClass("clicked"); // ce_div correspond TOUJOURS au DIV cliqué
        });
      });
    });

  8. #8
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 160
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 160
    Par défaut
    Bonjour

    Merci pour vos réponses. Grâce à vos suggestions, j'ai réussi à faire un truc qui fonctionne comme cela

    Code JQUERY : 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
     
    $('#page_5 .gallery figure').on('click', function()
    		{
    			ce = $(this);
    			if($(this).hasClass("clicked")){
     
    				ce.removeClass("clicked");
     
    				ce.find('.overlay').fadeOut(300, function(){
    					ce.parent().removeClass("galleryWebkit-2col");
    			    	ce.parent().addClass("galleryWebkit-3col");
    			    	ce.siblings().fadeIn(300); 
    				});	
     
    			}
    			else
    			{
     
    				ce.siblings().fadeOut(300, function(){ // ce_div correspond au DIV cliqué
    			    	ce.addClass("clicked"); // ce_div correspond TOUJOURS au DIV cliqué
    					ce.parent().removeClass("galleryWebkit-3col");
    			    	ce.parent().addClass("galleryWebkit-2col");
    			    	ce.find('.overlay').fadeIn(300);
    			    }); 
     
    			}
     
    		});

    Comme vous le constatez, j'ai abandonné le delai de restauration. Je le restaure au "re-"click

  9. #9
    Modérateur

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

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 198
    Par défaut
    Effectivement cela va dépendre ce que l’on à compris du souhait de pierrot10, et si l'on souhaite n’ajouter la classe qu’à l'élément déclencheur la hiérarchisation des affectations est on ne peut « maladroite », comme je l’ai dit.

    En mettant l’affectation dans la fonction de rappel, tous les éléments ciblés seront parcourus et on fera l'affectation autant de fois qu’il y a d'éléments, ce qui n'a aucun sens.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $(this)
      // action sur le $this
      .addClass("clicked")
      // action sur les éléments ciblés uniquement
      .siblings()
        .fadeOut(300, function() {
            // seuls les éléments ciblés devraient être traités
            $(this)
              .delay(3000)
              .fadeIn(300);
          });
    Le ce= $(this) reste quand même une bonne solution pour mettre en « cache » l’objet.

    Mais bon si pierrot10 est content de son code, tout va bien

    Citation Envoyé par pierrot10
    Comme vous le constatez, j'ai abandonné le delai de restauration. Je le restaure au "re-"click
    Ergonomiquement parlant c'est une bonne chose !

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 06/07/2018, 11h15
  2. Sélectionner tous les éléments sauf un seul
    Par GreatDeveloperOnizuka dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 07/06/2011, 16h52
  3. Pour l'impression, cacher tous les div sauf un!
    Par fayred dans le forum Mise en page CSS
    Réponses: 3
    Dernier message: 08/01/2008, 10h51
  4. Appliquer un style à tous les éléments sauf un
    Par ner0lph dans le forum Mise en page CSS
    Réponses: 4
    Dernier message: 24/04/2007, 08h55

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