Un documento (X)HTML sólo debe tener contenido, es decir, los datos que el autor quiere publicar y su estructura. La apariencia o presentación de un documento web debe especificarse en un archivo externo llamado hoja de estilos que indica cómo debe formatearse la información en la pantalla, en papel u otro medio de salida.
La separación del contenido y la presentación tiene grandes ventajas. Una hoja de estilos puede reutilizarse en todas las páginas de su sitio web, lo que les da uniformidad, facilita el mantenimiento y ahorra ancho de banda. Una misma o varias páginas web pueden ajustarse a diferentes necesidades simplemente cambiando la hoja de estilos. Así el autor puede tener un juego de hojas de estilo en su sitio web; una para cada necesidad: un diseño avanzado para el navegador, grandes contrastes para personas con necesidades especiales, estilos amigables para impresión en papel (printer friendly), etc. De esta forma, una misma página web puede verse en formas distintas sin cambiar la información que contiene.
Una hoja de estilos es un archivo de texto que contiene reglas de formateo de elementos utilizando un lenguaje especial conocido como hojas de estilo en cascada (CSS, Cascading Style Sheets), el cual es estándar y definido por el W3C. Por ejemplo, la siguiente regla hace que todos los títulos de un documento web sean de color verde:
h1, h2, h3, h4, h5, h6 { color: green; }
En general una regla CSS tiene la siguiente sintaxis:
selector { declaration }
El selector determina cuáles elementos serán afectados por los estilos definidos en la declaración, y puede ser uno o varios elementos separados por comas. La declaración es una lista de parejas propiedad: valor
que serán aplicadas a los elementos listados en el selector. Dichas parejas se separan por el símbolo punto y coma (;
). Es opcional terminar en punto y coma la última pareja. Con esto la sintaxis se expande a:
element1, element2, ..., elementN { property1: value1; property2: value2; ... propertyN: valueN; }
Es muy conveniente que escriba comentarios explicando la intención de cada regla, o al menos de aquellas no triviales. Los comentarios utilizan la misma notación del lenguaje de programación C:
/* Las definiciones deben estar en negritas y no en itálicas como ocurre en ciertos navegadores. Globalmente se usa verde para definiciones y títulos; azul para enlaces. */ dfn { font-weight: bold; font-style: normal; color: #004444; }
La recomendación (X)HTML permite declarar reglas de estilo en cinco lugares:
style
.style
..css
externo el cual se liga al documento con el elemento link
.De los cinco lugares para especificar estilos en la lista anterior, el Consorcio Web (W3C) desalienta el uso los dos primeros, ya que el documento web debe almacenar contenido únicamente, no estilos; y los dos últimos están fuera del control del autor. Por eso, se aconseja al autor declarar las reglas de estilo siempre en una o varias hojas de estilos .css
externas al documento web.
El listado css_locations muestra cómo declarar estilos en los tres lugares donde puede el autor. Supóngase que la línea 17 representa un archivo de texto con extensión .css
que contiene sólo una regla y se adjunta al documento web con el elemento link
en el encabezado del mismo (línea 4). Si dos o más hojas de estilo se incluyen en el encabezado, se procesarán en el mismo orden en que se incluyeron.
...Lorem ipsum ad his scripta blandit partiendo...
p { color: green } ]]>
El atributo media
del elemento link
indica si las reglas de estilo aplican a un medio específico, como la pantalla (screen
), la impresora (print
), programas de lectura sintetizada (aural
), computadoras de mano (handheld
), televisores (tv
) y otros. En el ejemplo anterior, un navegador cargará la hoja styles1.css
(línea 4) y los aplicará al documento web para ser visualizado en la pantalla. Si el usuario decide imprimir el documento, el navegador cargará styles2.css
(línea 5) y los aplicará en la copia que enviará a la impresora. El atributo media
es opcional, y si no se especifica en un elemento link
, se asume que esa hoja de estilos aplicará a todos los medios, lo que equivale a darle el valor media="all"
. El atributo media
puede contener varios valores separados por comas, de esta forma, una hoja de estilos puede aplicarse a varios medios simultáneamente.
El segundo lugar donde se pueden escribir reglas de estilo es en uno o varios elementos style
dentro del encabezado (head
) del documento (X)HTML, como se aprecia en las líneas 6 a 8 del listado css_locations. Nótese que el encabezado head
admite combinar hojas de estilo externas y elementos style
en cualquier orden. La especificación CSS indica que el navegador debe respetar este orden, de tal forma que las reglas de estilo que se encuentran en un archivo .css
, tienen el mismo efecto que si se escribiesen directamente en un elemento style
del encabezado.
El tercer lugar donde se puede especificar reglas de estilo es en el atributo style
del elemento mismo, como se hizo en la línea 12 del listado css_locations. En este caso, todas las propiedades aplicarán únicamente a dicho elemento por lo que no es necesario especificar un selector, ni agrupar las propiedades dentro de llaves { }
.
En vista de que hay cinco lugares opcionales donde se especifican estilos, puede ocurrir que para una propiedad no haya ninguna regla, o bien hayan varias. El navegador necesita un algoritmo que especifique cómo actuar en estos casos, al cual se le llama el principio de cascada y consta de otros tres principios.
Si dos o más reglas compiten para darle estilo a una misma propiedad, recibirá mayor prioridad aquella que tenga mayor especificidad en su selector. A esto se le llama principio de especificidad.
Si dos reglas compitiendo por la misma propiedad tienen igual especificidad, se tomará la que aparezca de último, es decir, tendrá más peso aquella que se encuentre más cerca del elemento. A esto se le llama el principio de ubicación.
Cuando por el contrario, no se especifican reglas para una propiedad, el navegador debe seguir un principio más, el principio de herencia, el cual indica que ante la ausencia de una regla de estilo, el navegador debe aplicar el estilo del elemento padre. No todos las propiedades son heredables por defecto. Por ejemplo, la fuente lo es pero no el margen. De esta forma, al asignar la fuente al elemento body
, todos los párrafos la heredan, lo cual es deseable; pero si se asigna un margen grande al body
para mantener una separación visual con los bordes de la ventana del navegador, sería indeseable si este borde se aplicara entre párrafo y párrafo.
El uso de los tres principios: ubicación, especificidad y herencia para determinar cuál regla debe aplicar a una propiedad de estilo de un elemento se conoce como principio de cascada. Los navegadores implementan este principio dándole puntos o pesos a cada regla de estilo siguiendo un cálculo propuesto en la especificación CSS, que cualitativamente se puede resumir en lo siguiente:
Ante la ausencia de una regla, el estilo se hereda del elemento padre si la propiedad es heredable, si no, se usa el estilo por defecto del navegador. Si dos o más reglas compiten por darle estilo a una misma propiedad, se tomará aquella con mayor especificidad de su selector, independientemente de dónde esté ubicada. Con dos reglas de igual especificidad, ganará la que aparezca de último.
A modo de ejemplo, el listado css_location_doc muestra un documento web que tiene dos párrafos y estilos definidos en tres lugares: una hoja de estilos externa (cascading1.css
) enlazada en la línea 4; un elemento style
en el encabezado (líneas 5 a 7), y un atributo style
en el segundo párrafo (línea 18). Se estudiará el efecto de estos estilos en tres propiedades: el color, la fuente y el margen.
Estilos en conflicto: cascada Este es el primer párrafo. Ninguna regla de estilo para
p
especifica la fuente, por lo que hereda la fuente de su elemento padrebody
. Aunque hay una hoja de estilos externa que especifica que el color del texto de los párrafos debe ser rojo, éste es verde azulado porque hay una regla en el encabezado del documento, que está más cerca de este párrafo.Este es el segundo párrafo. Tiene un atributo de estilo que sobrescribe el color del texto a verde, ya que por especificidad está más cerca del elemento. Ninguna regla de estilo formatea la separación vertical entre párrafos, por lo que se aplica la que el navegador tenga implementada internamente.