Saltar al contenido

CSS

Cómo se separa la presentación del contenido: el modelo de caja, los selectores, la cascada y la especificidad que deciden qué regla gana, la herencia, el posicionamiento y las unidades de medida.

Qué es CSS y qué aportó cada versión

CSS es un estándar del W3C con tipo MIME text/css. Su razón de ser es separar el contenido de la presentación: el HTML dice qué es cada cosa y el CSS dice cómo se ve. Gracias a esa separación se puede cambiar el aspecto entero de una web tocando un solo fichero, y se puede servir un aspecto distinto para pantalla y para impresión sin duplicar el contenido.

La sintaxis es siempre la misma: un selector que dice a qué elementos se aplica la regla, y entre llaves una lista de declaraciones de la forma propiedad dos puntos valor, separadas por punto y coma. El último punto y coma es opcional, pero se pone por costumbre para que añadir una línea después no obligue a tocar la anterior.

css
/* Un selector y tres declaraciones */
.tarjeta-tema {
  background: #f4f7f5;
  border-radius: 8px;
  box-shadow: 0 2px 6px rgba(0, 0, 0, 0.12);
}

/* Los prefijos de fabricante son propiedades experimentales de un motor
   concreto; hoy casi nunca hacen falta, pero salen en el temario. */
.tarjeta-tema {
  -webkit-box-shadow: 0 2px 6px rgba(0, 0, 0, 0.12);
  -moz-box-shadow: 0 2px 6px rgba(0, 0, 0, 0.12);
}
VersiónQué introdujo
CSS 1Selectores básicos, modelo de caja, colores, texto, fuentes, pseudoclases y el propio mecanismo de cascada
CSS 2.xPosicionamiento (absoluto, relativo, float, clear), tipos de medio (@media print, @media screen), capas con z-index, selectores avanzados y efectos
CSS 3Media queries y diseño adaptativo, troceado del estándar en módulos independientes, nuevas técnicas de maquetación (Flexbox, Grid, multicolumna), animaciones y más selectores

La novedad de CSS3 que más cambia la forma de trabajar no es visual sino organizativa: dejó de haber una especificación monolítica y el estándar se partió en módulos (selectores, colores, cascada, cajas, media queries, fondos), cada uno con su propio ritmo de avance. Por eso ya no tiene sentido hablar de «CSS 4»: cada módulo lleva su numeración.

Para el examen

  • Organismo y tipo MIME: W3C y text/css

  • Qué separa: contenido de presentación

  • Sintaxis: selector más declaraciones propiedad:valor

  • Desde CSS3: el estándar se reparte en módulos; por eso no hay «CSS 4»

El modelo de caja

En CSS todo elemento es una caja rectangular, y esa caja tiene cuatro capas concéntricas. En el centro está el contenido, que es el texto o la imagen. A su alrededor, el relleno o padding, que es espacio interior: sigue siendo parte de la caja y toma su color de fondo. Después el borde, que es la línea que la delimita. Y por fuera el margen, que es espacio exterior, transparente, y sirve para separar esta caja de las vecinas.

Capa, de dentro a fueraQué esToma el fondo
contentEl contenido: texto, imagen o cajas hijas
padding (relleno)Espacio interior entre el contenido y el borde
border (borde)La línea que delimita la cajaEs el propio borde
margin (margen)Espacio exterior que separa esta caja de las demásNo: es transparente
css
.tarjeta-tema {
  width: 300px;      /* ancho del contenido */
  padding: 16px;     /* relleno interior, con fondo */
  border: 2px solid #2f7d5b;
  margin: 24px;      /* separación exterior, transparente */
}

/* Con el modelo clásico esa tarjeta ocupa
   300 + 16*2 + 2*2 = 336 px de ancho visible.
   Con box-sizing: border-box el ancho declarado incluye
   relleno y borde, y la tarjeta mide 300 px en total. */
.tarjeta-tema {
  box-sizing: border-box;
}

El relleno va por dentro del borde y el margen por fuera. Si un fondo de color se está saliendo más de la cuenta, el culpable es el padding; si dos cajas se pegan, el que falta es el margin.

Para el examen

  • Relleno (padding): por DENTRO del borde

  • Margen (margin): por FUERA del borde

  • Diagnóstico: si el fondo se sale de la cuenta, es el padding; si dos cajas se pegan, falta margin

Los selectores

Un selector es el símbolo o la combinación de símbolos con la que se indica a qué conjunto de elementos del árbol del documento se aplica una regla. Es la parte de CSS que más se pregunta, porque además es la misma sintaxis que usan querySelector en JavaScript y varios frameworks de pruebas.

SelectorA qué se aplica
*Selector universal: a todos los elementos
pA todos los elementos de esa etiqueta
#resumenAl elemento cuyo id es resumen. El id es único en el documento
.superadoA todos los elementos que pertenezcan a esa clase
li.superadoSolo a los <li> que además tengan esa clase
h1, h2Agrupamiento: la coma une selectores independientes en una sola regla
nav aDescendiente: a los <a> que estén dentro de un <nav>, a cualquier profundidad
nav > aHijo directo: solo si el <a> es hijo inmediato del <nav>, no nieto
h2 + pHermano adyacente: el <p> que va inmediatamente después del <h2>
h2 ~ pHermano general: cualquier <p> posterior al <h2> con el mismo padre

Los selectores de atributo permiten filtrar por lo que valga un atributo, y son la base de las bibliotecas de componentes. Con E[atr] se cogen los elementos que tengan ese atributo definido, sea cual sea su valor, lo que en la práctica sirve para detectar marcado incompleto. Con E[atr^="algo"] los que empiecen por ese texto, con E[atr$="algo"] los que terminen en él, con E[atr*="algo"] los que lo contengan, y con E[atr~="algo"] aquellos cuyo valor sea una lista separada por espacios y contenga esa palabra completa.

css
/* Todos los enlaces del panel lateral, a cualquier profundidad */
aside a { color: #2f7d5b; }

/* Solo los enlaces que cuelgan directamente del menú */
nav > a { font-weight: 600; }

/* El párrafo que va justo detrás de cada título de subtema */
h2 + p { font-size: 1.1rem; }

/* Temas ya superados y temas todavía pendientes */
li[data-estado="superado"]  { opacity: 0.6; }
li[data-estado^="pend"]     { font-weight: bold; }

/* Enlaces a documentos PDF del temario */
a[href$=".pdf"]::after { content: " (PDF)"; }

Esa misma sintaxis se usa desde JavaScript con la API Selectors: document.querySelector devuelve el primer elemento que cumpla la condición y document.querySelectorAll devuelve todos, en forma de lista de nodos.

Para el examen

  • * y #: universal y por id

  • . y la coma: por clase y agrupación

  • Espacio y >: descendiente e hijo directo

  • + y ~: hermano adyacente y hermano general

  • Dónde más se usa: la misma sintaxis vale en querySelector

La cascada, la especificidad y la herencia

La cascada es el mecanismo que resuelve los conflictos: cuando dos o más reglas quieren fijar la misma propiedad del mismo elemento, hay que decidir cuál gana. La decisión se toma en tres pasadas, y solo se pasa a la siguiente si la anterior queda empatada.

  1. Importancia: se mira el origen de la declaración y si lleva !important.
  2. Especificidad: si la importancia empata, gana el selector más específico.
  3. Orden de aparición: si también empata la especificidad, gana la última declaración escrita.
Especificidad, de más a menosEjemplo
Estilos en línea, en el atributo style<p style="color: red">
Identificadores#resumen
Clases, pseudoclases y selectores de atributo.superado, :hover, [data-nivel]
Etiquetas y pseudoelementosp, ::first-line

La declaración !important salta por encima de todo eso: fuerza a que esa declaración gane aunque su selector sea menos específico. Dentro del propio !important el orden de importancia va, de más fuerte a más débil, del !important del usuario al !important del autor, luego la declaración normal del autor, la del usuario y por último la del navegador. Por eso, un !important puesto por el usuario para agrandar la letra por accesibilidad no se lo puede pisar la web.

css
/* Especificidad de menos a más: gana el último de estos tres
   para el <li id="tema-7" class="superado"> */
li              { color: #333; }   /* etiqueta      */
.superado       { color: green; }  /* clase         */
#tema-7         { color: navy; }   /* identificador */

/* Empate de especificidad: gana la última escrita */
.superado { color: green; }
.superado { color: teal; }   /* esta es la que se aplica */

La herencia es otro mecanismo distinto y conviene no mezclarlo con la cascada: consiste en que ciertas propiedades de un elemento padre se transmiten solas a sus hijos sin necesidad de repetirlas. Heredan las propiedades relacionadas con el texto (las de la familia font-, color, las de la familia text-, line-height) y no heredan las que tienen que ver con la caja, como los márgenes, los bordes o el fondo. Cuando hace falta forzar la herencia de una propiedad que no la tiene, se le da el valor inherit.

Cascada es «qué regla gana cuando varias chocan». Herencia es «qué se transmite del padre al hijo cuando no hay ninguna regla». Son preguntas distintas y se confunden en el examen.

Para el examen

  • Cascada: qué regla gana cuando varias chocan

  • Herencia: qué se transmite del padre al hijo cuando no hay ninguna regla

  • Aviso: son preguntas distintas

Posicionamiento, display y visibilidad

La propiedad position decide respecto a qué se coloca una caja. Sus valores se acompañan de los desplazamientos top, bottom, left y right, y de z-index, que ordena las cajas en profundidad: el eje Z crece hacia el usuario, de modo que a mayor z-index más cerca queda la caja y más tapa a las demás.

Valor de positionRespecto a qué se coloca
staticValor por defecto: sigue el orden natural del documento y no admite desplazamientos
relativeRespecto a su propia posición estática; el hueco que dejaba se conserva
absoluteRespecto a su contenedor posicionado más cercano; sale del flujo y no deja hueco
fixedRespecto a la ventana: se queda quieto aunque se haga scroll
stickyFluye con el documento hasta llegar a un límite y a partir de ahí se queda pegado sin desaparecer

Aparte de position están las dos propiedades de flotación clásicas. float con valor left o right saca un elemento del flujo normal y lo pega a un lado de su contenedor, dejando que el texto lo rodee. clear con valor left, right o both indica que un elemento no admite flotantes a su lado y lo empuja por debajo de ellos.

La propiedad display decide qué tipo de caja genera un elemento. Los valores clásicos son block, que ocupa todo el ancho y va en línea nueva; inline, que fluye dentro del texto y no admite ancho ni alto; inline-block, que fluye como el texto pero sí admite dimensiones; y none, que hace que el elemento no se renderice en absoluto. Los valores modernos son flex y grid, los dos modelos de maquetación de CSS3.

display: none quita el elemento y también su hueco, como si no existiera. visibility: hidden lo hace invisible pero le deja el hueco reservado. Es la comparación clásica de esta parte.

Para el examen

  • display: none: quita el elemento y su hueco

  • visibility: hidden: lo hace invisible, pero le reserva el hueco

Unidades de medida, fuentes y texto

CSS distingue unidades absolutas, cuyo valor no depende de nada, y unidades relativas, cuyo valor depende de otra medida. Las absolutas sirven para impresión; para pantalla, donde el tamaño de la ventana y las preferencias del usuario varían, se usan casi siempre las relativas.

UnidadTipoA qué equivale
cm, mm, in, pt, pc, QAbsolutaMedidas físicas: centímetro, milímetro, pulgada, punto, pica y cuarto de milímetro
pxAbsolutaEl píxel de CSS, anclado a una fracción fija de pulgada
emRelativaEl tamaño de fuente del elemento contenedor
remRelativaEl tamaño de fuente del elemento raíz, es decir de <html>
exRelativaLa altura de la equis de la fuente; aproximadamente la mitad de un em
chRelativaEl ancho del carácter cero de la fuente
%RelativaUn porcentaje de la medida correspondiente del contenedor
vw y vhRelativaLa centésima parte del ancho y del alto de la ventana
vmin y vmaxRelativaLa centésima parte del lado menor y del lado mayor de la ventana

La diferencia entre em y rem es la que más se pregunta: em se acumula, porque cada nivel se mide sobre su padre, de modo que tres cajas anidadas a 1.2em multiplican el tamaño tres veces; rem siempre se mide sobre la raíz, así que no se acumula y es más predecible.

Para las tipografías, la regla @font-face permite instalar en la página una fuente que el usuario no tiene, indicando dónde descargarla con src y qué nombre le damos con font-family. El formato pensado para la web es WOFF (Web Open Font Format), que comprime la fuente para que viaje ligera; por debajo, las tipografías escalables son OpenType, el formato moderno, y TrueType, el antiguo.

css
@font-face {
  font-family: "Corte Sans";
  src: local("Corte Sans"),
       url("/fuentes/corte-sans.woff2") format("woff2");
}

:root { font-size: 16px; }

.titulo-subtema {
  font-family: "Corte Sans", sans-serif;
  font-size: 1.5rem;      /* 24px: siempre sobre la raíz */
  font-style: normal;
  font-weight: 600;       /* el grosor del trazo */
  line-height: 1.4;
  text-transform: uppercase;
  letter-spacing: 0.02em;
}

/* Comentarios: en CSS con barra asterisco; en HTML con <!-- --> */
  • letter-spacing y word-break: separación entre letras y dónde se permite partir una palabra.
  • line-height y text-indent: altura de línea y sangría de la primera línea.
  • text-align y text-transform: alineación y paso a mayúsculas o minúsculas.
  • text-decoration: subrayado, tachado o ninguno.
  • text-overflow y hyphens: qué hacer cuando el texto no cabe y si se permite partir con guion.

Para el examen

  • Absolutas: cm, mm, in, pt, pc y px

  • em y rem: la fuente del contenedor y la fuente de la raíz

  • Otras relativas: ex, ch y el porcentaje

  • Respecto de la ventana: vw, vh, vmin y vmax

Dónde se escribe la hoja, pseudoclases, variables y media queries

Hay tres sitios donde puede vivir el CSS, y se diferencian en su alcance. La hoja externa es un fichero .css enlazado desde <head> con <link rel="stylesheet">, y es la única que sirve a varias páginas a la vez. La hoja interna va dentro de una etiqueta <style> en la cabecera del propio documento y solo afecta a esa página. Y el estilo en línea va en el atributo style de una etiqueta concreta: como ya sabe a qué elemento se aplica, ahí no se escribe selector.

html
<head>
  <!-- Externo: un fichero para toda la web -->
  <link rel="stylesheet" href="/css/temario.css">

  <!-- Interno: solo para esta página -->
  <style>
    .aviso-intento { color: crimson; }
  </style>
</head>
<body>
  <!-- En línea: solo para esta etiqueta, y sin selector -->
  <p style="font-weight: bold">Te queda un intento.</p>
</body>

Una pseudoclase describe un estado del elemento y se escribe con dos puntos. Un pseudoelemento describe una parte del elemento y se escribe con dos puntos dobles: esa doble notación es justamente lo que los distingue en el examen.

Pseudoclase o pseudoelementoQué selecciona
:hover, :active, :visitedElemento bajo el ratón, elemento pulsado y enlace ya visitado
:required, :invalid, :emptyCampo obligatorio, campo con valor incorrecto y elemento sin contenido
:first-child, :nth-child(n)El primer hijo y el hijo que ocupa la posición n
:not(selector)Los elementos que NO cumplen ese selector
:lang(es)Los elementos marcados en ese idioma
:rootLa raíz del árbol, que en HTML es <html>. Equivale al selector html pero con más especificidad
::before y ::afterContenido generado antes y después del contenido del elemento
::first-line y ::first-letterLa primera línea y la primera letra de un párrafo

Las custom properties, o variables de CSS, se declaran con dos guiones delante del nombre y se leen con la función var(). Se suelen declarar en :root para que estén disponibles en todo el documento, y como son propiedades normales, se heredan y se pueden redefinir en un contenedor concreto.

css
:root {
  --verde-corte: #2f7d5b;
  --radio-tarjeta: 8px;
}

.tarjeta-tema {
  border: 2px solid var(--verde-corte);
  border-radius: var(--radio-tarjeta);
}

/* Media query: la maquetación de dos columnas solo a partir
   de 700 px de ancho de ventana */
@media screen and (min-width: 700px) {
  .panel-temario { display: grid; grid-template-columns: 1fr 3fr; }
}

/* Y una hoja distinta al imprimir */
@media print {
  nav, aside { display: none; }
}

Las media queries son la pieza con la que CSS3 hizo posible el diseño adaptativo. La regla @media combina un tipo de medio (screen, print, all) con una o varias características del dispositivo, como min-width o max-width, mediante los operadores and, not y only, y aplica el bloque solo cuando la condición se cumple. Con ellas, la misma hoja de estilo sirve para un móvil y para un monitor.

Para el examen

  • Los tres sitios para el CSS: hoja externa, interna en style y en línea en el atributo style

  • La de en línea: no lleva selector

  • Pseudoclase: dos puntos: describe un estado

  • Pseudoelemento: dos puntos dobles: describe una parte