2011-12-16 10 views
18

Ho un collegamento testuale sottolineato al passaggio del mouse. Sto aggiungendo all'inizio del collegamento un simbolo > utilizzando il codice seguente:Interrompi collegamento: prima che il contenuto venga sottolineato dalla regola applicata al collegamento

.box.blueb a { color: #0098aa; } 
.box.blueb a:hover { text-decoration: underline; } 
.box.blueb a:before { content: "> "; } 
.box.blueb a:before:hover { text-decoration: none; } 

Ma quello che non voglio il simbolo > sottolineato quando il collegamento viene aleggiava. Come ottengo questo?

risposta

11

http://jsfiddle.net/thirtydot/LmvgM/1/

È necessario avvolgere un span intorno al testo all'interno del a:

<div class="box blueb"> 
    <a href="#"><span>Hello</span></a> 
</div> 

E poi modificare il CSS a questo:

.box.blueb a { color: #0098aa; text-decoration: none; } 
.box.blueb a:hover > span { text-decoration: underline; } 
.box.blueb a:before { content: "> "; } 

.box.blueb a:before:hover { text-decoration: none; } non funziona perché quando si imposta text-decoration: underline su un elemento (a), you can't then remove it su un discendente (:before).

+0

Grazie per questo, ma non credo che aggiungere un extra mark up volerà con le persone per le quali lo sto costruendo. – Brady

+0

Non vedo come si possa fare diversamente. L'unica altra opzione che posso pensare è usare un 'background-image' per'> 'invece del testo. – thirtydot

+0

L'aggiunta di markup extra non è richiesta, come mostrato dall'altra risposta. Fare questo con i CSS solo è più elegante. – kontur

10

http://jsfiddle.net/LmvgM/8/

può essere raggiunto solo css, senza ulteriori markup html modificando posizione: relativo al collegamento, e rispettivamente la posizione: assoluta: prima del contenuto.

Utilizzando questo esempio ...

<div class="box blueb"> 
    <a href="#">Hello</a> 
</div> 

... il css sarà simile a questa:

.box.blueb a { 
    color: #0098aa; 
    position: relative; 
    margin-left: 5px; 
    padding-left: 10px; 
    text-decoration: none; 
} 

.box.blueb a:before { 
    content: "> "; 
    position: absolute; 
    top: 0; 
    left: 0; 
} 

.box.blueb a:hover { 
    text-decoration: underline; 
} 
+0

+1 Mi chiedo * perché * questo funziona davvero ... –

+0

Non funziona in IE11, sfortunatamente. Chrome e Firefox stanno bene. –

+2

Ecco una risposta corretta che funziona anche in IE8-11: http://stackoverflow.com/a/21902566/1607968 – LeJared

7

lo si può fare solo CSS aggiungendo display: inline-block all'elemento :before:

.box.blueb a { color: #0098aa; } 
.box.blueb a:hover { text-decoration: underline; } 
.box.blueb a:before { content: "> "; display:inline-block; } 

Demo: http://jsfiddle.net/CaNyx/


Edit:

Il problema è che con display: inline-block lo spazio non è visualizzato, ma è possibile risolvere il problema con white-space: pre o white-space: pre-wrap

Demo: http://jsfiddle.net/CaNyx/1/

+0

Sfortunatamente, IE11 dice no. –

+0

@JorritSchippers Davvero? Stavo iniziando a pensare che le nuove versioni di IE facessero schifo ... meno, ma sembra che IE sarà sempre IE e succhierà molto. – Oriol

+0

@JorritSchippers L'ho provato e sembra che non funzioni su nessuna versione di IE. Che vergogna, questo comportamento è definito nei CSS2.1 e secondo Microsoft, IE8 dovrebbe supportare completamente CSS2.1. – Oriol

0

So che questo non risponde come fermare un ancoraggio prima che il contenuto venga sottolineato.
Ma la soluzione migliore che trovo quando ho bisogno di questo comportamento è non usandoa:before.

HTML:

<nav class="breadcrumb"> 
    <span><a href="#">Test 1</a></span> 
    <span><a href="#">Test 2</a></span> 
    <span><a href="#">Test 3</a></span> 
</nav> 

CSS:

nav.breadcrumb > span:before    { content: "> "; } 
nav.breadcrumb > span:first-child:before { content: ""; } 

Quindi, specificando :before pseudo-classe per l'elemento che avvolge l'ancora, invece dell'ancora stessa sembra come la soluzione al meglio il momento.


Un altro esempio, se si preferisce utilizzando gli elenchi:

HTML:

<ul class="breadcrumb"> 
    <li><a href="#">Test 1</a></li> 
    <li><a href="#">Test 2</a></li> 
    <li><a href="#">Test 3</a></li> 
</ul> 

CSS:

ul.breadcrumb       { margin: 0; padding: 0; } 
ul.breadcrumb > li     { display: inline;  } 
ul.breadcrumb > li:before    { content: "> ";   } 
ul.breadcrumb > li:first-child:before { content: "";   } 
5

Prova questa se si vuole un CSS unica soluzione. Per farlo funzionare in IE, è necessario attivare in modo esplicito sulla prima lo si spegne per gli elementi pseudo:

a {text-decoration:none;} 
a:hover {text-decoration:underline;} 
a:before { text-decoration:underline;} 
a:before, 
a:hover:before {text-decoration:none;} 

Quindi nel tuo esempio, si avrebbe bisogno di essere scritto:

.box.blueb a { text-decoration:none; } 
.box.blueb a:hover { text-decoration: underline; } 
.box.blueb a:before { text-decoration: underline; } 
.box.blueb a:before, 
.box.blueb a:before:hover { text-decoration: none; } 
+0

La migliore soluzione che ho trovato! –

+0

Questa soluzione fa davvero scalpore! – berliner

Problemi correlati