2009-08-06 13 views
37

Estoy volviendo a preguntar this question porque sus respuestas no funcionaron en mi caso."text-decoration" y el pseudo-elemento ": after", revisitado

En mi hoja de estilo para medios impresos, deseo agregar la url después de cada enlace utilizando la pseudoclase :after.

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

En Firefox (y, probablemente, Chrome, pero no IE8), text-decoration: none se ignora, y el subrayado se extiende poco atractivo en la parte inferior de la URL. Sin embargo, el color está configurado correctamente en negro para la url. ¿Hay alguna manera de hacer que el text-decoration funcione?

original question adjuntaron imágenes de tamaño fijo en lugar de texto de ancho variable. Sus respuestas usan relleno e imágenes de fondo para evitar tener que usar la propiedad de decoración de texto. Todavía estoy buscando una solución cuando el contenido es de texto de ancho variable.

+0

La forma más robusta para lograr esto es el enfoque basado en la imagen de fondo. –

+0

Reescribí la pregunta para aclarar que no estoy usando imágenes en absoluto. – palm3D

Respuesta

21

La implementación de IE8 de los pseudo-elementos: before y: after es incorrecta. Firefox, Chrome y Safari lo implementan de acuerdo con la especificación CSS 2.1.

5.12.3 El: antes y: después de pseudo-elementos

El ': antes' y ': después de' pseudo-elementos pueden ser utilizados para inserto contenido generado antes o después de contenido del elemento. Se explican en la sección de texto generado.

...

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

La especificación indica que el contenido se debe insertar antes o después de el contenido del elemento, no el elemento (es decir,<elemento> contenido: antes contenido contenido: después de </elemento >). Por lo tanto, en Firefox y Chrome, la decoración de texto que está encontrando no está en el contenido insertado sino en el elemento de anclaje principal que contiene el contenido insertado.

Creo que sus opciones van a utilizar la técnica background-image/padding sugerida en su pregunta anterior o posiblemente envolver sus elementos de anclaje en elementos span y aplicar los pseudoelementos a los elementos span en su lugar.

+1

Después de algunas pruebas más, descubrí que 'text-decoration' no se aplica, pero' color' sí. ¿Cómo se sigue ese comportamiento de la especificación? – palm3D

+8

@ palm3D: Lo que no entiende es que los pseudo-selectores no heredan la decoración de texto, la decoración de texto del ancla se está mostrando. Si configura una decoración de texto para el pseudo-selector, se representa sobre la decoración de texto del selector. Además, si configura un color de fondo para el pseudo-selector borra correctamente la decoración de texto del selector en Firefox, Chrome y Safari. Además, el cambio entre modos de renderizado en IE8/IE7 cambia drásticamente el manejo de los pseudo-selectores, así que observa tu DTD. – MyItchyChin

+0

De hecho, cuando pones, por ejemplo. 'text-decoration: line-through;' en el elemento "parent" y por ej. 'text-decoration: underline;' on :: before/:: after element, entonces se aplican AMBOS estilos. Y dado que definitivamente puede aplicar estilos diferentes a :: before/:: after pseudo-ELEMENTS es más como ' contenido: antes de contenido contenido: después de' estructura que la que describió. La posibilidad de insertar contenido generado no significa que solo se inserte el contenido. – Cromax

1

Sé que esto no responde a la pregunta que usted está pidiendo, pero hay una razón por la que no se puede utilizar el siguiente (background enfoque basado):

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 */ 
} 

Por lo que yo sé, la implementación de Firefox de :after observa la propiedad de la clase del selector, no la clase psuedo. Sin embargo, ¿valdría la pena experimentar con diferentes tipos de documentos? La transición, en lugar de estricta, a veces permite resultados diferentes (aunque no siempre mejor resultados ...).

Editar:

Parece que el uso de

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

anulaciones, o al menos los cueros, la text-decoration. Esto realmente no proporciona ningún tipo de respuesta, pero al menos ofrece una solución alternativa.

+0

El comportamiento de Firefox está de acuerdo con las especificaciones. El contenido del pseudo selector está anidado dentro del selector como debería ser. Ver mi respuesta para aclaración. – MyItchyChin

+0

Reescribí la pregunta para aclarar que no estoy usando imágenes. – palm3D

0

Puede autoselect enlaces a archivos pdf de:

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

decir, menos de 8 se puede activar para que funcione correctamente mediante la implementación de este eslabón de la cabeza del archivo html:

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

También funciona muy bien en todas las versiones de IE cuando utiliza el contenido anterior al contenido para comillas dobles.

+0

Reescribí la pregunta para aclarar que no estoy interesado en los selectores, solo el comportamiento de 'text-decoration' en la' 'after 'pseudo-class. – palm3D

0

Posición absolutamente el contenido de la siguiente manera:

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; 
} 

Esto funciona para mí en Firefox 3.6, no probado en cualquier otro navegador, sin embargo, la mejor de las suertes!

+0

Esto no funciona en IE9 e IE10 –

6

Como alternativa, puede usar un borde inferior en lugar de una decoración de texto. Esto supone que se conoce el color del fondo

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

Hola yo también estaba teniendo problemas con esto también y pasó a tropezar a través de una solución.

Para evitarlo, envolví la URL en div y usé algo como esto.

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

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

Si utiliza display: inline-block en la seudo :after, la declaración text-decoration funcionará.

Probado en Chrome 25, Firefox 19

+5

Pero lamentablemente no en IE, vea mi pregunta: http://stackoverflow.com/questions/18069225/applying-text-decoration-on-css-generated-content-in-ie – frnhr

+5

Estás parcialmente correcto. La decoración de texto no funciona en absoluto en este contexto, porque la decoración de texto principal no se puede aplicar a bloques interiores en línea en general. Si omite por completo el 'text-decoration: none', aún así funcionaría. – TimE

6

que tenían el mismo problema y mi solución fue establecer la altura y overflow: hidden

http://jsfiddle.net/r45L7/

a { 
    text-decoration: underline; 
} 

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

Funciona en IE, FF, Chrome.

+7

Parece que la declaración 'display: inline-block' es suficiente. – extempl

+0

Si lo anterior por extempl fue una respuesta, no un comentario, sería la respuesta con el gran tic. – cfranklin

1

Lo único que funcionó para mí fue declarar un selector repetido por separado con la misma propiedad de decoración de texto que estaba heredando de su elemento principal, luego en el selector principal, establecer texto-decoración en ninguno.

Parece que IE no sabe qué hacer cuando establece text-decoration: none en un pseudo elemento sin ese elemento que tiene la propiedad de decoración de texto declarada (que por defecto, no tiene nada declarado por defecto). Esto tiene poco sentido porque obviamente se hereda de los padres, pero, por desgracia, ahora tenemos navegadores modernos.

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

Impresionante, esto funciona – Sebastian

0

Lo que hago es agrego un lapso en el interior del elemento, así:

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

Luego, en su archivo CSS:

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

a { 
    text-decoration:none; 
} 

a span { 
    text-decoration: underline; 
} 
Cuestiones relacionadas