jueves, 20 de diciembre de 2007

Internet Explorer 8 pasa el test Acid2

Internet Explorer 8 pasa el test Acid2
Microsoft anunció recientemente en su blog que había alcanzado el hito de pasar el test Acid2 en el desarrollo de Internet Explorer 8.

Esto significa que Microsoft está tomando conciencia del terreno que estaba perdiendo en la batalla de los navegadores web, y que está tratando de competir por más que no entre entre los primeros puestos (el primer navegador en pasar el test Acid2 fue Safari en octubre de 2005, y el último antes de IE8 fue Firefox 3.0).

Por supuesto que esto no significa que IE8 haya solucionado todos sus caprichos así como tampoco sus problemas con floats, fuga de memoria (memory leaks), baja performance, etc., pero al menos es un comienzo.

jueves, 13 de diciembre de 2007

Selectores CSS 2.1, Parte 1


Selectores CSS 2.1, Parte 1

Traducción al español del artículo en www.456bereastreet.com
, escrito por Roger Johansson

Una de las primeras cosas que aprendes cuando comienzas con CSS son los selectores.

Los selectores son obviamente una parte fundamental de las CSS, pero son pocos los
desarrolladores que los utilizan a su capacidad máxima. Si bien puedes hacer mucho con solamente con los selectores de tipo, ID y clase, hay muchos más.

Aprender cómo usar el rango completo de selectores disponibles en CSS 2.1 ciertamente puede ayudarte a mantener tu HTML mucho más limpio. Te permitirá minimizar el uso innecesario del atributo class y la necesidad de agregar elementos div y span extraños al código de tu página. Suena bien, no?

Entonces, ¿por qué no se usa completamente todo el rango de selectores? La razón más importante ha sido el insuficiente soporte de Internet Explorer hasta e inicluso la versión 6. Todos los demás recientes navegadores soportan la mayoría o todos los selectores CSS 2.1. Ten presente esto antes de correr a usar todo lo que se describe en estas series.



Como hay tantos selectores CSS, un solo artículo explicándolos todos sería muy largo. Para hacer la información más sencilla de digerir Roger Johannson los ha dividido en tres partes:

  1. Parte 1, este artículo, explica las bases de selectores además del universal, el tipo, id, y los selectores de clases.

  2. Parte 2 es acerca de los combinadores, selectores combinados, agrupamiento, y selectores de atributo.
  3. Parte 3 será toda acerca de pseudo-clases y pseudo-elementos.

Se postearán los artículos periódicamente y se vincularán a las demás partes a medida que son publicadas. Muy bien entonces. Comencemos.

Las bases de selectores

Al comienzo las cosas más básicas. Un selector CSS está hecho de un patrón que es hecho coincidir contra todos los elementos del árbol del documento. Cuando todas las condiciones en el patrón son verdaderas, el selector coincide y las declaraciones dentro de la regla son aplicadas al elemento o al elemento que coincide. Considera esta sencilla regla CSS:



p { color:#f00; }

El selector es la parte de la regla CSS que viene antes de la llave de apertura, “{“. El selector aquí es p, que encontrará todos los elementos p en el documento y hace cualquier texto que contenga rojo. Muy básico.

Descripción del Selector

Ok, eso fue un ejemplo realmente simple. Vamos a describir más tarde todos los otros selectores, y ahí las cosas se van a volver un poco más complicadas. Antes que eso sin embargo, he aquí una descripción de la sintaxis para todos los selectores CSS 2.1 (basados en la tabla en CSS 2.1, 5.1 Coincidencia de patrones):





Descripción de la sintaxis CSS 2.1 de selectores
Selector typePatrónDescripción
Universal*Encuentra cualquier elemento.
TipoEEncuentra cualquier elemento E.
Clase.infoEncuentra cualquier elemento cuyo atributo class contiene el valor info.
ID#footerEncuentra cualquier elemento con un id igual a footer.
DescendienteE FEncuentra cualquier elemento F que es un descendiente de un elemento E.
HijoE > FEncuentra cualquier elemento F que es un hijo de un elemento E.
AdyacenteE + FEncuentra cualquier elemento F inmediatamente precedido por un elemento hermano E.
AtributoE[att]Encuentra cualquier elemento E que tiene un atributo att , a pesar de su valor.
AtributoE[att=val]Encuentra cualquier elemento E que tiene un atributo att cuyo valor de atributo es exactamente igual a val.
AtributoE[att~=val]Encuentra cualquier elemento E cuyo atributo valor att es una lista de valores separados por espacios, uno de los cuales es exactamente igual a val.
AtributoE[att|=val]Encuentra cualquier elemento E cuyo atributo att tiene una lista de valores comenzando por val separada por guión.
La pseudo-clase :first-childE:first-childEncuentra el elemento E cuando E es el primer hijo de su padre.
Las pseudo-clases linkE:link
E:visited
Encuentra links no visitados aún (:link) ó aquellos ya visitados (:visited).
Las pseudo-clases dinámicasE:active
E:hover E:focus
Encuentra E durante ciertas acciones del usuario.
La pseudo-clase :languageE:lang(c)Encuentra elementos del type E que estan en el lenguaje c.
El pseudo-elemento :first-lineE:first-lineEncuentra los contenidos de la primera linea formateada del elemento E.
El pseudo-elemento :first-letterE:first-letterEncuentra la primera letra de un elemento E.
Las pseudo-elementos :before y :after E:before E:afterUsado para insertar contenido generado antes o después del contenido de un elemento.

Explicaremos más adelante cada uno de estos tipos de selectores con más detalle en este artículo de dos partes, así que mantente leyendo. Unos pocos términos usados en esa tabla en el resto de este artículo tal vez necesite alguna aclaración:

Descendiente
Un elemento que es el hijo, nieto ó descendiente tardío de un elemento en el árbol del documento.
Ancestro
Un elemento que es el padre, abuelo o ancestro anterior de un elemento en el árbol del documento.
Hijo
El descendiente directo de un elemento. Ningún otro elemento debe venir entre los dos en el árbol del documento.
Padre

El ancestro directo de un elemento. Ningún otro elemento debe venir entre los dos en el árbol del documento.
Hermano
Un elemento que tiene el mismo padre que el elemento actual.

Selectores simples y combinados

Existen dos categorías básicas de selectores: simples y combinados.


Un selector simple consiste de tanto un selector de tipo o el selector universal seguido de cero o más selectores de atributos, selectores de ID, o pseudo-clases. La siguiente regla contiene un ejemplo de un selector simple:


p.info { background:#ff0; }

Un selector combinado(a veces llamado selector contextual) consiste de dos o más selectores separados por un combinador. Este es un ejemplo muy simple de un selector combinado:

div p { font-weight:bold; }

El código anterior aplicará a todos los elementos p que son descendientes del elemento div.

Un pseudo-elemento puede puede ser adjuntado a un selector. En un selector combinado, un pseudo-elemento puede ser solo adjuntado al último selector simple.

Detalles acerca de selectores combinados, combinadores, y pseudo-elementos pueden ser encontrados en la Parte 2 y Parte 3 en esta serie.


El selector universal

El selector universal es representado por un asterisco, "*", y encuentra todos los elementos en el documento. Es bastante raro verlo en una CSS, pero el selector universal es actualmente bastante utilizado con selectores de clase y de Id. Si el selector universal no es el único componente de un selector simple, entonces el "*" podría omitirse:

.myclass es equivalente a *.myclass#myid es equivalente a *#myid

Un uso para el selector universal que se ha vuelto bastante popular es usarlo para establecer los margenes y "paddings" de todos los elementos a cero:


* { margin:0; padding:0; }

Esto es a veces referido como el Global White Space Reset.

Selectores de tipo

Un selector de tipo encuentra cada instancia de un tipo particular de elemento. La siguiente regla encuentra todos los elementos párrafo en el documento y establece su tamaño de fuente a 2em:

p { font-size:2em; }

El selector de clase

El selector de clase es representado por un ".", y apunta a elementos basados en el valor de su atributo class. La siguiente regla aplicará a todo elemento p con una clase de nombre "info":


p.info { background:#ff0; }

Es posible asignar múltiples nombres de clase a un elemento - el atributo class puede tener una lista de nombres de clase separadas por espacios. Los selectores de clase pueden entonces ser usados para apuntar a elementos que tengan varios nombres de clase. Esta regla encontrará los elementos p que tengan ambas "info" y "error" en su lista de nombres de clase:


p.info.error { color:#900; font-weight:bold; }

El tipo de elemento no tiene que ser especificado. Dejarlo es lo mismo que usar un selector universal en lugar de un selector de tipo. Esta regla encontrará todos los elementos con un nombre de clase "info" más allá de su tipo:


.info { background:#ff0; }

El selector de ID

El selector de ID es representado por un numeral, "#", y apunta a elementos basados en el valor de su atributo id. Esta regla aplicará a un elemento cuyo id es "info", más allá de cual tipo de elemento sea:


#info { background:#ff0; }

Si además se especifica el tipo de elemento, la regla solamente aplicará a los elementos de ese tipo:


p#info { background:#ff0; }

Es importante recordar que los selectores de ID tienen mayor especificidad que los selectores de clase, y que un valor de Id debe ser único dentro de un documento. Por lo tanto un selector de ID puede solo aplicar a un único elemento en un documento.


Continuará…


Ok, eso es todo para la Parte 1 de esta serie de artículos.

viernes, 7 de diciembre de 2007

Vista previa de HTML 5.0

Viendo el excelente sitio A List Apart me entero de esto que a más de uno le causará alegría:
ya existe una vista preliminar de HTML 5.0

HTML 5 introduce e incrementa un amplio rango de nuevas características incluyendo controles de formulario, APIs, multimedia, estructura, y semántica.

El trabajo en la especificación comenzó en 2004 y aún queda mucho camino por recorrer, pero, ya se ven ciertas cosas que prometen, aunque, cabe aclarar que como aún dista por terminarse dicha especificación, las cosas que se mencionan en este artículo bien podrían cambiar a futuro.

Estructura


Todos hemos padecido los problemas en cuanto a crear estructuras en nuestras páginas, teniendo que muchas veces recurrir a los famosos <div>.

Muchas veces nuestras páginas terminan teniendo una cantidad considerable de "divs" con los atributos "class" para dar estilo (y por qué no, intentar describir un poco más que es a lo que se refieren).

He aquí un ejemplo del artículo en ALA:

Ejemplo de código HTML 4.0 para dar estructura a una página

Lo que se está manejando en HTML 5.0:
Ejemplo de código HTML 5.0 para dar estructura a una página

¡Qué bueno poder irse despidiendo de tanto div y tener un código que describa semánticamente cada una de esas secciones! :)

Video and Audio


HTML 5.0 proveerá más facilidad a la hora de colocar nuestros archivos multimedia en nuestras páginas.

Para ello se viene manejando la posibilidad de embeber video de la siguiente manera:


<video src="video.ogv" controls="" poster="poster.jpg" width="320" height="240">
<a href="http://www.blogger.com/video.ogv">Download movie</a>
</video>


y audio de esta forma:


<audio src="music.oga" controls="">
<a href="http://www.blogger.com/music.oga">Download song</a>
</audio>


Bastante sencillo ¿no?

La idea es que el browser brinde una GUI que permita controlar el contenido.

Para profundizar más acerca de video y audio en HTML 5.0, puedes ver el bosquejo de la especificación de HTML 5.0 para audio y video.

jueves, 6 de diciembre de 2007

Reduciendo el tamaño de tus páginas web

Más de una vez me ha sucedido tener que optimizar un sitio hecho por terceros (e incluso uno propio).

Gracias a mootools (aunque ya conocía packer de Dean Edwards) me enteré del concepto de "minimizar" (lo cual consiste en eliminar los espacios en blanco innecesarios, así como remover los comentarios dejados por el desarrollador) un archivo de javascript. Esto por sencillo que pueda sonar es realmente muy útil, ya que efectivamente se logra reducir el tamaño en bytes de nuestros archivos.

Las mentes siniestras como la mía :) comenzaron a hilvanar toda clase de formas en las cuales "exprimir" cada bit en los archivos (html, php, js, css).

La mejor forma que vengo manejando hasta el momento es trabajar con una carpeta en la cual tenemos todos nuestros archivos "fuente" prolijamente indentados y comentados, sin escatimar en los espacios en blanco que contribuyan a la legibilidad del código.
Esta es la carpeta que contiene (digamoslo así) los archivos "legibles por humanos".
A la hora de publicar nuestros archivos en internet, nos valdremos de aplicaciones que nos permitirán remover todo aquella información que le es innecesaria al servidor.

Sin duda que suena tedioso, ¿no? :)
Bueno, acá es donde viene la magia del SVN...usamos un "hook" el cual ejecutará nuestras aplicaciones sobre nuestros archivos "exprimiéndolos" y luego los publicará en el servidor. ¿Suena mejor, no?

De esta forma contamos con nuestra versión "human friendly" y la versión publicada "server friendly".

Lo que no he mencionado aún son las dichosas aplicaciones, así que aquí van:

  • JsMin
    Esta aplicación minimiza archivos javascript

  • YUI Compressor
    Esta aplicación minimiza archivos javascript

  • HTMLTidy
    Esta aplicación no solo optimiza el código sino que además lo ordena y corrige código inválido.

  • CSSTidy
    Esta aplicación optimiza el código de la css reescribiendo aquellas cosas redundantes y borrando espacios innecesarios.

  • OptiPNG
    Esta aplicación recomprime imágenes a un tamaño menor.

martes, 4 de diciembre de 2007

Forzar IE a mostrar transparencia alpha en PNGs

Bastante sabido es de los problemas de IE a la hora de lidiar con la transparencia alpha de los archivos PNG.

Sucede que hasta la versión 6 de IE, el navegador no era capaz de mostrar correctamente la transparencia, mostrando un frustrante fondo de color gris en su lugar.

La solución recae en la utilización del famoso filtro AlphaImageLoader.

Veamos un ejemplo de la declaración de estilos en una CSS de lo que entienden los navegadores como la gente:


#logo_transparente{
background:url('png_transparente.png'); width:150px; height:55px;
}


Si viéramos la página que incluye a la CSS en IE tendríamos el mencionado problema, por lo que la solución es declarar en la stylesheet exclusiva para IE lo siguiente.


/* ESTO ES LA VERSIÓN PARA IE */

#logo_transparente{
background:none; filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='png_transparente', sizingMethod='scale');
}


Listo! De forma sencilla hemos sobreescrito el estilo de nuestra CSS principal para que nuestro querido IE entienda lo que queremos hacer: un PNG transparente!

Iconos para tu escritorio o páginas web

Imagen de varios iconos gratuitos para ser usados en tu escritorio o en tus páginas web
Bueno una vez más aquí varios iconos gratuitos para ser usados en tu escritorio o en tus páginas web.

La calidad es realmente buena, no se apresuren a prejuzgar (por el hecho de que sean gratuitos no significa que sean malos)