Martes ~ Diciembre 26, 2006

CSS: Entendiendo y aplicando los hacks

¿Cuantas veces has tenido que aplicar hacks a tus CSS? Seguramente la respuesta a esta pregunta será “SIEMPRE”, y esto se debe generalmente a las diferencias que hay entre los motores de los navegadores y en como renderizan el HTML y el CSS. Por ese motivo tenemos usar herramientas “poco ortodoxas” para conseguir que el aspecto de nuestra página no desaparezca simplemente por una versión antigua del navegador de turno.

En este artículo vamos a intentar explicar las diferentes formas de aplicar hacks a nuestros navegadores y cual de ellas elegir para nuestro proyecto.

Introducción

Para empezar debemos conocer el funcionamiento del motor a la hora de leer un CSS. Un navegador, recibe el HTMl en el cual encuentra la referencia al fichero CSS que debe cargar (tambien puede encontrarlo en el <head></head>) esté carga todo el HTML y posteriormente pasa a aplicar los estilos CSS encontrados en el fichero o en el <head></head>. Para ello sigue un orden secuencial leyendo el fichero desde el principio hasta el final, aplicando los estilos así como van apareciendo. Tambien es conveniente que sepamos que cada asignación de estilos se sobrepone a la anterior, osea que el último estilo prevalece sobre los anteriores.


#elemento {
	border:3px red solid;
	border:2px blue solid;
}

En este ejemplo estamos aplicando un borde rojo de 3px y posteriormente sobreescribimos la propiedad con un borde azul de 2px, mostrando este último.

Tipos de Hacks CSS

Disponemos de 2 tipos de hacks, los conocidos como condicionales, que se aplican generalmente en los <head></head>, y los hacks en línea, que los encontraremos en nuestro CSS.

Hacks condicionales

Esta pobremente soportado por los estandares, ya que es algo que Microsoft creó para su Internet Explorer 5 con el nombre de “conditionals comments”. Estos comentarios nos permiten conocer de que navegador y de que versión se trata y aplicar unos estilos u otros.


Positivo
    <!–[if condicion]> HTML <![endif]–>
Negativo
    <!–[if !condicion]><![IGNORE[--><![IGNORE[]]> HTML <!–<![endif]–>

De esta forma podremos crear una condición que nos carge unos estilos dependiendo del navegador en el cual estén visitando a nuestra aplicación.

Estas son las conciones que podemos consultar.


IE
    Cualquier versión de Internet Explorer
lt IE X
    Versiones inferiores a X
lte IE X
    Versiones inferiores o iguales a X
IE X
    Solo para la version X
gte IE X
    Versiones superiores o iguales a X
gt IE X
    Versiones superiores a X

Pudiendo sustituir X por las versiones de IE disponibles (5,5.5,6 o 7).

Pero creo que será mejor ver un ejemplo práctico para conseguir entenderlo perfectamente.


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html lang="en">
	<head>
		<title>Test</title>
		<link href="all_browsers.css" rel="stylesheet" type="text/css">
		<!--[if IE]> <link href=”ie_only.css” rel=”stylesheet” type=”text/css”> <![endif]–>
		<!–[if lt IE 7]> <link href=”ie_6_and_below.css” rel=”stylesheet” type=”text/css”> <![endif]–>
		<!–[if !lt IE 7]><![IGNORE[--><![IGNORE[]]> <link href=”recent.css” rel=”stylesheet” type=”text/css”> <!–<![endif]–>
		<!–[if !IE]>–> <link href=”not_ie.css” rel=”stylesheet” type=”text/css”> <!–<![endif]–>
	</head>
	<body>
		<p>Test</p>
	</body>
</html>

Hacks en línea

Los conocidos como hacks en línea son aquellos que nos encontramos en nuestro CSS, y que están colocados de forma que un navegador que no conozca esa nomenclatura no aplicará dicho efecto dejando el anterior, generalmente se aplican selectores. De esta forma podemos aplicar un estilo y posteriormente aplicar un nuevo valor a ese estilo mediante uno de los hacks y que se ejecute en caso de que el navegador conozca dicho hack y lo pueda interpretar.

Veamos los principales selectores y los navegadores que los interpretan.


IE 6 y anteriores
    * html {}
IE 7 y anteriores
    *:first-child+html {} * html {}
Solor IE 7
    *:first-child+html {}
IE 7 y navegadores modernos
    html>body {}
Navegadores modernos (IE 7 no)
    html>/**/body {}
Ultimas versiones de Opera 9 y anteriores
    html:first-child {}

Estos selectores nos permiten acceder a un mismo elemento por dos caminos diferentes, dependiendo del navegador de la forma en la que interprete los selectores.

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html lang="en">
	<head>
		<title>Test</title>
	</head>
	<body>
		<input type="hidden" disabled id="attrhack">
		<p>Test</p>
	</body>
</html>

En este ejemplo podríamos aceder al <p></p> que engloba Test de las siguientes formas.


#attrhack[disabled=""]+p {}
    Firefox 1.5 y anteriores, posiblemente versiones futuras
    Safari 2.0 y anteriores, posiblemente versiones futuras
    Konqueror 3.5 y anteriores, posiblemente versiones futuras
#attrhack[disabled="true"]+p {}
    Opera 9 y anteriores, posiblemente versiones futuras

Dentro de los hacks en línea tenemos otros operadors que nos permiten condicionar el aspecto de nuestras páginas. Aunque no son recomendables por la W3C ya que no nos permite la validación de las hojas de estilos de nuestra aplicación.

  • !important

Internet Explorer 6 y versiones anteriores tienen un problema con este operador, ya que generalmente es ignorado en cualquier declaración, aunque Internet Explorer 7 ya ha conseguido arreglar este problema.

Es usado para que la mayoría de navegadores respeten la importancia que tiene la declaración que lo contenga. 


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html lang="en">
	<head>
		<title>Test</title>
		<style type="text/css">
			p
			{
				background: green !important; /* Navegadores superiores a IE 6 respetarán la importancia inmediatamente */
				background: red; /* IE 6 y anteriores aplicará este estilo aunque esté marcado la anterior como importante */
			}
		</style>
	</head>
	<body class="page-body">
		<p>Test</p>
	</body>
</html>
  • @import “non-ie.css” all;

Internet Explorer 7 y anteriores no soporta las reglas de los selectores @import, por lo tanto son ignorados en nuestro CSS. De esta forma puedes crear una hoja de estilos para navegadores no IE y importarla desde tu CSS principal dejando todos los navegadores IE fuera de este diseño.


@import "stylesheet.css" all;
  • body[class|="page-body"]

La especificación CSS 2.1 no es muy clara aobre este tema o no hay un guión sobre este selector. Muchos navegadores, incluido Firefox e Internet Explorer 7, permiten el uso de body[class|="page-body"] como selector para un tag así: <body class="page-body">. Encambio Opera interpreta esta especificación de diferente manera. El corta el valor del atributo y solo selecciona la primera pieza del selector. Ovbiamente si el atributo se corta no obtenemos el valor deseado. Por lo tanto este selector parece no funcionar en las versiones de Opera, aunque se espera que en versiones 8 y 9 deberían funcionar.


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html lang="en">
	<head>
		<title>Test</title>
		<style type="text/css">
			p
			{
				background: red; /* Esto se aplica a todos los navegadores */
			}

			body[class|="page-body"] p
			{
				background: green; /* Esto se aplica a IE7 y el resto de navegadores modernos excepto Opera. */
			}
		</style>
	</head>
	<body class=”page-body”>
		<p>Test</p>
	</body>
</html>

Hacks no recomendados

Debido a la dictadura que Internet Explorer nos ha tenido sometidos, disponemos de una serie de hacks que el validador de CSS de la W3C no soporta, pero que Internet Explorer 6 (y versiones inferiores) aún permite.

_propiedad: valor y -propiedad: valor

El uso de caracteres no alfanuméricos delante del nombre del atributo es algo que IE6 y anteriores si permite, menos mal que IE7 ya corrige este “problema”. Aunque gracias a él muchos años se han usado estos “fallos” para diferenciar aspectos entre IE y el resto de navegadores.

Una buena alternativa es usar !important.

_propiedad: valor y -propiedad: valor se aplica a IE6 y anteriores.  

CSS no válido. 

*propiedad: value

Este método es similar al anterior pero en este caso tambien tenemos que tener en cuenta a Internet Explorer 7, que pese a ser un caracter no alfanumérico lo trata como si del operador * se tratara.

*propiedad: valor funciona para todos los navegadore Internet Explorer, pero en futuras versiones no debería seguir funcionando.

CSS no válido.

body:empty

:empty es una pseudo-clase propuesta por la W3C para el CSS3 y debería hacer referencia a un elemento que no tiene en su interior otros elementos o nodos de texto. Sin embargo cuando lo usamos con el elemento body, Firefox 1.5 y 2.0 siempre lo selecciona pese a tener contenido.

Aunque parece que este hack será valido para la CSS3 las recomendaciones de la W3C es no usarlo, ya que para la especificación 2.x lo considera inválido. Sin embargo es probablemente la mejor manera de diferenciar Firefox en tus CSS.

body:empty selecciona el body únicamente en navegadores Gecko (Firefox 1.5 y 2.0).

CSS 2.x: CSS no válido.

CSS 3: CSS válido.

a:link:visited, a:visited:link

De acuerdo con el estandard CSS :link y :visited son estados que no pueden darse a la vez. Parece ser que IE7 y versiones anteriores ignoran una de ellas y lo trata como un simple selector. Si tienes un enlace <a href="ejemplo.html" id="enlace"> podrás usar #enlace:link:visited{} o #enlace:visited:link {} para selecionar el elemento en Internet Explorer 7 y anteriores. Aunque se espera que en versiones futuras no funcione.

a:link:visited, a:visited:link {} selecciona un elemento <a></a> en Internet Explorer 7 y anteriores.

>body

Pese a ser un selector simple que nos indicaría el hijo de … (>) úbicado sin un elemento padre al que referenciar únicamente IE7 parece que lo interpreta. Aunque en futuras revisiones parece ser que van a solucionar este fallo.

>body {} Solo para Internet Explorer 7

CSS no válido.

html*

Internet Explorer 7 y todas las versiones anteriores, interpretan este hack como un intento de hacer referencia a todos los descendientes de html.

html* {} en Internet Explorer 7 y anteriores selecciona todos los nodos hijos de <html></html>.

CSS no válido.

!ie 

Internet Explorer 7 soluciona uno de las cuestriones con !important pero tiene problemas cuando el identificador tiene un error. Si se usa en lugar de !important, Internet Explorer manejará la propiedad correctamente en lugar de fallar. Por lo tanto en cualquier declaración de estilo puedes incluir las características prevista para aplicarse solamente en Internet Explorer y agregar !ie, cualquier palabra puede ser utilizada en lugar de ie.

CSS no válido.

!important!

Otro problema con el identificador !important que no han solucionado en IE7 es el uso de caracteres no alfanumérico detrás del identificador. Normalmente usarlo debería fallar, pero Internet Explorer 7 y anteriores ignoran el caracter final y lo aplica como si de !important se tratara.

!important! permite que la propiedad sea aplicada con la importancia requerida en IE7 y anteriores, aunque no será tratado por lo otros navegador. En futuras versiones dejará de funcionar.

CSS no válido.

Quizas te pueda interesar

33 Responses to “CSS: Entendiendo y aplicando los hacks

Pingback

Comentarios

1

Magnifico, tendré que poner en practica alguno de estos hacks.
Por cierto lo he enviado a Fresqui :P

# InKiLiNo -- 27/12/06 - 12:05 am Responder
2

Tú blog se ve fatal, pero fatal fatal en Firefox en Windows. Especialmente la imagen del pie de página.
Es sólo para animarte a que lo arregles y tu blog se pueda leer mejor.
Un saludo

# luces -- 27/12/06 - 1:30 am Responder
3

#2 Podrías hacerme una captura de pantalla de como lo ves???

¿A alguien más le ocurre?

# aNieto2k -- 27/12/06 - 1:33 am Responder
4

A mi se me ve perfectamente en Firefox.

# ortiga -- 27/12/06 - 2:25 am Responder
5

A mí se me ve bien, pero para poder descender en el contenido tengo que irme a la barra de scroll y es UN COÑAZO. Si intento desplazarme en el documento sube el contenido para arriba, se desplaza como en otro marco.

Es como si fuera un div o iframe posicionado de manera absoluta con el ancho y alto del navegador, con la propiedad overflow puesta a scroll.

¿Por qué no poner el navegador de abajo en un div con la propiedad position:fixed; y ya está?

Ah, utilizo Konqueror 3.5.5.

# yS -- 27/12/06 - 3:16 am Responder
6

En tema del pie de página se ve normal en mi Firefox, estoy con windows vista..

Por lo demas, esta muy interesante el articulo publicado

# jp_iparraguirre -- 27/12/06 - 3:17 am Responder
7

En Konqueror la barra de abajo “flickea” cuando por debajo pasa un campo de formulario o uno de esos divs con barra de scroll.

En Firefox es mucho peor, la barra se queda como pegada y si paras se vuelve a ver bien, pero no deja de ser molesto.

# yS -- 27/12/06 - 3:20 am Responder
8

Buen artículo,

¿Sabes si el hack tipo “w/idth” valida en CSS?

Por cierto, desde Firefox 2.0 y Ubuntu, tu barra inferior aparece 75 px por encima de la parte inferior de la página, con lo que tapa parte del artículo

Salud, Andrés.

# Andrés -- 27/12/06 - 8:02 am Responder
9

#8 No valida, no es una propiedad válida por la W3C

# aNieto2k -- 27/12/06 - 9:12 am Responder
10

Yo con firefox y windows xp si hago scroll con la rueda del raton se me sube el marco y no el contenido.

Salu2

# PReTo -- 27/12/06 - 10:15 am Responder
11

muy util, gracias ;)

# Felipe -- 27/12/06 - 1:13 pm Responder
12

Se ve bien pero te hago una humilde sugerencia.
¿Podrías disponer de una hoja de estilo para salida por impresora? Digo para ocultar el adsense, el buscador y esas cosas que para leer tranquilos no sirven de nada, solo quitan lugar al contenido. :D
Saludos y excelente articulo.

# Victor Bracco -- 27/12/06 - 3:15 pm Responder
13

Muy bueno el articulo, pero sinceramente deberias hacer algo con el pie de tu pagina, distrae mucho y no facilita la lectura, seria buen que en vez de tenerlo fijo aparezca al fondo nomás.

# RoQ -- 27/12/06 - 10:26 pm Responder
14

#15 Creo que es cuestion de acostumbrarse, yo hace más de 2 meses que lo uso y desde en 2 días ya lo tenía controlado.

Creo que debe de ser como los sidebar inferiores, yo era de los que opinaba que eso era poco usable y algo molesto. Pero ha pasado el tiempo y me he dado cuenta que estaba equivocado ya que se ha impuesto en la blogsfera y con ello se ha superado la barrera de usabilidad que antes había.

# aNieto2k -- 27/12/06 - 11:35 pm Responder
15

Gracias Andres!

# Victor Bracco -- 30/12/06 - 4:19 pm Responder
16

Gracias, excelente artículo. tendré que poner en práctica algunas cosas porque para variar, Internet Explorer hace calabaza todo mi CSS; bueno no todo, pero si partes cruciales.
Creo que lo que mas me convendrá es hacer un @import; por cierto es mi imaginación o internet explorer y firefox tratan diferente los padding y margin? o___O
Saludos!

# Fred.cpp -- 04/01/07 - 7:19 pm Responder
17

Hola,
Respecto a firefox, ninguna anomalia. Tu blog se ve perfectamente bien, tanto en ie como firefox (uso win 2000).

Saludos

# fpde -- 21/03/07 - 11:07 pm Responder
18

por pimera vez tengo que aplicar un hack y estoy medio perdido, si entendi bien, el primer ejemplo que pusiste se puede aplicar perfectamente a un sitio que quiera discriminar entre Ie6, Ie7 y Firefoxy demases con diferentes .css no?

porque para mi es la solucion perfecta para mi problema, tengo un sitio hecho para Ie6 y en firefox se ve fatal y mi cliente usa Ie7 asi que ya sabes…lo ve con varios errores, puedes aclararmelo o estoy bien?

si puedes respondeme.

# Sergio -- 13/08/07 - 11:11 pm Responder
19

Buenas Sergio, este artículo intenta mostrar las diferentes soluciones para hacer que nuestras aplicaciones se vean bien en todos los navegadores.

Para conseguir esto, solemos recurrir a hacks, que nos permite aplicar varios estilos, haciendo que unos los interprete un navegador y otros, otro.

Saludos

# aNieto2k -- 13/08/07 - 11:24 pm Responder
20

Hola andrés, gracias por el artículo. Una pregunta tengo… el hack condicional para Firefox cual es, Andres?
Es decir, puedes poner sin problemas cosas de pero solo hablas de Internet Explorer. Si pudieras poner como hacer este condicionamiento para Firefox te lo agradecería.
Un saludo

# TitoFer -- 09/09/07 - 10:05 am Responder
21

Ups, parece ser que se ha tragado parte del comentario

- - >

# TitoFer -- 09/09/07 - 10:06 am Responder
22

Muy buen articulo…

lo pondre en practica…

# Pablo -- 13/12/07 - 5:04 pm Responder
23

Estupendo trabajo, felicidades!

# Ferran Riera -- 24/01/08 - 8:28 pm Responder
24

Yo quiero aportar un hack para el precioso legado que dejo el IE:
#propiedad: background…
al ponerle el simbolo # como prefijo de la propiedad , tanto IE6 como IE7 lo toman como válido ;)
Osea que para aplicar estilos que se ven bien en la familia IE y mal en los demas, podemos usar lo siguiente:
padding:5px;
#padding:3px;

Ojala les sirva como a mi, saludos!

# santiag0 -- 07/05/08 - 4:11 am Responder

Deja un comentarioTop

Me reservo el derecho de eliminar y/o modificar los comentarios que contengan lenguaje inapropiado, spam u otras conductas no apropiadas en una comunidad civilizada. Si tu comentario no aparece, puede ser que akismet lo haya capturado, cada día lo reviso y lo coloco en su lugar. Siento las molestias.

Esta web se encuentra sobre la licencia Creative Commons (Reconocimiento - Compartir igual) / Politicas de uso

Cerrar
Enviar por Correo