Mostrando entradas con la etiqueta css. Mostrar todas las entradas
Mostrando entradas con la etiqueta css. Mostrar todas las entradas

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.

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!

miércoles 14 de noviembre de 2007

Solucionando prolijamente problemas de clear/float en css

A más de uno nos ha tocado a la hora de armar una página la lucha de tratar de transcribir lo que en nuestra mente resultaba más sencillo armarlo con tablas.

Hoy en día las tablas (por suerte) son utilizadas para lo que realmente fueron creadas: mostrar datos tabulados relacionados. Por consiguiente, los "divs" han cobrado cierta importancia sobretodo luego de que verdaderos gurus como Jeffrey Zeldman opinaran que las "tablas estaban muertas".

Emulando el comportamiento gráfico de las tablas


Para llevar a cabo nuestra diagramación, tenemos que recurrir a los elementos html <div> (que representan una división en la pantalla). Deberemos incluir tantos divs como "paneles" tenga nuestro diseño, por lo general un documento posee:

  • Encabezado (se lo suele identificar como "header")
  • Columna izquierda (se la suele identifica como "left")
  • Columna principal(se la suele identifica como "main")
  • Eventualmente una columna derecha (se la suele identifica como "right")


Bien, hasta ahí tendríamos todo más o menos claro, pero, hace falta solucionar problemas de visualización estrictamente para que tomen la apariencia que nosotros queremos.

Uno de los principales problemas a los que nos enfrentaremos suelen ser los "floats" (la propiedad css "float").

Cada vez que hacemos que un elemento "flote" el mismo impacta en el resto de la página, siendo necesario revertir dicho comportamiento para restaurar al flujo normal del documento.

La forma que más he visto es la sencilla solución de incluir un div con la propiedad "clear":

<div style="clear: left">

Sucede que eso desde un punto de vista más purista y semántico no es una solución muy correcta que digamos.
¿Por qué? ...bueno, para empezar, estamos agregando código en el documento para simplemente evitar un problema estrictamente relacionado a la visualización de nuestra página.

Claro que podríamos mejorar lo anterior simplemente añadiendo nuestro código inline dentro de un una clase css:

<div class="clearfix">

y en nuestra css copiar lo que anteriormente teníamos en nuestro div:


.clearfix{
clear: left
}


Si bien esto es más prolijo, seguimos teniendo el mismo problema de fondo...estamos agregando código al documento por el mero hecho de querer solucionar un problema "gráfico".

¿Cuál es la solución entonces más prolija y semánticamente más correcta?


Lo más correcto obviamente sería delegar esta responsabilidad a la CSS, ya que es la encargada de controlar el aspecto de nuestro documento.

Pero ¿cómo?, ¿todo esto no se originó justamente por problemas de estilos?
Si, pero también la solución está ahí mismo ;-)

Las CSS poseen una potencia bastante grande y muchas veces se las limita al uso de clases (lo cual genera CSS kilométricas y redundantes...ya hablaremos de ello en otro post).

Aunque Ud. no lo crea, las CSS poseen una capacidad bastante desconocida que les permite generar contenido...sí, así mismo: una css puede "inyectar" contenido a un documento. Por si fuera poco además pueden generar contenido antes o después de un elemento!, por lo tanto, perfectamenet podemos recrear lo anterior pero desde la propia CSS, dejándonos entonces una solución elegante y correcta.

Veamos como quedaría nuestra clase "clearfix" aplicando todo esto:


.clearfix:after {
content: ".";
display: block;
clear: both;
visibility: hidden;
line-height: 0;
height: 0;
}

.clearfix {
display: inline-block;
}

html[xmlns] .clearfix {
display: block;
}

* html .clearfix {
height: 1%;
}



Veamos que es lo que está generando entonces nuestra clase "clearfix" paso a paso:


.clearfix:after {/*after es un pseudo elemento que se generará a continuación de nuestro div con la clase "clearfix"*/
content: ".";/* Esto genera un "." como un texto en el div con la clase "clearfix"*/
display: block;
clear: both;
visibility: hidden;
line-height: 0;
height: 0;
}



El resto del código CSS se encargará de que nuestro querido Internet Explorer en sus distintas versiones interprete correctamente lo que queremos que haga.

lunes 29 de octubre de 2007

Alpha, transparencia crossbrowser? Es posible en forma sencilla?

La respuesta es si!

Y por cierto es sencillo, simplemente bastará con crear la clase css a la cual queremos darle la "capacidad" de verse transparente o translúcida, y escribir esto:

.transparent{
opacity: 0.7;
/* Esto lo entiende nuestro "amigo" Internet Explorer */
filter: Alpha(opacity=70);
}

En este caso suponemos que queremos crear una transparencia del 70%.

La primera línea será "comprendida" por Firefox, ópera, etc., mientras que la segunda solamente Internet Explorer. De esta sencilla forma logramos compatibilidad con ambos mundos (firefox/internet explorer) sin mayores dolores de cabeza.