2016-06-16 35 views
10

Ho una raccolta di commenti nidificati. Il mio obiettivo è visualizzare un'opzione di 'risposta' quando si passa il mouse su ciascun commento separatamente. Ciò significa che non voglio che l'opzione "rispondi" venga visualizzata per genitore/fratello/figlio del commento che sto passando.Selezione dell'elemento solo al passaggio del mouse per elementi nidificati immediatamente

L'unica domanda simile che ho trovato è: Can I control CSS selection for :hover on nested elements? Non sono nemmeno sicuro che i suoi bisogni siano gli stessi, e inoltre i violini non sembrano funzionare.

Ho preparato un fiddle quindi è meglio vedere quello che voglio dire:

.comment { 
 
    padding: 10px; 
 
    border: 1px solid black; 
 
    margin-top: 10px; 
 
} 
 
.text {} .comment:hover > .reply { 
 
    display: inline-block; 
 
} 
 
.reply { 
 
    display: none; 
 
} 
 
.children-comments { 
 
    margin-left: 50px; 
 
    margin-top: 10px; 
 
}
<div class="comment"> 
 
    <a class="text">wohoo</a> 
 
    <a class="reply">reply</a> 
 
    <div class="children-comments"> 
 
    <div class="comment"> 
 
     <a class="text">wohoo</a> 
 
     <a class="reply">reply</a> 
 
     <div class="children-comments"> 
 

 
     </div> 
 
    </div> 
 
    <div class="comment"> 
 
     <a class="text">wohoo</a> 
 
     <a class="reply">reply</a> 
 
     <div class="children-comments"> 
 
     <div class="comment"> 
 
      <a class="text">wohoo</a> 
 
      <a class="reply">reply</a> 
 
      <div class="children-comments"> 
 
      <div class="comment"> 
 
       <a class="text">wohoo</a> 
 
       <a class="reply">reply</a> 
 
       <div class="children-comments"> 
 

 
       </div> 
 
      </div> 
 
      </div> 
 
     </div> 
 
     </div> 
 
    </div> 
 
    <div class="comment"> 
 
     <a class="text">wohoo</a> 
 
     <a class="reply">reply</a> 
 
     <div class="children-comments"> 
 

 
     </div> 
 
    </div> 
 
    </div> 
 
</div>

Si noti che usando > nel selettore fa lavoro di ignorare gli elementi di pari livello, ma seleziona ancora il genitore elementi. In altre parole, a prescindere dal commento che si sta guardando, il genitore di tutti mostrerà sempre l'opzione "rispondi".

Questo può essere fatto solo con i CSS? Sono aperto alle soluzioni js, ma sarei più che felice se esistesse una soluzione solo CSS.

+1

Finito, non volevo ingombrare la domanda con una caldaia inutile, ma punto underst ood :) – mezod

+2

Potresti ancora farlo. Basta usare snippet e selezionare l'opzione nascosta per impostazione predefinita. In questo modo il tuo codice sarà in questione e il boilerplate non verrà mostrato a meno che non sia espanso :) – Harry

risposta

6

La soluzione migliore sarebbe quella di cambiare la marcatura un po 'e aggiungere un avvolgitore:

<div class="comment"> 
    <div class="content"> <!-- Here --> 
    <a class="text">wohoo</a> 
    <a class="reply">reply</a> 
    </div> 

Con l'aggiunta di un wrapper div per il contenuto, è possibile destinare commenti singolarmente utilizzando .content:hover > .reply

Esempio:

.comment { 
 
    padding: 10px; 
 
    border: 1px solid black; 
 
    margin-top: 10px; 
 
} 
 

 
.text {} 
 

 
.content:hover > .reply { 
 
    display: inline-block; 
 
} 
 

 
.reply { 
 
    display: none; 
 
} 
 

 
.children-comments { 
 
    margin-left: 50px; 
 
    margin-top: 10px; 
 
}
<div class="comment"> 
 
    <div class="content"> 
 
    <a class="text">wohoo</a> 
 
    <a class="reply">reply</a> 
 
    </div> 
 
    <div class="children-comments"> 
 
    <div class="comment"> 
 
     <div class="content"> 
 
     <a class="text">wohoo</a> 
 
     <a class="reply">reply</a> 
 
     </div> 
 
     <div class="children-comments"> 
 
     <div class="comment"> 
 
      <div class="content"> 
 
      <a class="text">wohoo</a> 
 
      <a class="reply">reply</a> 
 
      </div> 
 
     </div> 
 
     <div class="children-comments"> 
 
      <div class="comment"> 
 
      <div class="content"> 
 
       <a class="text">wohoo</a> 
 
       <a class="reply">reply</a> 
 
      </div> 
 
      <div class="children-comments"> 
 
       <div class="comment"> 
 
       <div class="content"> 
 
        <a class="text">wohoo</a> 
 
        <a class="reply">reply</a> 
 
       </div> 
 
       <div class="children-comments"> 
 

 
       </div> 
 
       </div> 
 
      </div> 
 
      </div> 
 
     </div> 
 
     </div> 
 
     <div class="comment"> 
 
     <div class="content"> 
 

 
      <a class="text">wohoo</a> 
 
      <a class="reply">reply</a> 
 
      <div class="children-comments"> 
 
      </div> 
 
     </div> 
 
     </div> 
 
    </div> 
 
    </div>

Il wrapper del contenuto si espanderebbe nell'area del contenuto effettivo del commento (che ha più senso).

Tuttavia, è possibile anche espandere il wrapper sull'intero blocco di commenti (oltre al contenuto del commento) utilizzando gli stili di posizionamento. Ad esempio:

/* OPTIONAL - These style changes make the content 
* wrapper cover the entire comment block. 
*/ 
.comment { 
    padding: 10px; 
    border: 1px solid black; 
    margin-top: 10px; 
    position:relative; 
} 

.comment .content { 
    width:100%; 
    height:100%; 
    position:absolute; 
    top:0; 
    left:0; 
} 

Dipende solo dal comportamento desiderato.

(jsFiddle example)

+0

Sto cercando di ottenere il collegamento per giocare con la tua soluzione in fiddle. Non riesco a trovare un collegamento lì. Grazie per la risposta! – mezod

+0

geniale, in realtà quel div "aggiuntivo" esiste già nel mio markup originale così fantastico!:) Grazie! – mezod

+1

@mezod È possibile eseguire lo snippet in linea con la mia risposta, oppure, è possibile utilizzare questo violino: https://jsfiddle.net/fcyfscu8/ –

1

senza cambiare la marcatura, invece in bilico il genitore .comment, è possibile passa il fratello adiacente (usando +) .text (perché sempre lì)

.comment { 
 
    padding: 10px; 
 
    border: 1px solid black; 
 
    margin-top: 10px; 
 
} 
 
.text { 
 
    display:inline-block 
 
} 
 
.text:hover + .reply { 
 
    display: inline-block; 
 
} 
 
.reply { 
 
    display: none; 
 
} 
 
.children-comments { 
 
    margin-left: 50px; 
 
    margin-top: 10px; 
 
}
<div class="comment"> 
 
    <a class="text"> wohoo wohoo wohoo wohoo wohoo wohoo wohoo wohoo </a> 
 
    <a class="reply">reply</a> 
 
    <div class="children-comments"> 
 
    <div class="comment"> 
 
     <a class="text">wohoo wohoo wohoo wohoo wohoo wohoo wohoo wohoo wohoo wohoo </a> 
 
     <a class="reply">reply</a> 
 
     <div class="children-comments"> 
 

 
     </div> 
 
    </div> 
 
    <div class="comment"> 
 
     <a class="text">wohoo wohoo wohoo wohoo wohoo wohoo wohoo wohoo wohoo wohoo wohoo wohoo wohoo wohoo wohoo wohoo wohoo wohoo wohoo wohoo wohoo wohoo wohoo wohoo wohoo wohoo wohoo wohoo </a> 
 
     <a class="reply">reply</a> 
 
     <div class="children-comments"> 
 
     <div class="comment"> 
 
      <a class="text"> wohoo wohoo wohoo wohoo wohoo wohoo wohoo wohoo </a> 
 
      <a class="reply">reply</a> 
 
      <div class="children-comments"> 
 
      <div class="comment"> 
 
       <a class="text"> wohoo wohoo wohoo wohoo </a> 
 
       <a class="reply">reply</a> 
 
       <div class="children-comments"> 
 

 
       </div> 
 
      </div> 
 
      </div> 
 
     </div> 
 
     </div> 
 
    </div> 
 
    <div class="comment"> 
 
     <a class="text"> wohoo wohoo wohoo wohoo wohoo wohoo wohoo wohoo wohoo wohoo wohoo wohoo wohoo wohoo wohoo wohoo </a> 
 
     <a class="reply">reply</a> 
 
     <div class="children-comments"> 
 

 
     </div> 
 
    </div> 
 
    </div> 
 
</div>

+0

Grazie per la risposta. È davvero un'alternativa molto intelligente. Sfortunatamente per me, il mio vero markup non è "semplice" e questa soluzione non funzionerebbe esattamente come mi aspetterei. Ma il tuo approccio mi ha dato un sacco di informazioni e idee, quindi grazie per il tempo che hai impiegato a rispondere :) – mezod

+0

Quindi la prossima volta mostra il codice completo, per aiutarti meglio, altrimenti ti stiamo dando solo cattive opinioni per il tuo vero problema . – dippas

+0

Non penso che ci sia bisogno di essere scortesi qui. Ho pubblicato una versione semplificata perché stavo cercando una soluzione relativamente indipendente da markup con i selettori css. Ancora una volta, grazie per il tuo tempo. – mezod