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.
/* 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ón | Qué introdujo |
|---|---|
| CSS 1 | Selectores básicos, modelo de caja, colores, texto, fuentes, pseudoclases y el propio mecanismo de cascada |
| CSS 2.x | Posicionamiento (absoluto, relativo, float, clear), tipos de medio (@media print, @media screen), capas con z-index, selectores avanzados y efectos |
| CSS 3 | Media 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 fuera | Qué es | Toma el fondo |
|---|---|---|
| content | El contenido: texto, imagen o cajas hijas | Sí |
| padding (relleno) | Espacio interior entre el contenido y el borde | Sí |
| border (borde) | La línea que delimita la caja | Es el propio borde |
| margin (margen) | Espacio exterior que separa esta caja de las demás | No: es transparente |
.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.
| Selector | A qué se aplica |
|---|---|
| * | Selector universal: a todos los elementos |
| p | A todos los elementos de esa etiqueta |
| #resumen | Al elemento cuyo id es resumen. El id es único en el documento |
| .superado | A todos los elementos que pertenezcan a esa clase |
| li.superado | Solo a los <li> que además tengan esa clase |
| h1, h2 | Agrupamiento: la coma une selectores independientes en una sola regla |
| nav a | Descendiente: a los <a> que estén dentro de un <nav>, a cualquier profundidad |
| nav > a | Hijo directo: solo si el <a> es hijo inmediato del <nav>, no nieto |
| h2 + p | Hermano adyacente: el <p> que va inmediatamente después del <h2> |
| h2 ~ p | Hermano 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.
/* 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.
- Importancia: se mira el origen de la declaración y si lleva !important.
- Especificidad: si la importancia empata, gana el selector más específico.
- Orden de aparición: si también empata la especificidad, gana la última declaración escrita.
| Especificidad, de más a menos | Ejemplo |
|---|---|
| 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 pseudoelementos | p, ::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.
/* 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 position | Respecto a qué se coloca |
|---|---|
| static | Valor por defecto: sigue el orden natural del documento y no admite desplazamientos |
| relative | Respecto a su propia posición estática; el hueco que dejaba se conserva |
| absolute | Respecto a su contenedor posicionado más cercano; sale del flujo y no deja hueco |
| fixed | Respecto a la ventana: se queda quieto aunque se haga scroll |
| sticky | Fluye 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.
| Unidad | Tipo | A qué equivale |
|---|---|---|
| cm, mm, in, pt, pc, Q | Absoluta | Medidas físicas: centímetro, milímetro, pulgada, punto, pica y cuarto de milímetro |
| px | Absoluta | El píxel de CSS, anclado a una fracción fija de pulgada |
| em | Relativa | El tamaño de fuente del elemento contenedor |
| rem | Relativa | El tamaño de fuente del elemento raíz, es decir de <html> |
| ex | Relativa | La altura de la equis de la fuente; aproximadamente la mitad de un em |
| ch | Relativa | El ancho del carácter cero de la fuente |
| % | Relativa | Un porcentaje de la medida correspondiente del contenedor |
| vw y vh | Relativa | La centésima parte del ancho y del alto de la ventana |
| vmin y vmax | Relativa | La 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.
@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.
<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 pseudoelemento | Qué selecciona |
|---|---|
| :hover, :active, :visited | Elemento bajo el ratón, elemento pulsado y enlace ya visitado |
| :required, :invalid, :empty | Campo 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 |
| :root | La raíz del árbol, que en HTML es <html>. Equivale al selector html pero con más especificidad |
| ::before y ::after | Contenido generado antes y después del contenido del elemento |
| ::first-line y ::first-letter | La 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.
: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