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

Mise en page CSS Discussion :

Multi hover cell


Sujet :

Tableau en CSS

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2016
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France

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

    Informations forums :
    Inscription : Octobre 2016
    Messages : 14
    Points : 10
    Points
    10
    Par défaut Multi hover cell
    Bonjour à tous,

    Je réalise aujourd'hui une application web en employant angular5/6 et typescript 2.X, mais viens vous voir pour une petite question CSS.

    J'ai un <mat-table> dont l'une des colonnes est remplie de la manière suivante :

    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <ng-container matColumnDef="recurrence">
    	<mat-header-cell *matHeaderCellDef i18n> Recurrence </mat-header-cell>
    	<mat-cell *matCellDef="let visit">					
    		<div *ngIf="isRecurrent(visit)" class="recurrence-cell">
    			<p>r</p>
    		</div>
    	</mat-cell>
    </ng-container>

    Pour ceux qui n'utilisent pas angular, j'ai une colonne dans laquelle les cellules contiennent soit une div contenant 'r' si ma condition est respectée, soit une case vide dans le cas contraire.

    Je souhaite que, lorsque l'utilisateur déplace sa souris sur l'élément en question, toutes les cases contenant ma div déclenchent un hover.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    .recurrence-cell:hover {
    	background-color: rgb(48, 195, 158);
    }
    Toutefois ce simple code déclenche le hover uniquement sur l'élement concerné (normal, après tout c'est ici ce qui est demandé).

    Est-ce que ceci est possible en CSS ou est-ce que je dois passer par l'intermédiaire d'une petite fonction typescript dans laquelle je déclencherai manuellement le hover sur toutes les cases souhaitées.


    En attendant votre réponse je vais chercher quelques solutions envisageable.

    Merci d'avance à tous,
    CyberGomme.

  2. #2
    Expert confirmé Avatar de psychadelic
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    2 529
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 2 529
    Points : 4 739
    Points
    4 739
    Par défaut
    logiquement ce que tu as écrit devrait suffire.

    ce serait mieux de voir le html généré plutôt que le code angular

    tu as peut-être un conflit css qui empêche ce fonctionnement. ton code est trop partiel pour savoir, tu devrais utiliser le debugger pour voir ce qui se passe dans ta page.
    «La pluralité des voix n'est pas une preuve, pour les vérités malaisées à découvrir, tant il est bien plus vraisemblable qu'un homme seul les ait rencontrées que tout un peuple.» [ René Descartes ] - Discours de la méthode

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2016
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France

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

    Informations forums :
    Inscription : Octobre 2016
    Messages : 14
    Points : 10
    Points
    10
    Par défaut
    Salut psychadelic,

    Le code HTML généré est le suivant :

    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <mat-cell _ngcontent-c11="" class="mat-cell cdk-column-recurrence mat-column-recurrence ng-tns-c11-2 ng-star-inserted" role="gridcell">
         <div _ngcontent-c11="" class="recurrence-cell ng-tns-c11-2 ng-star-inserted" id="recurrent">
                 <p _ngcontent-c11="" class="ng-tns-c11-2">r</p>
         </div>
    </mat-cell>

    Il est identique pour chacune des cellules crées respectant ma condition.
    Le simple hover fonctionne sur la cellule voulue, mais guère sur l'ensemble des cellules souhaitées.

    Peut-être que l'implémentation d'une fonction en typescript me serait nécessaire afin de toutes les sélectionner, je vais regarder ce que je peux faire de ce côté là.

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Mais quel "ensemble des cellules" ??
    Ca veut dire quoi ?

    Montre une copie d'écran...

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2016
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France

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

    Informations forums :
    Inscription : Octobre 2016
    Messages : 14
    Points : 10
    Points
    10
    Par défaut
    Par exemple sur cette image, j'ai 3 lignes dont 2 avec R.
    Ce que je cherche à faire c'est, qu'en passant sur l'un des deux, les deux me déclenchent le hover correspondant.

    Nom : Capture.PNG
Affichages : 575
Taille : 4,3 Ko

  6. #6
    Invité
    Invité(e)
    Par défaut
    Et en mettant la clase sur le <mat-cell ?
    (je ne connais pas cette syntaxe)

    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	<mat-cell *matCellDef="let visit" class="recurrence-cell">					
    		<div *ngIf="isRecurrent(visit)">
    Dernière modification par NoSmoking ; 01/08/2018 à 19h25.

  7. #7
    Expert confirmé Avatar de psychadelic
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    2 529
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 2 529
    Points : 4 739
    Points
    4 739
    Par défaut
    c'est incomplet, quel est le code généré quand il n'y a pas de "R" à afficher ?

    et le debugger indique aussi les règles css qui sont applicables pour ton élément, si ça se trouve tu as peut être une règle :empty pour cet élément ou son parent
    «La pluralité des voix n'est pas une preuve, pour les vérités malaisées à découvrir, tant il est bien plus vraisemblable qu'un homme seul les ait rencontrées que tout un peuple.» [ René Descartes ] - Discours de la méthode

  8. #8
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2016
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France

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

    Informations forums :
    Inscription : Octobre 2016
    Messages : 14
    Points : 10
    Points
    10
    Par défaut
    @jreaux62
    Aucun changement à mon résultat.

    @psychadelic
    Le code généré lorsqu'il n'y a pas le R est le même, sans la div
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <mat-cell _ngcontent-c11="" class="mat-cell cdk-column-recurrence mat-column-recurrence ng-tns-c11-2 ng-star-inserted" role="gridcell">
    </mat-cell>

  9. #9
    Expert confirmé Avatar de psychadelic
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    2 529
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 2 529
    Points : 4 739
    Points
    4 739
    Par défaut
    Citation Envoyé par CyberGomme Voir le message
    @psychadelic
    Le code généré lorsqu'il n'y a pas le R est le même, sans la div
    ben voila: s'il n'y a pas de div, l'instruction css "hover" ne peut s'appliquer sur un div absent.
    «La pluralité des voix n'est pas une preuve, pour les vérités malaisées à découvrir, tant il est bien plus vraisemblable qu'un homme seul les ait rencontrées que tout un peuple.» [ René Descartes ] - Discours de la méthode

  10. #10
    Expert confirmé Avatar de psychadelic
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    2 529
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 2 529
    Points : 4 739
    Points
    4 739
    Par défaut
    Citation Envoyé par CyberGomme Voir le message
    @jreaux62
    Aucun changement à mon résultat.
    peut être faut-il en passer par un document.createElement("mat-cell"); pour que la classe CSS "recurrence-cell" puisse être applicable ?

    mais encore une fois, CyberGomme c'est dans le debugger que tu trouveras tes réponses !
    «La pluralité des voix n'est pas une preuve, pour les vérités malaisées à découvrir, tant il est bien plus vraisemblable qu'un homme seul les ait rencontrées que tout un peuple.» [ René Descartes ] - Discours de la méthode

  11. #11
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    dans CSS, il y a "Cascade".
    Or, on ne peut pas remonter une cascade. (nous ne sommes pas des saumons sauvages...)

    En clair, en CSS, on ne peut pas avoir une action sur un élément, et "remonter le courant" pour atteindre un élément "parent".
    (en tout cas, pas encore)

    Par contre, c'est possible en JavaScript ! (parentNode)

  12. #12
    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,
    Citation Envoyé par jreaux62
    Et en mettant la clase sur le <mat-cell ?
    (je ne connais pas cette syntaxe)
    il s'agit d'un Components For Angular.

    Citation Envoyé par jreaux62
    En clair, en CSS, on ne peut pas avoir une action sur un élément, et "remonter le courant" pour atteindre un élément "parent".
    On peut toutefois « simuler cette remontée », avec pas mal de limitation quand même.

    Explications :

    On ne simule qu'un changement de la couleur de fond de la <tr> et éventuellement la bordure, mais pas plus.

    Pour ne cibler que quelques éléments de la <table> nous allons utiliser la structure HTML simplifiée suivante :
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <td>
      <p>:hover</p>
    </td>

    On va jouer avec le pseudo-élément :before de l'élément qui, survolé, doit déclencher le changement de couleur de fond de sa <tr> parent.

    Ce pseudo-élément est déclaré en position:absolute et sera donc positionné par rapport à son premier parent lui même positionné, le grand classique.

    Il nous faut donc déclarer les <tr> en position:relative pour qu'elles servent de référent, seulement voilà seul FireFox, à ce jour, reconnaît ce positionnement sur des éléments en display:table-xxxx et ce en dépit de la recommandation, voir Choosing a positioning scheme: 'position' property.
    The effect of 'position:relative' on table-row-group, table-header-group, table-footer-group, table-row, table-column-group, table-column, table-cell, and table-caption elements is undefined.
    Il nous faut donc déclarer les <tr> en display:block, ou display:flex, ou encore changer la structure HTML mais le principe reste le même.

    Le pseudo-élément :before est placé en arrière plan avec un z-index:-1 et fait la dimension du parent positionné. Il suffit de changer sa couleur de fond sur le :hover du parent direct et le tour est joué.

    La <table> ne doit pas avoir de background-color.

    Comme il n'y a plus de relation dimensionnelle entre les enfants des <tr>, il faut définir la largeur de ceux-ci.

    • Fichier exemple :
    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
    <!DOCTYPE HTML>
    <html lang="fr">
    <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>[CSS] Simulation :hover sur parent</title>
    <meta name="Author" content="NoSmoking">
    <meta name="DVP-discussion" content="d1879120">
    <style>
    html, body {
      margin: 0;
      padding: 0;
      font: 1em/1.5 Verdana,sans-serif;
    }
    main, #main {
      display: block;
      position: relative;
      margin: 0 auto 2em;
      max-width: 60em;
    }
    section, .section {
      position: relative;
      margin: 0 2em 1em;
    }
    h1, h2, h3 {
      color: #069;
    }
    code {
      font-family: "courier new";
      font-size: 1em;
      color: #069;
    }
    q {
      display: block;
      position: relative;
      margin: 0;
      padding: .5em;
      border: 1px solid #FB5;
      border-left: .35em solid #FB5;
      background: #FFD;
    }
    table {
      border-collapse: separate;
      border-spacing: 0;
      box-shadow: 0 0 .5em #888;
      cursor: pointer;
      border: 1px solid #888;
    }
    thead {
      text-shadow: 1px 1px 1px #FFF;
      background: linear-gradient(to bottom, transparent, rgba(0, 0, 0, 0.2) )repeat scroll 0% 0% #EEE;
    }
    tr {
      position: relative;  /* pour servir de référent */
      display: block;
    }
    th, td {
      padding: .5em;
      width: 8em;
      min-width: 8em;
      border-right:1px solid #888;
      border-top: 1px solid #888;
    }
    th {
      border-top: 1px solid #FFF;
    }
    th +th,
    td +td{
      border-left:1px solid #FFF;
    }
    th:last-child,
    td:last-child{
      border-right:0;
    }
    td p {
      color: #00F;
      margin: 0;
    }
    td p::before {
      content: "";
      z-index: -1;
      position: absolute; /* par rapport à <tr> donc */
      top: 0;
      right: 0;
      bottom: 0;
      left: 0;
    }
    td p:hover::before {
      background: #CDE;
    }
    </style>
    </head>
    <body>
    <main>
      <header>
        <h1>Simulation <code>:hover</code> sur parent</h1>
        <p>On ne simule qu'un changement de la couleur de fond de la <code>&lt;tr&gt;</code> et éventuellement la bordure, mais pas plus.
      </header>
      <section>
        <h2>Le rendu</h2>
        <table>
          <thead>
            <tr>
              <th>Colonne #1</th>
              <th>Colonne #2</th>
              <th>Colonne #3</th>
              <th>Colonne #4</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td>Col #1 Lig #1</td>
              <td><p>:hover</p></td>
              <td>Col #3 Lig #1</td>
              <td>Col #4 Lig #1</td>
            </tr>
            <tr>
              <td><p>:hover</p></td>
              <td>Col #2 Lig #2</td>
              <td>Col #3 Lig #2</td>
              <td>Col #4 Lig #2</td>
            </tr>
            <tr>
              <td>Col #1 Lig #3</td>
              <td>Col #2 Lig #3</td>
              <td><p>:hover</p></td>
              <td>Col #4 Lig #3</td>
            </tr>
            <tr>
              <td>Col #1 Lig #4</td>
              <td>Col #2 Lig #4</td>
              <td><p>:hover</p></td>
              <td>Col #4 Lig #4</td>
            </tr>
          </tbody>
        </table>
      </section>
      <section>
        <h2>Quelques explications</h2>
        <p>Pour ne cibler que quelques éléments de la <code>&lt;table&gt;</code> nous utilisons, pour l'exemple, la structure HTML simplifiée suivante&nbsp; :
        <p><code>&lt;td&gt;<br>&nbsp;&nbsp;&lt;p&gt;:hover&lt;/p&gt;<br>&lt;/td&gt;</code>
        <p>On va jouer avec le pseudo-élément <code>:before</code> de l'élément qui, survolé, doit déclencher le changement de couleur de fond de sa <code>&lt;tr&gt;</code> parent.
        <p>Ce pseudo-élément est déclaré en <code>position:absolute</code> et sera donc positionné par rapport à son premier parent lui même positionné, <i>le grand classique</i>.
        <p>Il nous faut donc déclarer les <code>&lt;tr&gt;</code> en <code>position:relative</code> pour qu'elles servent de référent, seulement voilà seul FireFox, <i>à ce jour</i>, reconnaît ce positionnement sur des éléments en <code>display:table-xxxx</code> et ce en dépit de la recommandation, voir <a href="https://www.w3.org/TR/CSS21/visuren.html#propdef-position">Choosing a positioning scheme: 'position' property</a>.
        <p><q>The effect of 'position:relative' on table-row-group, table-header-group, table-footer-group, table-row, table-column-group, table-column, table-cell, and table-caption elements is undefined.</q>
        <p>Il nous faut donc déclarer les <code>&lt;tr&gt;</code> en <code>display:block</code>, ou <code>display:flex</code>, ou encore changer la structure HTML mais le principe reste le même.
        <p>Le pseudo-élément <code>:before</code> est placé en arrière plan avec un <code>z-index:-1</code> et fait la dimension du parent positionné. Il suffit de changer sa couleur de fond sur le <code>:hover</code> du parent direct et le tour est joué.
        <p>La <code>&lt;table&gt;</code> ne doit pas avoir de <code>background-color</code>.
        <p>Comme il n'y a plus de relation dimensionnelle entre les enfants des <code>&lt;tr&gt;</code>, il faut définir la largeur de ceux-ci.
      </section>
    </main>
    </body>
    </html>
    L'exemple en ligne

  13. #13
    Invité
    Invité(e)
    Par défaut
    NoSmoking, alias "The Magician"!

    N.B j'avais bien compris qu'il s'agit d'Angular... (que je ne maitrise pas)...
    Mais comment le "traduire" en CSS.... non plus

  14. #14
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2016
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France

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

    Informations forums :
    Inscription : Octobre 2016
    Messages : 14
    Points : 10
    Points
    10
    Par défaut
    Ah c'est parfait NoSmoking, merci beaucoup
    Je vais adapter ton exemple afin de l'appliquer à plusieurs de mes lignes simultanément.

  15. #15
    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
    Citation Envoyé par jreaux62
    Mais comment le "traduire" en CSS.... non plus
    en passant par une classe sur les éléments concernés.

    Citation Envoyé par CyberGomme
    ... afin de l'appliquer à plusieurs de mes lignes simultanément.
    L'exemple que j'ai mis ne fonctionne que pour une ligne donnée, si je comprend bien le « simultanément » tu n'auras pas d'autre recours que de passer par du JavaScript, comme dit plus haut par jreaux62, ce qui me paraît plus serein ne serait ce que pour la maintenabilité du code.

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

Discussions similaires

  1. Multi-selection dans une ComboBox ?
    Par Moloko dans le forum MFC
    Réponses: 5
    Dernier message: 07/07/2021, 17h26
  2. Tri multi-threadé
    Par Tifauv' dans le forum C
    Réponses: 8
    Dernier message: 28/06/2007, 09h00
  3. Multi lignes dans un StringGrids ?
    Par Xavier dans le forum C++Builder
    Réponses: 3
    Dernier message: 27/11/2002, 23h15
  4. [TP][MULTI-PROBLEME]Comment afficher des images pcx
    Par mikoeur dans le forum Turbo Pascal
    Réponses: 7
    Dernier message: 24/10/2002, 13h57
  5. Multi-acces a la BD Paradox
    Par _Rico_ dans le forum Paradox
    Réponses: 3
    Dernier message: 22/07/2002, 15h33

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