Come scrivere: hover condition per a: before e a: after?


Risposte:


488

Questo dipende da cosa stai effettivamente cercando di fare.

Se desideri semplicemente applicare gli stili a uno :beforepseudo-elemento quando l' aelemento corrisponde a una pseudo-classe, devi scrivere a:hover:beforeo a:visited:beforeinvece. Si noti che lo pseudo-elemento viene dopo la pseudo-classe (e in effetti, alla fine dell'intero selettore). Nota anche che sono due cose diverse; chiamarli entrambi "pseudo-selettori" ti confonderà una volta che incontrerai problemi di sintassi come questo.

Se stai scrivendo CSS3, puoi indicare uno pseudo-elemento con due punti e virgola per rendere più chiara questa distinzione. Quindi, a:hover::beforee a:visited::before. Ma se stai sviluppando per i browser legacy come IE8 e precedenti, allora puoi cavartela usando i due punti semplicemente bene.

Questo ordine specifico di pseudo-classi e pseudo-elementi è indicato nelle specifiche :

Uno pseudo-elemento può essere aggiunto all'ultima sequenza di selettori semplici in un selettore.

Una sequenza di selettori semplici è una catena di selettori semplici che non sono separati da un combinatore. Inizia sempre con un selettore del tipo o un selettore universale. Nessun altro selettore di tipo o selettore universale è consentito nella sequenza.

Un selettore semplice è un selettore di tipo, un selettore universale, un selettore di attributi, un selettore di classe, un selettore ID o una pseudo-classe.

Una pseudo-classe è un semplice selettore. Uno pseudo-elemento, tuttavia, non lo è, anche se ricorda un semplice selettore.

Tuttavia, per le pseudo-classi di azioni dell'utente come :hover1 , se è necessario applicare questo effetto solo quando l'utente interagisce con lo pseudo-elemento stesso ma non con l' aelemento, ciò non è possibile se non attraverso una oscura soluzione dipendente dal layout . Come implicito nel testo, gli pseudo-elementi CSS standard non possono attualmente avere pseudo-classi. In tal caso, dovrai applicare :hoverun elemento figlio effettivo anziché uno pseudo-elemento.


1 Naturalmente, ciò non si applica al collegamento di pseudo-classi :visitedcome nella domanda, poiché gli pseudo-elementi non sono collegamenti.


27
Va sottolineato che ciò posiziona il cursore sull'elemento genitore - il che fa sì che la decorazione venga applicata anche se lo pseudoelemento :: after non è sotto il mouse, purché sia ​​il suo genitore.
SamGoody,

6
Va anche notato che ci sono una serie di cose che non rispondono a questo a causa del modo in cui sono specificate le regole di layout - ad es text-decoration.
Chris Krycho,

1
@Chris Krycho: In effetti - in realtà mi capita di avere una spiegazione per questo problema specifico riguardo agli pseudo-elementi qui . Ovviamente, vale la pena chiarire che il problema in sé non ha alcun legame con i selettori di pseudo-classe / pseudo-elemento , ma è come si sottolinea, un problema di layout.
BoltClock

@BoltClock ho upvoted quella risposta molto poco dopo ho lasciato questo commento. Huzzah.
Chris Krycho,

2
Due punti (:) :) indica pseudo-classi e due punti (: :) indica pseudo-elementi. Quindi dovrebbe essere un: hover :: before
mikkelbreum il

107

Scrivi a:hover::beforeinvece di a::before:hover: esempio .


2
@mikkelbreum hai un riferimento per dimostrarlo?
shea,

3
@bungeshea: questa è la sintassi CSS3. Vedi i commenti sotto la mia risposta (così come la mia recente modifica). È un po 'inesatto definirlo "la" sintassi corretta, poiché sia ​​i punti singoli che i doppi punti sono consentiti per gli pseudo-elementi CSS1 / 2. La chiamerei invece la sintassi raccomandata , perché l'unico motivo per continuare a utilizzare la sintassi legacy oggi è per supportare IE8 e precedenti.
BoltClock

@mikkelbreum @sheabunge maggiori informazioni su CSS2 :aftervs CSS3 ::after developer.mozilla.org/en-US/docs/Web/CSS/::after (single :ha un supporto migliore)
travis

non funziona per sottolineare :( jsfiddle.net/porzechowski/u5dhthvq Per favore aggiungi anche display: inline-block; jsfiddle.net/porzechowski/u89fo4oq
plusz

7

Per modificare il testo del collegamento al menu al passaggio del mouse. (Testo in lingua diversa al passaggio del mouse) ecco il

esempio jsfiddle

html:

<a align="center" href="#"><span>kannada</span></a>

css:

span {
    font-size:12px;
}
a {
    color:green;
}
a:hover span {
    display:none;
}
a:hover:before {
    color:red;
    font-size:24px;
    content:"ಕನ್ನಡ";
}

1
Questa è una bella risposta In effetti, mi ha ispirato ad estendere leggermente il tuo violino aumentando la dimensione del carattere del testo di span a 24px per abbinare il testo sostitutivo, aggiunto 3 spazi non interrotti prima e dopo il testo sostitutivo in modo che occupino la stessa larghezza e stile a:hover::beforecon text-decoration: underline, che causa la sottolineatura a prendere il colore rosso del testo sostitutivo.
Dave Land l'

4

Provare a utilizzare .card-listing:hover::after hovere aftercon ::esso il lavoro wil


1

La risposta di BoltClock è corretta. L'unica cosa che voglio aggiungere è che se vuoi selezionare solo lo pseudo elemento, inserisci un intervallo.

Per esempio:

<li><span data-icon='u'></span> List Element </li>

invece di:

<li> data-icon='u' List Element</li>

In questo modo puoi semplicemente dire

ul [data-icon]:hover::before {color: #f7f7f7;}

che evidenzierà solo l'elemento pseudo, non l'intero elemento li


-2

Puoi anche limitare la tua azione a una sola classe usando la parentesi quadra destra (">"), come ho fatto in questo codice:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Document</title>
  <style type="text/css">
    span {
    font-size:12px;
    }
    a {
        color:green;
    }
    .test1>a:hover span {
        display:none;
    }
    .test1>a:hover:before {
        color:red;
        content:"Apple";
    }
  </style>
</head>

<body>
  <div class="test1">
    <a href="#"><span>Google</span></a>
  </div>
  <div class="test2">
    <a href="#"><span>Apple</span></a>
  </div>
</body>

</html>

Nota: hover: before switch funziona solo sulla classe .test1

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.