Come rimuovere solo la sottolineatura da a: prima?


95

Ho una serie di collegamenti in stile che utilizzano :beforeper applicare una freccia.

Sembra buono in tutti i browser, ma quando applico la sottolineatura al collegamento, non voglio avere la sottolineatura sulla :beforeparte (la freccia).

Vedi jsfiddle per esempio: http://jsfiddle.net/r42e5/1/

È possibile rimuoverlo? Lo stile di test con cui mi sono seduto #test p a:hover:beforeviene applicato (secondo Firebug), ma la sottolineatura è ancora lì.

Qualche modo per evitarlo?

#test {
  color: #B2B2B2;
}

#test p a {
  color: #B2B2B2;
  text-decoration: none;
}

#test p a:hover {
  text-decoration: underline;
}

#test p a:before {
  color: #B2B2B2;
  content: "► ";
  text-decoration: none;
}

#test p a:hover:before {
  text-decoration: none;
}
<div id="test">
  <p><a href="#">A link</a></p>
  <p><a href="#">Another link</a></p>
</div>


Beh, ovviamente vuoi una lista ... Usa un elemento UL invece della combinazione DIV / P. Con le liste ottieni i proiettili (o dischi, ...) gratuitamente ...
— Šime Vidas

Perché non utilizzare l'elenco con punti elenco personalizzati invece di paragrafi nel tuo caso? Altrimenti applica il contenuto precedente al genitore p, non al collegamento stesso.
— YuS

Risposte:


171

È possibile rimuoverlo?

Sì, se modifichi lo stile di visualizzazione dell'elemento inline da display:inline(predefinito) a display:inline-block:

#test p a:before {
    color: #B2B2B2;
    content: "► ";
    display:inline-block;
}

Questo perché le specifiche CSS dicono :

Quando specificato o propagato a un elemento in linea, influisce su tutte le caselle generate da quell'elemento e viene ulteriormente propagato a tutte le caselle a livello di blocco in flusso che suddividono l'inline (vedere la sezione 9.2.1.1). […] Per tutti gli altri elementi viene propagato a tutti i figli in flusso. Si noti che le decorazioni di testo non vengono propagate ai discendenti mobili e posizionati in modo assoluto, né ai contenuti dei discendenti atomici a livello di riga come i blocchi inline e le tabelle inline .

(Enfasi mia.)

Demo: http://jsfiddle.net/r42e5/10/

Grazie a @Oriol per aver fornito la soluzione alternativa che mi ha spinto a controllare le specifiche e vedere che la soluzione alternativa è legale.


2
Puoi sostituire un'applicazione text-decoration:underlineapplicata a un elemento genitore con display:inline-block. Guarda un esempio: jsfiddle.net/aZdhN/1 . Quindi, il problema di asker può essere risolto in questo modo: stackoverflow.com/a/17347068/1529630
— Oriol

3
Per quanto posso vedere, questo non funziona in Internet Explorer (testato 8-10). Qualche idea su come affrontare IE?
— Linus Caldwell

Ho trovato una soluzione che sta lavorando in IE8-11 troppo: stackoverflow.com/a/21902566/1607968
— LeJared

53

C'è un bug in IE8-11 , quindi usare display:inline-block;da solo non funzionerà lì.

Ho trovato una soluzione a questo bug, impostando esplicitamente text-decoration:underline;il contenuto: before e poi sovrascrivendo di nuovo questa regola context-decoration:none;

a {text-decoration:none;}
a:hover {text-decoration:underline;}
a:before {content:'>\a0'; text-decoration:underline; display:inline-block;}
a:before,
a:hover:before {text-decoration:none;}

Esempio di lavoro qui: http://jsfiddle.net/95C2M/

Aggiornamento: poiché jsfiddle non funziona più con IE8, incolla questo semplice codice demo in un file html locale e aprilo in IE8:

<!DOCTYPE html>
<html>
<head>
    <title>demo</title>
    <style type="text/css">
        a {text-decoration:none;}
        a:hover {text-decoration:underline;}
        a:before {content:'>\a0'; text-decoration:underline; display:inline-block;}
        a:before,
        a:hover:before {text-decoration:none;}
    </style>
</head>
<body>
    <a href="#">Testlink</a> With no Underline on hover under before-content
</body>
</html>

Se un caso fosse IE8, la sottolineatura di un'immagine con collegamento ipertestuale poteva essere disattivata solo <img style="text-decoration:underline">dall'interno (ed ecco la chiave)<a style="padding:0; border:none;">
— Bob Stein

Sfortunatamente quel jsfiddle non può essere verificato in IE8 perché jsfiddle non funziona in IE8.
— user2867288

Sfortunatamente non sono riuscito a trovare alcuno strumento di condivisione del codice online che funzioni ancora con IE8. Ho aggiunto un codice ritagliato alla risposta sopra che puoi semplicemente incollare in un file html e aprirlo localmente in IE8.
— LeJared

Testato e approvato su IE9, evento senza due stati diversi.
— saeraphin

Aveva un collegamento con un'icona in: prima non doveva essere sottolineato nello stato di riposo, quindi essere sottolineato al passaggio del mouse, ma non l'icona. Ecco cosa ho dovuto fare per convincere IE a farlo bene: a {text-decoration: none} a: before {text-decoration: underline} a: before {text-decoration: none} (sì davvero, prima sottolineatura, quindi sovrascrivi con nessuno) a: hover {text-decration: underline} a: hover: before {text-decoration: none}
— Fake Haak

7

Puoi farlo aggiungendo quanto segue :beforeall'elemento:

display: inline-block;
white-space: pre-wrap;

Con display: inline-blockla sottolineatura scompare. Ma poi il problema è che lo spazio dopo il triangolo collassa e non viene mostrato. Per risolverlo, puoi usare white-space: pre-wrapo white-space: pre.

Demo : http://jsfiddle.net/r42e5/9/


1
+1 per il pre-wrapsuggerimento. Stavo usando content:'►\a0'(\ a0 = & nbsp;)
— Hashbrown

1

Avvolgi i tuoi collegamenti in intervalli e aggiungi la decorazione del testo allo span su a: hover in questo modo,

a:hover span {
   text-decoration:underline;
}

Ho aggiornato il tuo violino a quello che penso tu stia cercando di fare. http://jsfiddle.net/r42e5/4/


Buona idea. Ecco come l'ho fatto prima. Il problema è che questo collegamento è prodotto in un sistema cms e i nostri clienti lo compilano come testo RTF.
— OptimusCrime

che lingua è il CMS? È possibile che sputi il ​​link e poi lo avvolga in un arco prima di inviarlo al browser?
— Mammelle

L'azienda utilizza modx. Immagino di poterlo fare come ultima via d'uscita, ma volevo davvero annullarlo. Immagino non sia possibile. Grazie comunque.
— OptimusCrime

-1

prova a usare invece:

#test p:before {
    color: #B2B2B2;
    content: "► ";
    text-decoration: none;
}

andrà bene?


Ho molti paragrafi nel mio div, quindi non funzionerà. Buona idea comunque.
— OptimusCrime

interessante chi ha messo -1 se la risposta accettata suggerisce lo stesso ma in forma diversa ...
— Elen

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.