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 :

Modifier le CSS uniquement sur l'élément cliqué


Sujet :

jQuery

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2019
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2019
    Messages : 18
    Points : 16
    Points
    16
    Par défaut Modifier le CSS uniquement sur l'élément cliqué
    Bonjour, j'ai un système de like sur un site commercial que je crée
    Image de mon site :Nom : Capture d’écran (80).png
Affichages : 94
Taille : 272,4 Ko
    Le problème c'est que quand j'appuye pour liker un article ça les likes tous car mon code est conçu comme ça :
    1. le HTML
    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
          {{#table}}
          <tr >
          <td width="15%"><form action="monarticle" method="POST"><input type="text"name="data" value="{{Date}} " id="sendata"><div class="img_article"><input type="image" src="lapine.jpg" ></div></form></td>
          <td ><div class="titre_article">{{Titre}}
            <div class="heart-btn">
              <div class="content">
                <span class="heart"></span>
                <span class="text"></span>
                <span class="numb"></span>
              </div>
            </div>      
          </div><div class="prix_article">Prix: {{Prix}}</div><div class="contain_article"><div>Nom: {{Name}}</div><div>Adresse: {{Adresse}}</div><div>Date: {{Date}}</div></div></td>   
          </tr>
          {{/table}}
    2. Le CSS
    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
    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
    .heart-btn{
      margin-top:4%;
      margin-left:46.5%;
      margin-bottom:0px;
      position:relative;
      top: 0%;
      left: 50%;
      width:7%;
      height:1%;
      transform: translate(-50%,-50%);
     
    }
    .content{
      padding: 13px 16px;
      display: flex;
      border: 2px solid #eae2e1;
      border-radius: 5px;
      cursor: pointer;
      background-color:rgb(255, 255, 255);
     
     
    }
    .content.heart-active{
      border-color: #f9b9c4;
      background: #fbd0d8;
    }
    .heart{
      position: absolute;
      background: url("img.png") no-repeat;
      background-position: left;
      background-size: 2900%;
      height: 60px;
      width: 60px;
      top: 50%;
      left: 27%;
      transform: translate(-50%,-50%);
    }
    .text{
      font-size: 21px;
      margin-left: 10px;
      color: grey;
      font-family: 'Montserrat',sans-serif;
    }
    .numb:before{
      content: '12';
      font-size: 21px;
      margin-left: 0px;
      font-weight: 600;
      color: #928689;
      font-family: sans-serif;
    }
    .numb.heart-active:before{
      content: '13';
      color: #000;
    }
    .text.heart-active{
      color: #000;
    }
    .heart.heart-active{
      animation: animate .8s steps(28) 1;
      background-position: right;
    }
    @keyframes animate {
      0%{
        background-position: left;
      }
      100%{
        background-position: right;
      }
    }
    3. le JS
    Code JavaScript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <script>
      $(document).ready(function(){
        $('.content').click(function(){
          $('.content').toggleClass("heart-active")
          $('.text').toggleClass("heart-active")
          $('.numb').toggleClass("heart-active")
          $('.heart').toggleClass("heart-active")
        });
      });
    En gros mon dans mon html les likes sont tous reliés au même css, même code js, et même code html.
    J'aimerais bien justement pouvoir les différencier mais je ne sais pas comment faire
    (mon site est en html,css,js,nodejs,mongodb)
    En gros si y a moyen, il faudrait que quand on appuie sur like, le css ne toggle que le like sur lequel j'ai appuyer mais je ne sais pas comment faire pour qu'il détecte que j’appuie sur ce like la ou pas un autre

  2. #2
    Membre expert
    Avatar de Golgotha
    Homme Profil pro
    Full-stack Web Developer
    Inscrit en
    Août 2007
    Messages
    1 387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Full-stack Web Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2007
    Messages : 1 387
    Points : 3 535
    Points
    3 535
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    Tu as accès à l'élément qui a déclenché l’événement sur le click :

    Code js : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        $('.content').click(function(e){
          console.log(e.currentTarget);
        });

    à partir de là tu peux solutionner ton problème au niveau du css, mais ça ne résoudra pas le problème de transmettre au serveur la bonne info pour garder en mémoire le like.

    La manière la plus "simple" de faire tout ça serait d'avoir une fonction en javascript "like(id)" qui ramène une promesse , ainsi quand tu génère ton tableau tu va générer à chaque ligne ton bouton avec
    un onclick="like(xxxx)" avec le bon id, dans le retour de ta promesse suivant le cas tu met à jour le css du bouton.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2019
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2019
    Messages : 18
    Points : 16
    Points
    16
    Par défaut
    savoir si un utilisateur a like un article ou non et le stocker dans une bdd, ça je sais le faire il n'y a pas de probleme.
    Le probleme que j'ai c'est que quand je clique pour like un article, (dans la bdd ça rajoute que tel utilisateur a like tel article donc c'est ok), le probleme est juste visuel enfaite car quand tu like un article , visuelement ça like tt les autres articles (mais dans la bdd ça "like" juste le bon article)

  4. #4
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2019
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2019
    Messages : 18
    Points : 16
    Points
    16
    Par défaut
    c'est bon j'ai résolu le problème de cette façon:
    le code qui génère les articles (je crée des balises avec une id différente pour chaque article)
    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
     {{#table}}
          <tr >
          <td width="15%"><form action="monarticle" method="POST"><input type="text"name="data" value="{{Date}} " id="sendata"><div class="img_article"><input type="image" src="lapine.jpg" ></div></form></td>
          <td ><div class="titre_article">{{Titre}}</div>
            <div class="liked" style="display: none;">{{liked}}</div>
            <div class="heart-btn">
            <script>
              var elements = document.getElementsByClassName('liked');
              var liked="";
              var id=(elements.length-1)*4;
              for(let i=0; i<elements.length; i++) {
              liked=elements[i].textContent;
            }
              if (String(liked)=="true"){
              var lines ='<div class="content heart-active" id='+id+'>'
              lines+='<span class="heart heart-active"id='+String(id+1)+'></span>'
              lines+='<span class="text heart-active"id='+String(id+2)+'></span>'
              lines+='<span class="numb heart-active"id='+String(id+3)+'></span>'
              lines+= '</div>'
              document.write(lines)
              }
              else{
              var lines ='<div class="content" id='+id+'>'
              lines+='<span class="heart"id='+String(id+1)+'></span>'
              lines+='<span class="text"id='+String(id+2)+'></span>'
              lines+='<span class="numb"id='+String(id+3)+'></span>'
              lines+= '</div>'
              document.write(lines)
              }
            </script> 
          </div><div class="prix_article">Prix: {{Prix}}</div><div class="contain_article"><div>{{Name}}</div><div>Adresse: {{Adresse}}</div><div>Date: {{Date}}</div></div></td>   
          </tr>
          {{/table}}
    le code du onclick :
    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
    <script>
      $(document).ready(function(){
        $('.content').click(function(e){
          var w=(e.currentTarget.id);
          var x=String(parseInt(w)+1)
          var y=String(parseInt(w)+2)
          var z=String(parseInt(w)+3)
          if (String(e.currentTarget.className)=="content"){
            document.getElementById(w).className="content heart-active"
            document.getElementById(x).className="heart heart-active"
            document.getElementById(y).className="text heart-active"
            document.getElementById(z).className="numb heart-active"
          }
          else{
            document.getElementById(w).className="content"
            document.getElementById(x).className="heart"
            document.getElementById(y).className="text"
            document.getElementById(z).className="numb"
          }
        });
      });
    </script>
    merci pour ton aide, le currentTarget m'a bien aidé (le css est le même)
    il y a surement moyen d'optimiser le code, mais vu que je ne suis que débutant, je me contenterai de ça
    faut plus que relier ça à ma bdd puis ce sera bon

  5. #5
    Modérateur

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

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 106
    Points : 44 911
    Points
    44 911
    Par défaut
    Bonjour,
    il y a surement moyen d'optimiser le code, ...
    je parlerais plutôt de maladresse en fait.

    Lorsque l'on utilise jQuery on utilise jQuery à savoir on ne doit pas trouver de document.getElementById dans le code, c'est une question de cohérence.

    Il faut tirer avantage du CSS, le C pour cascade, te permet de ne modifier que la classe du parent en permettant d'atteindre les enfants et c'est typiquement ce que tu fais ici.

    En partant de ce bout de code HTML
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <div class="content">
      <span class="heart"></span>
      <span class="text"></span>
      <span class="numb"></span>
    </div>
    l'ajout d'une classe à l'élément class="content" permet de modifier tous ces enfants.

    Mais revenons au code JavaScript.

    En fait il se réduit à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $(document).ready(function() {
      $('.content').click(function() {
        // récup. l'élément cliqué
        $objClicked = $(this);
        // bascule la classe
        $objClicked.toggleClass("heart-active")
      });
    });
    Maintenant passons au CSS qu'il te faut légèrement modifier

    Tu peux supprimer :
    Code css : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    .numb.heart-active:before{
      content: '13';
      color: #000;
    }
    .text.heart-active{
      color: #000;
    }
    et le remplacer par :
    Code css : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    .content.heart-active .numb:before {
      content: '13';
      color: #000;
    }
    .content.heart-active .text {
      color: #000;
    }
    Le résultat sera le même, on a juste ciblé différemment les éléments via les sélecteurs.

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

Discussions similaires

  1. Appliquer du CSS uniquement sur le <P> qui précède une <UL>
    Par pierrot10 dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 18/09/2018, 14h34
  2. CSS action sur un élément pour modifier un autre élément
    Par Balthazar117 dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 13/10/2010, 11h24
  3. css sur un lien cliqué ?
    Par 123quatre dans le forum Mise en page CSS
    Réponses: 1
    Dernier message: 20/09/2008, 13h37
  4. Réponses: 1
    Dernier message: 15/05/2008, 20h11
  5. Empêcher la CSS sur certains éléments LABEL
    Par dolu02 dans le forum Mise en page CSS
    Réponses: 9
    Dernier message: 28/02/2008, 12h54

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