Wie entferne ich nur Unterstreichungen von a: vor?


94

Ich habe eine Reihe von gestalteten Links, mit denen :beforeein Pfeil angewendet wird.

Es sieht in allen Browsern gut aus, aber wenn ich die Unterstreichung auf den Link anwende, möchte ich keine Unterstreichung auf dem :beforeTeil (dem Pfeil) haben.

Siehe jsfiddle zum Beispiel: http://jsfiddle.net/r42e5/1/

Ist es möglich, dies zu entfernen? Der Teststil, mit dem ich gesessen #test p a:hover:beforehabe, wird zwar angewendet (laut Firebug), aber die Unterstreichung ist immer noch da.

Wie kann man das vermeiden?

#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>


Nun, Sie möchten offensichtlich eine Liste ... Verwenden Sie ein UL-Element anstelle der DIV / P-Kombination. Mit Listen erhalten Sie die Kugeln (oder Scheiben, ...) kostenlos ...
Šime Vidas

Warum sollten Sie in Ihrem Fall keine Liste mit benutzerdefinierten Aufzählungszeichen anstelle von Absätzen verwenden? Andernfalls wenden Sie den Vorinhalt auf das übergeordnete p an, um sich nicht selbst zu verknüpfen.
YuS

Antworten:


171

Ist es möglich, dies zu entfernen?

Ja, wenn Sie den Anzeigestil des Inline-Elements von display:inline(Standardeinstellung) in Folgendes ändern display:inline-block:

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

Dies liegt daran, dass in den CSS-Spezifikationen Folgendes angegeben ist :

Wenn es für ein Inline-Element angegeben oder an dieses weitergegeben wird, wirkt es sich auf alle von diesem Element generierten Boxen aus und wird weiter an alle In-Flow-Boxen auf Blockebene weitergegeben, die die Inline aufteilen (siehe Abschnitt 9.2.1.1). […] Für alle anderen Elemente wird es an alle in-flow-Kinder weitergegeben. Beachten Sie, dass Textdekorationen weder an schwebende und absolut positionierte Nachkommen noch an den Inhalt atomarer Nachkommen auf Inline-Ebene wie Inline-Blöcke und Inline-Tabellen weitergegeben werden .

(Hervorhebung von mir.)

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

Vielen Dank an @Oriol für die Bereitstellung der Problemumgehung, die mich dazu veranlasst hat, die technischen Daten zu überprüfen und festzustellen, ob die Problemumgehung legal ist.


2
Sie können ein text-decoration:underlineauf ein übergeordnetes Element angewendetes Element mit überschreiben display:inline-block. Siehe ein Beispiel: jsfiddle.net/aZdhN/1 . Dann kann das Problem des Fragestellers wie folgt
Oriol

3
Soweit ich sehen kann, funktioniert dies nicht in Internet Explorer (getestet 8-10). Irgendwelche Ideen, wie man mit IE umgeht?
Linus Caldwell

Ich habe eine Lösung gefunden, die auch in IE8-11 funktioniert: stackoverflow.com/a/21902566/1607968
LeJared

52

Es gibt einen Fehler in IE8-11 , daher funktioniert die display:inline-block;alleinige Verwendung dort nicht.

Ich habe eine Lösung für diesen Fehler gefunden, indem ich explizit den Wert text-decoration:underline;: before-content festgelegt und diese Regel dann erneut mit überschrieben habetext-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;}

Arbeitsbeispiel hier: http://jsfiddle.net/95C2M/

Update: Da jsfiddle nicht mehr mit IE8 funktioniert, fügen Sie diesen einfachen Demo-Code einfach in eine lokale HTML-Datei ein und öffnen Sie ihn 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>

Hätte ein Fall, in dem IE8 ein Hyperlink-Bild unterstreicht, könnte es nur von <img style="text-decoration:underline">innen ausgeschaltet werden (und hier war der Schlüssel)<a style="padding:0; border:none;">
Bob Stein

Leider kann jsfiddle in IE8 nicht überprüft werden, da jsfiddle in IE8 nicht funktioniert.
user2867288

Leider konnte ich kein Online-Code-Sharing-Tool finden, das noch mit IE8 funktioniert. Ich habe der obigen Antwort einen Code hinzugefügt, den Sie einfach in eine HTML-Datei einfügen und lokal in IE8 öffnen können.
LeJared

Getestet und genehmigt auf IE9, Ereignis ohne zwei verschiedene Zustände.
Saeraphin

Hatte einen Link mit einem Symbol in: vorher sollte das NICHT im Ruhezustand unterstrichen sein, dann beim Hover unterstrichen werden, aber nicht das Symbol. Folgendes musste ich tun, um den IE davon zu überzeugen, dies richtig zu machen: a {Textdekoration: keine} a: vor {Textdekoration: unterstreichen} a: vor {Textdekoration: keine} (ja wirklich, erste Unterstreichung, dann mit keiner überschreiben) a: hover {text-decration: underline} a: hover: before {text-decoration: none}
Fake Haak

7

Sie können dem :beforeElement Folgendes hinzufügen :

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

Mit display: inline-blockder Unterstreichung verschwindet. Das Problem ist jedoch, dass der Raum nach dem Dreieck zusammenbricht und nicht angezeigt wird. Um dies zu beheben, können Sie white-space: pre-wrapoder verwenden white-space: pre.

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


1
+1 für den pre-wrapHinweis. Ich benutzte content:'►\a0'(\ a0 = & nbsp;)
Hashbrown

1

Wickeln Sie Ihre Links in Bereiche ein und fügen Sie die Textdekoration dem Bereich auf dem a: Schwebeflug wie folgt hinzu:

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

Ich habe Ihre Geige auf das aktualisiert, was Sie meiner Meinung nach versuchen zu tun. http://jsfiddle.net/r42e5/4/


Gute Idee. So habe ich es vorher gemacht. Das Problem ist, dass dieser Link in einem CMS-System erstellt wird und unsere Kunden diesen selbst als Rich-Text ausfüllen.
OptimusCrime

Welche Sprache ist das CMS? Könnte es dazu führen, dass der Link ausgespuckt und dann in eine Zeitspanne eingeschlossen wird, bevor er an den Browser gesendet wird?
Euter

Das Unternehmen verwendet modx. Ich denke, ich könnte das als letzten Ausweg tun, aber ich wollte das wirklich aufheben. Ich denke, es ist nicht möglich. Trotzdem danke.
OptimusCrime

-1

Versuchen Sie stattdessen:

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

wird das reichen?


Ich habe möglicherweise Absätze in meinem Div, damit das nicht funktioniert. Gute Idee tho.
OptimusCrime

Interessant, wer -1 setzt, wenn die akzeptierte Antwort dasselbe, aber in unterschiedlicher Form vorschlägt ...
Elen

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.