2009-08-06 5 views
37

Ich frage this question, weil seine Antworten in meinem Fall nicht funktioniert haben."text-decoration" und das ": after" Pseudo-Element, erneut besucht

In meinem Stylesheet für gedruckte Medien möchte ich die URL nach jedem Link mit der :after Pseudo-Klasse anhängen.

a:after { 
    content: " <" attr(href) ">"; 
    text-decoration: none; 
    color: #000000; 
} 

In Firefox (und wahrscheinlich Chrome aber nicht IE8), text-decoration: none ignoriert wird, und die unterstrichenen erstreckt sich über den Boden der URL unattraktiv. Die color ist jedoch korrekt für die URL auf schwarz festgelegt. Gibt es eine Möglichkeit, die text-decoration funktionieren zu lassen?

Die original question angefügten Bilder fester Größe anstelle von Text mit variabler Breite. Die Antworten verwenden Füll- und Hintergrundbilder, um die Eigenschaft text-decoration nicht verwenden zu müssen. Ich suche immer noch nach einer Lösung, wenn der Inhalt Text mit variabler Breite ist.

+0

Die robuste Art und Weise, dies zu erreichen ist der hintergrundbildbasierte Ansatz. –

+0

Ich habe die Frage umgeschrieben, um klarzustellen, dass ich überhaupt keine Bilder verwende. – palm3D

Antwort

21

IE8 Implementierung der: vor und: nach Pseudo-Elemente ist falsch. Firefox, Chrome und Safari implementieren alles gemäß der CSS 2.1 Spezifikation.

5.12.3 Die: vor und: Nach dem pseudo-Elemente

Das ': vor' und ': Nach dem' pseudo-Elemente können vor erzeugten Inhalt Einsatz verwendet werden, oder nach einem Element Inhalt. Sie werden im Abschnitt über generierten Text erklärt .

...

Cascading Style Sheets Level 2 Revision 1 (CSS 2.1) Specification

Die Spezifikation gibt an, dass der Inhalt vor oder nach eingefügt sein sollte, den Inhalt des Elements, nicht das Element (d.h.<Element> Inhalt: vor Inhalt Inhalt: nach </Element >). In Firefox und Chrome liegt die Textdekoration also nicht auf dem eingefügten Inhalt, sondern auf dem übergeordneten Ankerelement, das den eingefügten Inhalt enthält.

Ich denke, Ihre Optionen werden die in Ihrer vorherigen Frage vorgeschlagene background-image/padding-Technik verwenden oder möglicherweise Ihre Ankerelemente in span-Elemente einschließen und die Pseudo-Elemente stattdessen auf die span-Elemente anwenden.

+1

Nach einigen weiteren Tests habe ich herausgefunden, dass 'text-decoration' nicht angewendet wird, aber' color' ist. Wie folgt dieses Verhalten von der Spezifikation? – palm3D

+8

@ palm3D: Was Sie nicht verstehen, ist, dass die Pseudo-Selektoren nicht die Text-Dekoration erben, die Text-Dekoration des Ankers zeigt nur durch. Wenn Sie für den Pseudo-Selektor eine Text-Dekoration festlegen, wird diese über der Textdekoration des Selektors gerendert. Wenn Sie zusätzlich eine Hintergrundfarbe für den Pseudo-Selektor setzen, blockt es die Text-Dekoration des Selektors in Firefox, Chrome und Safari korrekt aus. Auch der Wechsel zwischen den Rendermodi in IE8/IE7 ändert die Handhabung von Pseudo-Selektoren dramatisch, also beobachten Sie Ihre DTD. – MyItchyChin

+0

In der Tat, wenn Sie z. 'text-decoration: line-through;' auf "parent" -Element und z. 'text-decoration: unterstreichen;' on :: before/:: after Element, dann werden BEIDE Styles angewendet. Und da Sie definitiv verschiedene Stile auf :: before/:: nach pseudo-ELEMENTS anwenden können, ist es mehr wie ' Inhalt: vor Inhalt:' Struktur als das, was Sie beschrieben haben. Die Möglichkeit, generierten Inhalt einzufügen, bedeutet nicht, dass nur der Inhalt eingefügt wird. – Cromax

1

Ich weiß, das die Frage nicht beantwortet Sie fragt, aber gibt es einen Grund, warum Sie nicht den folgenden (background -basierte Ansatz) verwenden können:

a.file_pdf { 
background-image: url(images/pdf.png); 
background-position: center right; 
background-repeat: no-repeat; 
padding-right: 15px; /* or whatever size your .png image is plus a small margin */ 
} 

Soweit ich weiß, Die Firefox-Implementierung von :after beobachtet die Eigenschaft der Klasse des Selektors, nicht die Pseudo-Klasse. Es könnte sich jedoch lohnen, mit verschiedenen Doctypes zu experimentieren? Der Übergang, eher als streng, ermöglicht manchmal unterschiedliche Ergebnisse (wenn auch nicht immer bessere Ergebnisse ...).

Edit:

Es scheint, dass mit

a:after { 
    content: " <" attr(href) ">"; 
    text-decoration: none; 
    color: #000000; 
    background-color: #fff; /* or whatever colour you prefer */ 
} 

überschreibt, oder zumindest Häuten, die text-decoration. Dies bietet nicht wirklich irgendeine Antwort, aber bietet zumindest eine Art Workaround.

+0

Das Verhalten von Firefox entspricht der Spezifikation. Der Inhalt des Pseudo-Selektors ist innerhalb des Selektors so verschachtelt, wie es sein sollte. Siehe meine Antwort zur Klärung. – MyItchyChin

+0

Ich habe die Frage umgeschrieben, um zu verdeutlichen, dass ich überhaupt keine Bilder verwende. – palm3D

0

Sie können Links zu PDF-Dateien Autoselect von:

a[href$=".pdf"]:after { content: ... } 

IE weniger als 8 kann aktiviert werden, um richtig zu arbeiten, indem Sie diesen Link im Kopf der HTML-Datei Implementierung:

<!--[if lt IE 8]><script src="http://ie7-js.googlecode.com/svn/version/2.0(beta3)/IE8.js" type="text/javascript"></script><![endif]--> 

Es funktioniert auch sehr gut in allen IE-Versionen, wenn Sie das After-Before-Content-Ding für die Wiedergabe von Anführungszeichen verwenden.

+0

Ich habe die Frage umgeschrieben, um klarzustellen, dass ich mich nicht für Selektoren interessiere, sondern nur für das Verhalten von 'text-decoration' in der': after'-Pseudoklasse. – palm3D

0

Position der Inhalt absolut wie folgt:

a { 
    position: relative; 
    margin: 0 .5em; 
    font-weight: bold; 
    color: #c00; 
} 
a:before, 
a:after { 
    position: absolute; 
    color: #000; 
} 
a:before { 
    content: '<'; 
    left: -.5em; 
} 
a:after { 
    content: '>'; 
    right: -.5em; 
} 

Das in Firefox 3.6 funktioniert für mich, nicht jedoch in allen anderen Browsern getestet, viel Glück!

+0

Dies funktioniert nicht in IE9 und IE10 –

6

Als Alternative können Sie einen unteren Rand anstelle einer Textdekoration verwenden. Dies setzt voraus, dass Sie die Farbe des Hintergrundes

a { 
    text-decoration: none; 
    border-bottom: 1px solid blue; 
} 
a:after { 
    content: "foo"; 
    border-bottom: 1px solid white; /* same color as the background */ 
} 
0

Hallo weiß, dass ich auch mit diesem als auch Probleme, war und zufällig auf dieses Problem zu umgehen stolpern.

Um es zu umgehen, wickelte ich die URL in Div und verwendet so etwas.

.next_page:before { 
    content: '('; 
} 

.next_page:after { 
    content: ')'; 
} 
69

Wenn Sie display: inline-block auf dem :after Pseudo verwenden, wird die text-decoration Erklärung arbeiten.

in Chrome Getestet 25, 19 Firefox

+5

Aber leider nicht im IE, siehe meine Frage: http://StackOverflow.com/Questions/18069225/applying-text-decoration-on-css-generated-content-in-ie – frnhr

+5

Sie sind teilweise richtig. Die Text-Dekoration funktioniert in diesem Zusammenhang überhaupt nicht, da die Eltern-Text-Dekoration generell nicht auf innere Inline-Blöcke angewendet werden kann. Wenn du den 'text-decoration: none' komplett auslässt, würde es trotzdem funktionieren. – TimE

6

hatte ich das gleiche Problem und meine Lösung war Höhe und Überlauf zu setzen:

http://jsfiddle.net/r45L7/

a { 
    text-decoration: underline; 
} 

a:after { 
    content: "»"; 
    display: inline-block; 
    text-decoration: none; 
    height:16px; 
    overflow: hidden; 
    padding-left: 10px; 
} 

Es funktioniert auf IE versteckt, FF, Chrome.

+7

Sieht aus wie 'display: inline-block' Deklaration ist genug. – extempl

+0

Wenn das obige von extempl eine Antwort war, kein Kommentar, wäre es die Antwort mit dem großen Tick. – cfranklin

1

Das einzige, was für mich funktionierte, war die Deklaration eines separaten wiederholten Selektors mit der gleichen Text-Deko-Eigenschaft, die er von seinem Elternteil geerbt hatte, und dann im Haupt-Selektor die Einstellung text-decoration auf keine.

IE scheint nicht zu wissen, was zu tun ist, wenn Sie text-decoration: none auf ein Pseudo-Element ohne dieses Element mit der Text-Deko-Eigenschaft deklariert (die standardmäßig standardmäßig deklariert hat). Das macht wenig Sinn, weil es offensichtlich vom Elternteil geerbt wird, aber leider haben wir moderne Browser.

span.my-text { 
    color: black; 
    font-size: 12px; 
    text-decoration: underline; 
} 

span.my-text:after { 
    text-decoration: underline; // Have to set text-decoration here so IE knows it can be overwritten below 
} 

span.my-text:after { 
    color: red; 
    text-decoration: none; // In the same repeated selector, we can now overwrite text-decoration in our pseudo element. 
} 
+0

Super, das funktioniert – Sebastian

0

Was ich tue, ist ich eine Spanne innerhalb der ein Element hinzufügen, wie folgt aus:

<a href="http://foo.bar"><span>link text</span></a> 

dann in Ihre CSS-Datei:

a::after{ 
    content:" <" attr(href) "> "; 
    color: #000000; 
} 

a { 
    text-decoration:none; 
} 

a span { 
    text-decoration: underline; 
} 
Verwandte Themen