2012-04-03 13 views
5

Como estoy seguro de que todos ustedes saben, Internet Explorer puede manejar degradados simples. Aquí hay un fragmento de Twitter Bootstrap, por ejemplo:CSS: Gradientes simples en Internet Explorer <= 8

filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#e6e6e6', GradientType=0); 

Sin embargo, he visto algunas personas usan dos reglas CSS (una para IE 8 < y uno para IE 8), así:

filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#7fbf4d', endColorstr='#63a62f'); /* For Internet Explorer 5.5 - 7 */ 
-ms-filter: "progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#7fbf4d', endColorstr='#63a62f')"; /* For Internet Explorer 8 */ 

Mi pregunta es, ¿es realmente necesaria la segunda regla? Twitter Bootstrap es bastante minucioso, pero no usa ninguna regla de "filtro dems". De acuerdo con this page, el atributo -ms-filter es una extensión de CSS y se puede usar como sinónimo de filter en el modo de estándares IE8.

Respuesta

3

Mi sugerencia:

Uso CSS3Pie - http://css3pie.com/

Esta es una biblioteca JavaScript para IE6, IE7 e IE8 que los parches en apoyo a varias características de CSS3, incluyendo gradientes.

Sí, puede utilizar los horribles estilos específicos de IE filter si lo desea, pero CSS3Pie le permite usar estilos CSS estándar para estas funciones. Más fácil.

Para responder realmente su pregunta directa:

Sí, generalmente se requiere el estilo -ms-filter. IE8 siempre nos lo usará en lugar de filter, que se usa principalmente para IE6 e IE7. En algunos casos, filter funcionará en IE8, pero no en todos, por lo que es mejor usar -ms-filter para garantizar la compatibilidad con IE8.

[EDITADO] ¿Por qué lo cambiaron? Porque cuando lanzaron IE8, Microsoft hizo un gran esfuerzo por tratar de ser "compatible con los estándares".

Para que un navegador sea estándar, debe usar un prefijo de proveedor para cualquier propiedad CSS compatible que no sea un estándar W3C finalizado. Entonces, al agregar el prefijo -ms-, Microsoft intentaba (tardíamente) deshacer la contaminación del espacio de nombres CSS global.

Además, se agregaron las comillas, porque la antigua sintaxis filter sin las comillas era CSS no válido (principalmente debido a los dos puntos después de progid) y causaba problemas con algunos navegadores. (Tuve una instancia hace un tiempo con Firefox 3.6 donde se descartaban todos los estilos siguiendo un estilo filter que rotaba un elemento; tardaba años en resolverse lo que estaba sucediendo).

El hecho de que Microsoft conservó la compatibilidad con la sintaxis original filter, fue en gran medida una cuestión de pragmatismo. MS no podía darse el lujo de romper todos los sitios usando la sintaxis anterior. Pero hubo una fuerte implicación de Microsoft de que los desarrolladores deberían usar ambos porque soltarían soporte para el viejo estilo filter en versiones posteriores de IE. Resultó que retiraron el soporte para filter y -ms-filer de un solo golpe, pero las implicaciones dadas en el lanzamiento de IE8 fueron suficientes para que se convirtiera en una práctica recomendada para proporcionar ambas sintaxis en su hoja de estilo.

En el momento en que se lanzó IE8, XHTML era el nuevo sabor del mes, y el código de escritura que se validó perfectamente fue uno de los primeros en la lista para muchos desarrolladores. Esta fue probablemente una fuerte fuerza impulsora en el cambio de sintaxis para incluir las comillas. Debido a los dos puntos, es imposible escribir CSS que valide el uso del antiguo estilo filter. El uso de los nuevos estilos -ms-filter permitió a las personas escribir CSS válidos. A medida que las buenas ideas van, esta realmente no funcionó porque, por supuesto, la gente tenía que seguir usando la sintaxis antigua de todos modos, pero la intención era buena.

Vale la pena señalar que otros estilos propietarios recibieron el mismo tratamiento. Por ejemplo, puede usar -ms-behavior en IE8 en lugar del antiguo estilo behavior. Nadie lo usa. ¿Por qué? Realmente no lo sé

Otro hecho que vale la pena saber es que el W3C está en el proceso de estandarizar un CSS property called filter. Hará un trabajo completamente diferente al estilo Microsoft filter, y funcionará de manera completamente diferente. Si/cuando está estandarizado y los navegadores comienzan a soportarlo, habrá un choque explícito entre las dos sintaxis.

+2

Realmente no me gusta CSS3Pie. Ver [aquí] (http://stackoverflow.com/a/7668408/937084) y [aquí] (https://twitter.com/#!/grantmccall/status/117649720297525248). En el caso de degradados, la versión ** filter ** funciona en IE6, IE7, IE8 e IE9. En la vista previa de consumidor de IE10, solo funciona en modo compatibilidad. La versión de ** - ms-filter ** funciona en IE8 e IE9, pero * no * IE10, incluso en modo de compatibilidad. IE10 usa ** - ms-linear-gradient **. Parece que la versión de ** - ms-filter ** solo es buena para IE8 e IE9, pero ambas soportan ** filter ** también, ¿por qué molestarse con la versión de ** - ms-filter **? – Nick

+1

He actualizado la respuesta con muchos más detalles sobre los por qué y cómo de -ms-filter. – Spudley

+0

BTW - Tienes razón, CSS3Pie puede ser lento. Pero también lo son los filtros. Ninguno de los dos es lento, a menos que los uses en exceso. Y CSS3Pie tiene una gran ventaja de los filtros en el sentido de que admite colores de canal alfa para sus degradados, que no es el estilo de filtro de MS. Su otra opción, por supuesto, es simplemente utilizar un respaldo de color plano para el viejo IE. A menos que arruine totalmente el diseño de su sitio, o su audiencia tiene una gran proporción de usuarios de IE, a veces es más simple dejarles tener colores planos y esquinas cuadradas. – Spudley

0

Parece que ha respondido a su propia pregunta. Sí, son necesarios. Microsoft tratando de alinearse más con los estándares significa que algunas versiones de IE tienen sus propias reglas de sintaxis ligeramente diferentes para la propiedad del filtro.

En IE7 solo filter: seguido de progid:DXIma... etc. funcionará. Pero para IE8 + existe la alternativa de IE7 que puede usarse en modo de compatibilidad, y la propiedad de prefijo -ms- más adecuada para el filtro, que denota una propiedad css específica del proveedor, y su valor dentro de los qoutes.

+0

La versión ** filter ** funciona en IE6, IE7, IE8 e IE9, pero * no * IE10. La versión ** - ms-filter ** tampoco funciona en IE10. IE10 usa ** - ms-linear-gradient **. Por supuesto, IE10 aún no es oficial, por lo que está sujeto a cambios. De todos modos, si la versión 6-9 admite la versión ** filter **, ¿por qué molestarse con la versión ** - ms-filter **? – Nick

+0

Debo añadir que la versión ** filter ** funciona en el modo de compatibilidad de IE10, pero la versión ** - ms-filter ** nunca funciona en IE10, incluso en modo compatibilidad. – Nick

+0

Microsoft tiene 2 políticas conflictivas en este momento. La primera es que quieren ser más compatibles con los estándares. Esto es lo que les hizo introducir '-ms-filter' porque eso es más o menos considrado correcto. Luego, la segunda política es respaldar su propia plataforma y características durante mucho tiempo, esta es la razón para el modo de compatibilidad y toda una gama de propiedades que siguen funcionando porque Microsoft cree que pueden predecir con precisión lo que alguien quería hacer, aunque fuera dirigido a una versión anterior de IE. Realmente está pidiendo confusión: s – sg3s

0

¿Qué daño le haría dejarlo?

Si el navegador no entiende la línea de CSS, simplemente la ignorará.

Esas dos líneas de CSS son casi idénticas. Me atrevería a suponer que Microsoft decidió cambiar la sintaxis de CSS propietario de IE8 en adelante utilizando el prefijo - (guión) que otros navegadores han estado utilizando para yonks.

Técnicamente, el CSS no es compatible con W3C de ninguna manera, por lo que otra línea de CSS propietario no puede hacer daño.

¡No vale la pena tratar de entender IE en el mejor de los casos!

+0

Ya necesita tantas líneas repetitivas para un solo degradado, entonces, ¿por qué agregar otra línea cuando no es necesaria? Además, mantener la versión ** - ms-filter ** cuando la versión ** filter ** funciona bien va en contra del principio KISS y se agrega al tamaño del archivo. Solo tengo curiosidad si los desarrolladores que usan ambas versiones tienen una razón lógica para hacerlo. – Nick

+0

Ah, sí, y a partir de la vista previa del consumidor de IE10, la versión ** - ms-filter ** ya no es compatible, por lo que aparentemente solo es buena para IE8 e IE9. – Nick

Cuestiones relacionadas