Skip to content
This page has been auto-translated and may contain errors.View in English

Cómo funciona CSS

docs.scrimba.com

Una página HTML simple llega con las opiniones propias del navegador ya aplicadas: enlaces azules subrayados, texto sin serifa de color negro, encabezados que disminuyen de tamaño. CSS es cómo tomas esa estructura cruda y decides cómo debería verse en su lugar. Antes de que puedas cambiar un solo color o mover una sola caja, sin embargo, necesitas saber cómo tus estilos llegan a la página en primer lugar, y qué sucede cuando dos de tus reglas no están de acuerdo sobre el mismo elemento.

Adjuntar CSS a una página

Hay tres formas de agregar CSS a una página, y la diferencia es principalmente sobre dónde escribes los estilos.

La primera es un estilo en línea, escrito directamente en el elemento con un atributo style:

html
<p style="color: teal;">Un párrafo verde azulado único.</p>

Eso estiliza un párrafo y nada más. La segunda forma es un bloque interno <style> en el <head> de la página, que puede estilizar muchos elementos a la vez. La tercera, y la que deberías usar, es un archivo separado de CSS vinculado a la página. Escribes tus estilos una vez en ese archivo, y cada página que se vincula a él los recibe. Piénsalo como un guardarropa: en lugar de describir un atuendo en cada persona uno por uno, escribes el código de vestimenta una vez y todos lo siguen.

CSS llega a una página de tres formas, y no son iguales. Un estilo en línea vive en el elemento mismo en un atributo style y afecta solo a ese elemento. Una hoja de estilos interna es un bloque <style> en el <head> que puede apuntar a elementos en toda la página. Una hoja de estilos externa es un archivo .css vinculado desde el <head>:

html
<link rel="stylesheet" href="styles.css">

Opta por la hoja de estilos externa como predeterminada. Mantiene tu estilo en un solo lugar en lugar de disperso a través del marcado, así que la estructura permanece en HTML y la presentación permanece en CSS, la misma separación descrita en qué es CSS. El navegador también almacena en caché el archivo, por lo que un visitante que se mueve entre páginas descarga tus estilos una vez y los reutiliza, y escribes una regla como tu estilo de botón una sola vez en lugar de copiarlo en cada botón.

Tres mecanismos adjuntan CSS, y cada uno se asigna a un lugar en la cascada que conocerás más adelante en este capítulo. Un estilo en línea (un atributo style en el elemento) se aplica solo a ese elemento y lleva un peso muy alto en los conflictos, que es exactamente por qué depender de él te daña: es difícil de sobrescribir de forma limpia desde una hoja de estilos. Un bloque <style> interno se limita a un documento. Una hoja de estilos externa, vinculada con <link rel="stylesheet">, es el estándar de producción por razones más allá del orden.

Los archivos externos te dan tres cosas a la vez: separación de responsabilidades, así que el marcado y el estilo cambian independientemente; almacenamiento en caché HTTP, así que un visitante que regresa reutiliza el archivo ya descargado en cada página en lugar de recuperar estilos incrustados en cada respuesta HTML; y reutilización, así que una regla creada sirve a un sitio completo. El compromiso es una solicitud separada, que es por qué a veces se insertan en línea estilos críticos muy pequeños para la primera pintura, pero la regla general se mantiene: crea en una hoja de estilos externa y trata los estilos en línea como una excepción dirigida, no un hábito.

Aquí está el enfoque externo en su totalidad: un archivo HTML que vincula una hoja de estilos, y la hoja de estilos misma.

html
<!-- index.html -->
<head>
  <link rel="stylesheet" href="styles.css">
</head>
<body>
  <p class="intro">Bienvenido al sitio.</p>
</body>
css
/* styles.css */
.intro {
  color: teal;
  font-size: 1.25rem;
}
JunoAdjuntar CSS a una página Hay tres formas de agregar CSS: en el elemento con style, en un bloque <style>, o en un archivo separado que vinculas con <link>. Usa el archivo separado. Escribes tus estilos una vez y cada página que se vincula a él se ve igual.
JunoAdjuntar CSS a una página Los estilos en línea afectan a un elemento, un bloque <style> cubre una página, y un archivo externo .css cubre tu sitio completo. Opta por el archivo externo: mantiene la presentación fuera de tu marcado, el navegador lo almacena en caché, y una regla sirve a cada elemento coincidente. Los estilos en línea son la excepción, no la rutina.
JunoAdjuntar CSS a una página Crea en una hoja de estilos externa: separación, almacenamiento en caché y reutilización en un movimiento. Los estilos en línea tienen un peso pesado en la cascada, por lo que duelen al ser sobrescritos después; mantenlos como una excepción deliberada. La única vez que se debe insertar en línea es un bloque pequeño de estilos críticos para la primera pintura, y aun así la mayor parte de tu CSS permanece en el archivo vinculado.

La anatomía de una regla

Un fragmento de CSS se escribe como una regla, y cada regla tiene la misma forma. Aquí hay una que estiliza una tarjeta:

css
.card {
  color: navy;
  padding: 16px;
}

El .card al frente es el selector: elige qué elementos se aplica la regla, en este caso cualquier cosa con la clase card. Todo dentro de las llaves es el bloque de declaración. Cada línea dentro, como color: navy;, es una declaración: una propiedad (color) y el valor que quieres que tenga (navy), separados por dos puntos y terminados con un punto y coma. Lee la regla completa como una oración: "para cada tarjeta, haz el color azul marino y el relleno de 16 píxeles".

Cada regla se construye a partir de las mismas partes, y nombrarlas hace que el resto de CSS sea más fácil de hablar.

css
.card {
  color: navy;
  padding: 16px;
}

El selector (.card) elige los elementos que apunta la regla. Las llaves contienen el bloque de declaración. Dentro de él, cada par property: value; es una declaración: color es la propiedad, navy es el valor, los dos puntos los unen y el punto y coma los termina. El punto y coma es un separador entre declaraciones, por lo que la última técnicamente no la necesita, pero mantenla de todas formas: agregar la siguiente declaración después se convierte en un cambio de una línea en lugar de dos. Qué elementos coinciden con un selector y qué tan específico es, es el tema del capítulo de selectores.

La gramática es pequeña y vale la pena establecerla con precisión, porque cada concepto posterior se define en estos términos. Una regla es un selector (el patrón que decide a qué elementos se aplica la regla) seguido de un bloque de declaración (las llaves). Dentro del bloque hay una lista de declaraciones, cada una una propiedad emparejada con un valor por dos puntos y terminada por un punto y coma.

css
.card {
  color: navy;
  padding: 16px;
}

La precisión aquí da frutos en la depuración. Una declaración mal formada, digamos una propiedad mal escrita o un valor inválido, es descartada por el analizador por su cuenta, y el resto del bloque aún se aplica; CSS falla por declaración, no por regla, que es por qué un único error ortográfico silenciosamente elimina una línea en lugar de romper toda la tarjeta. El punto y coma es un separador, no un terminador, por lo que es opcional después de la declaración final, pero mantenerlo evita una regla rota el día que anexes otra línea y olvides agregarla arriba. Cuando encuentres la cascada a continuación, recuerda que "qué declaración gana" siempre opera a este nivel de declaración, propiedad por propiedad.

JunoLa anatomía de una regla Una regla es un selector más un conjunto de declaraciones entre llaves. El selector como .card elige los elementos, y cada declaración como color: navy; es una propiedad y un valor con dos puntos entre ellos y un punto y coma al final. Una vez que puedas nombrar esas partes, cada regla que leas se verá igual.
JunoLa anatomía de una regla Selector, bloque de declaración, y declaraciones property: value; dentro de él: eso es cada regla. El punto y coma separa declaraciones, así que mantenlo en la última también y agregar la siguiente línea sigue siendo una edición de una línea. Cómo los selectores coinciden y qué tan específicos son viene después en el capítulo de selectores.
JunoLa anatomía de una regla Una regla es un selector y un bloque de declaraciones property: value;, y CSS falla por declaración: una línea inválida es eliminada, el resto del bloque sobrevive. Por eso un error ortográfico extraño silenciosamente elimina un único estilo en lugar de romper la tarjeta. Mantén el punto y coma final y anexar una declaración nunca te muerde.

La cascada

A veces dos reglas intentan estilizar el mismo elemento, y CSS necesita una forma de decidir cuál gana. Esa decisión es la cascada, y es de donde viene la C en CSS.

css
.card {
  color: navy;
}

.card {
  color: teal;
}

Ambas reglas apuntan a la tarjeta y ambas establecen el color. La tarjeta termina siendo verde azulado, porque cuando dos reglas tienen la misma fuerza, la escrita después gana. El orden importa, y fluye hacia abajo en el archivo como agua, que es de donde viene el nombre cascada. También hay un segundo criterio de desempate: un selector más específico vence a uno más general, así que una regla dirigida precisamente a tu tarjeta puede anular una regla más amplia incluso si la más amplia viene después. Conocerás esa especificidad en detalle en el capítulo de selectores.

Cuando varias reglas establecen la misma propiedad en el mismo elemento, la cascada es el proceso que elige un ganador. Dos factores lo deciden aquí: especificidad y orden de fuente.

css
.card {
  color: navy;
}

.card {
  color: teal;
}

Estas dos reglas tienen especificidad idéntica, por lo que el orden de fuente rompe el empate y la regla posterior gana: la tarjeta es verde azulado. Cuando la especificidad difiere, sin embargo, toma prioridad sobre el orden: un selector más específico vence a uno más general incluso cuando la regla general viene después en el archivo. Más específico gana; en un empate de especificidad, lo posterior gana. Esto es por qué apilar sobrescrituras al final de un archivo es un hábito frágil, y por qué entender la especificidad del capítulo de selectores es lo que hace que la cascada sea predecible en lugar de un juego de adivinanzas.

La cascada es el algoritmo que resuelve declaraciones en competencia para una propiedad en un elemento, y se ejecuta a través de un conjunto ordenado de criterios hasta que queda una declaración en pie.

css
.card {
  color: navy;
}

.card {
  color: teal;
}

Los dos criterios más comunes son especificidad (un peso que el navegador calcula del selector) y orden de fuente (lo posterior gana en un empate), y el ejemplo anterior gira en torno al segundo: especificidad igual, por lo que lo posterior teal gana. Pero esos dos se encuentran dentro de un ordenamiento más grande. La cascada primero ordena por origen e importancia: estilos predeterminados del navegador, luego tus estilos de autor, luego cualquier estilo de usuario, con una capa normal versus importante arriba. Una declaración marcada con !important salta a una banda más alta, que es precisamente por qué existe y precisamente por qué evitarla. !important gana al salir del ordenamiento normal en lugar de ser correcto, por lo que no es una sobrescritura sino una salida de emergencia, y una vez que aparece un !important, la siguiente corrección es a menudo otra. Úsalo solo para derrotar estilos que no controlas, como un estilo en línea o un widget de terceros, y de otra forma deja que la especificidad y el orden hagan el trabajo. Cuando conozcas el modelo de caja y comiences a apilar muchas reglas, este ordenamiento es lo que mantiene el resultado predecible.

JunoLa cascada La cascada es cómo CSS resuelve una pelea cuando dos reglas estilizan lo mismo. Si las reglas son igualmente fuertes, la escrita después gana, por lo que el orden cuenta. Un selector más específico también puede ganar sobre uno más general, y esa parte viene en el capítulo de selectores.
JunoLa cascada Cuando las reglas chocan, la especificidad decide primero y el orden de fuente rompe el empate: lo más específico gana, y en un partido parejо la regla posterior gana. Apilar sobrescrituras al final de un archivo funciona hasta que no, que es por qué el capítulo de selectores sobre especificidad vale la pena leer antes de confiar en la cascada.
JunoLa cascada La cascada ordena por origen e importancia primero, luego especificidad, luego orden de fuente, y resuelve esto por propiedad. !important gana al saltar bandas, no por ser correcto, así que trata como una salida de emergencia para estilos que no controlas, nunca una sobrescritura rutinaria. Un !important tiende a reproducir el siguiente.

Herencia

Establece un color en una caja y el texto dentro a menudo se vuelve ese color también, aunque nunca estilizaste directamente ese texto. Ese pasar hacia abajo se llama herencia.

css
.site-header {
  color: white;
  font-family: Georgia, serif;
}

Cada fragmento de texto dentro del encabezado, un encabezado, un enlace, una línea de captura, recibe ese color blanco y esa fuente sin una regla propia, porque color y font-family son propiedades heredadas. No todo pasa hacia abajo, sin embargo. Las propiedades de espaciado como padding no se heredan: el relleno que pones en el encabezado permanece en el encabezado y no aparece en los elementos dentro de él. Como guía aproximada, los estilos relacionados con el texto fluyen hacia los hijos, y los estilos relacionados con cajas como espaciado y bordes permanecen en su lugar.

Algunas propiedades pasan su valor a elementos descendientes automáticamente, y algunas no. Ese comportamiento es herencia, y saber qué propiedades se heredan te ahorra muchas reglas repetidas.

css
.site-header {
  color: white;
  font-family: Georgia, serif;
}

Las propiedades relacionadas con el texto se heredan: color, font-family, font-size, line-height, y similares todas fluyen a los descendientes, por lo que establecerlas una vez en un contenedor estiliza todo dentro de él. Las propiedades relacionadas con la caja no: padding, margin, border, y background se aplican solo al elemento en el que las estableces. Cuando quieras que un valor se herede que normalmente no lo haría, la palabra clave inherit lo fuerza, tomando el valor calculado de la propiedad del padre. La herencia y la cascada son sistemas separados que funcionan juntos: la cascada decide la declaración ganadora para un elemento, y la herencia es a lo que un hijo regresa cuando ninguna regla establece esa propiedad en él en absoluto. La tipografía se apoya mucho en esto, que el capítulo de tipografía desarrolla.

La herencia es el mecanismo por el cual una propiedad sin un valor en cascada en un elemento toma su valor del padre de ese elemento. Cada propiedad CSS se define como heredada o no: la mayoría de las propiedades de texto (color, font-family, font-size, line-height, text-align) se heredan; la mayoría de las propiedades de caja (padding, margin, border, background) no, porque heredar espaciado en cada descendiente sería inutilizable.

css
.site-header {
  color: white;
  font-family: Georgia, serif;
}

Cuatro palabras clave explícitas controlan esto por declaración cuando los valores predeterminados no son lo que deseas: inherit toma el valor calculado del padre incluso en una propiedad no heredada, initial se reinicia al valor predeterminado de la especificación de la propiedad, unset actúa como inherit para propiedades heredadas e initial para el resto, y revert se revierte al estilo predeterminado del navegador. La imagen más grande es que la herencia y la cascada juntas producen el valor calculado de un elemento: la cascada selecciona una declaración ganadora donde existe una, y donde no existe, una propiedad heredada se dibuja de su padre mientras que una no heredada cae a su valor inicial. Ese valor calculado único por propiedad, por elemento es lo que el diseño y la pintura realmente consumen, y el capítulo de propiedades personalizadas se apoya directamente en la herencia para hacer que los tokens de diseño fluyan a través de un árbol de componentes.

JunoHerencia La herencia es que los estilos de texto fluyan hacia los elementos dentro de una caja: establece color o font-family en un encabezado y el texto dentro lo recibe gratis. El espaciado como padding no pasa hacia abajo, permanece donde lo pusiste. Regla aproximada: los estilos de texto viajan a los hijos, los estilos de caja permanecen en su lugar.
JunoHerencia Las propiedades de texto como color y font-family se heredan a los descendientes; las propiedades de caja como padding y border no. Estiliza un contenedor una vez y todo lo relacionado con el texto dentro lo sigue. Cuando necesites un valor que normalmente no se heredaría, la palabra clave inherit lo extrae del padre.
JunoHerencia Cada propiedad se hereda o no por definición: las propiedades de texto se heredan, las propiedades de caja no. Las palabras clave inherit, initial, unset, y revert te permiten sobrescribir eso por declaración. La herencia y la cascada juntas resuelven un valor calculado por propiedad por elemento, y ese valor es lo que el diseño y la pintura realmente usan.