🎨 Curso CSS · Nivel N3 Intermedio

Bloque 3: Interfaces pro

El salto de «funciona» a «enamora». Aprenderás a mantener tu CSS con variables, a dar vida a la interfaz con transiciones y animaciones, y a rematar cada componente con sombras, degradados y filtros dignos de un producto comercial.

⏱ ≈ 9 horas 📚 4 lecciones ✍️ 12 ejercicios guiados 📝 Examen final superable (≥ 70 %)
Lección 1 · Teoría

Variables CSS: tu propia paleta

Las variables CSS (custom properties) guardan valores reutilizables: colores, espaciados, radios… Cambias un valor en un único sitio y toda la web se actualiza. Es la diferencia entre mantener un proyecto… o sufrirlo.

declarar y usar
:root {
  /* se declaran con DOS guiones */
  --color-primario: #6c5ce7;
  --color-texto: #22223b;
  --espacio: 16px;
}

.boton {
  /* y se consumen con var() */
  background: var(--color-primario);
  padding: var(--espacio);
}

1.1 · Por qué :root

:root apunta a la raíz del documento (el <html>) con la máxima especificidad posible para un selector de tipo. Definiendo ahí tus variables las haces globales: visibles en toda la página.

1.2 · Herencia y temas

Las variables se heredan, así que puedes redefinirlas en una rama del DOM y todo su descendiente cambiará. Así se hacen los temas claro/oscuro:

tema por defecto
:root {
  --fondo: #ffffff;
  --texto: #111111;
}
body {
  background: var(--fondo);
  color: var(--texto);
}
✅ tema oscuro: solo redefinir
body.oscuro {
  --fondo: #121212;
  --texto: #f1f1f1;
}
/* cero reglas extra: todo lo que usaba
   var(--fondo) cambia solo */

1.3 · Detalles que marcan nivel

fallback + calc()
.card {
  /* segundo argumento = valor si la variable no existe */
  font-family: var(--fuente-marca, Arial);

  /* se combinan perfectamente con calc() */
  padding: calc(var(--espacio) * 2);
}
💡 Nombra por propósito, no por color: --color-peligro mejor que --rojo. El día que el rojo sea naranja, el nombre seguirá teniendo sentido.
Lección 2 · Teoría

Transiciones y transformaciones

2.1 · transform: mover sin molestar al layout

Funciones de transformación
FunciónEfectoEjemplo
translate(x, y)Desplaza desde su sitiotranslateY(-6px)
scale(n)Escala (1 = tamaño original)scale(1.05)
rotate(deg)Rotarotate(45deg)
skew(deg)InclinaskewX(-10deg)
se combinan separadas por espacios
.tarjeta:hover {
  transform: translateY(-8px) scale(1.03);
}
⚠️ Las transformaciones sacan el elemento de su caja lógica sin reflow: nada alrededor se mueve. Es lo que las hace tan fluidas — junto con opacity, son las propiedades que mejor «animan».

2.2 · transition: interpolar estados

transition suaviza cualquier cambio entre dos estados (normalmente provocado por :hover, :focus o una clase). Se declara en el estado base, no solo en el hover:

la receta del botón moderno
.btn {
  background: #6c5ce7;
  transition: transform .25s ease, box-shadow .25s ease;
}
.btn:hover {
  transform: translateY(-2px);
  box-shadow: 0 8px 20px rgba(108, 92, 231, .4);
}
Anatomía del shorthand
ParteEjemploSignificado
Propiedadtransform / allQué se anima (mejor concreta que all)
Duración.3s / 300msCuánto tarda — imprescindible
Timingease, linear, ease-in-out, cubic-bezier(...)Curva de aceleración
Delay.1sEspera antes de empezar (opcional)
💡 Duraciones sanas: micro-interacciones 150–300ms, movimientos grandes 400–600ms. Más rápido parece un error; más lento, lentitud web.
Lección 3 · Teoría

Animaciones con @keyframes

Las transiciones van bien para reaccionar; las animaciones permiten que algo se mueva solo, en bucle o al cargarse. Primero defines los pasos con @keyframes y luego los aplicas con animation:

badge que late
@keyframes pulso {
  from { transform: scale(1); }
  to   { transform: scale(1.15); }
}

.badge {
  animation: pulso 1s ease-in-out infinite alternate;
}

3.1 · Pasos por porcentajes

más de dos pasos
@keyframes nudge {
  0%   { transform: translateX(0); }
  25%  { transform: translateX(-6px); }
  75%  { transform: translateX(6px); }
  100% { transform: translateX(0); }
}
Propiedades de animation
PropiedadHace
animation-nameQué keyframes ejecuta
animation-durationDuración de cada ciclo
animation-iteration-countVeces que repite (infinite = sin fin)
animation-directionalternate reproduce ida y vuelta
animation-fill-modeforwards conserva el estado final
animation-play-statepaused/running — pausa elegante en hover
pausar al pasar el ratón
.banner:hover {
  animation-play-state: paused;
}
⚠️ Si defines transform tanto en una animación como en :hover, la animación gana (mientras dure). No mezcles ambas sobre la misma propiedad en el mismo elemento.
Lección 4 · Teoría

Efectos pro: sombras, degradados y filtros

4.1 · Sombras con intención

box-shadow y text-shadow
.tarjeta {
  /* x  y  difuminado  expansión  color */
  box-shadow: 0 14px 34px rgba(40, 20, 120, .18);
}
h1 {
  text-shadow: 2px 2px 4px rgba(0, 0, 0, .35);
}

Sombra suave, difusa y poco opaca = profundidad realista. Sombra dura y negra al 100 % = año 2005.

4.2 · Degradados

linear-gradient
.hero {
  background: linear-gradient(
    160deg,
    #6c5ce7,
    #00cec9);
}
radial-gradient
.spotlight {
  background: radial-gradient(
    circle at center,
    #ffd166,
    transparent 70%);
}

4.3 · Filtros

filter y backdrop-filter
.galeria img {
  filter: grayscale(1);          /* blanco y negro */
}
.galeria img:hover {
  filter: grayscale(0) saturate(1.2);
}

/* cristal esmerilado (glassmorphism) */
.modal {
  backdrop-filter: blur(8px);
}
  • blur(px) desenfoca · brightness() aclara · saturate() intensifica color.
  • filter afecta al propio elemento; backdrop-filter, a lo que hay detrás.
  • Ambos admiten transición — combínalos con :hover.
💡 La fórmula de tarjeta premium: fondo degradado sutil + sombra difusa + border-radius generoso + transición en hover. Cuatro líneas, efecto profesional.
Práctica guiada

✍️ Los 12 ejercicios del bloque

Crea la carpeta css-b3/ y resuelve en orden: cada ejercicio usa lo aprendido en los anteriores.

1 Paleta centralizada

Define en :root tres variables (--color-primario, --color-texto, --espacio) y úsalas en un botón y un párrafo.

Ver solución
:root {
  --color-primario: #6c5ce7;
  --color-texto: #22223b;
  --espacio: 16px;
}
.btn  { background: var(--color-primario); padding: var(--espacio); }
p     { color: var(--color-texto); }

2 Tema oscuro instantáneo

Redefine tus variables dentro de body.oscuro para invertir fondo y texto sin tocar ninguna otra regla.

Ver solución
body.oscuro {
  --color-texto: #f1f1f1;
  /* añade aquí las que necesites */
}

3 Red de seguridad con fallback

Usa una variable que aún no existe pero con valor de respaldo, para que el diseño no se rompa jamás.

Ver solución
.marca {
  font-family: var(--fuente-marca, "Segoe UI", Arial);
}

4 Botón que respira

Un botón cuyo fondo cambia al pasar el ratón, con una transición suave de 300ms.

Ver solución
.btn {
  background: var(--color-primario);
  transition: background .3s ease;
}
.btn:hover { background: #4834d4; }

5 Tarjeta que se eleva

Al hacer hover, la tarjeta sube 6px y crece un 2 % con sombra más intensa. Todo debe interpolarse, no saltar.

Ver solución
.tarjeta {
  transition: transform .3s ease, box-shadow .3s ease;
  box-shadow: 0 4px 10px rgba(0, 0, 0, .12);
}
.tarjeta:hover {
  transform: translateY(-6px) scale(1.02);
  box-shadow: 0 14px 28px rgba(0, 0, 0, .22);
}

6 Subrayado que crece

Enlace con un pseudo-elemento ::after que pasa de ancho 0 al 100 % al hacer hover — animando transform, nunca width.

Ver solución
.link { position: relative; }
.link::after {
  content: "";
  position: absolute;
  left: 0; bottom: -4px;
  width: 100%; height: 2px;
  background: var(--color-primario);
  transform: scaleX(0);
  transform-origin: left;
  transition: transform .3s ease;
}
.link:hover::after { transform: scaleX(1); }

7 Icono giratorio

El icono de ajustes gira una vuelta completa (360°) cada vez que pasas el ratón, durante medio segundo.

Ver solución
.icono {
  display: inline-block;
  transition: transform .5s ease;
}
.icono:hover { transform: rotate(360deg); }

8 Badge que late

Crea la insignia de notificación con la animación pulso de la lección: escala 1 → 1.15 → 1, infinita, en bucle alterno.

Ver solución
@keyframes pulso {
  from { transform: scale(1); }
  to   { transform: scale(1.15); }
}
.badge {
  animation: pulso 1s ease-in-out infinite alternate;
}

9 Spinner de carga

Un círculo con borde parcialmente coloreado que rota sin fin a velocidad constante: el clásico indicador «cargando».

Ver solución
@keyframes girar { to { transform: rotate(360deg); } }

.spinner {
  width: 40px; height: 40px;
  border-radius: 50%;
  border: 4px solid #eee;
  border-top-color: var(--color-primario);
  animation: girar .8s linear infinite;
}

10 Banner con degradado

Fondo degradado diagonal violeta→turquesa en la sección hero, con el titular en blanco y una text-shadow sutil.

Ver solución
.hero {
  background: linear-gradient(160deg, #6c5ce7, #00cec9);
}
.hero h1 {
  color: #fff;
  text-shadow: 2px 2px 6px rgba(0, 0, 0, .35);
}

11 Galería en blanco y negro

Todas las imágenes de la galería en grayscale(100 %); al pasar el ratón recuperan el color con una transición de 400ms.

Ver solución
.galeria img {
  filter: grayscale(100%);
  transition: filter .4s ease;
}
.galeria img:hover { filter: grayscale(0); }

12 🏆 Proyecto integrador: «tarjeta-pro.html»

Diseña la tarjeta de presentación de un producto con acabado comercial. Requisitos:

  • Mínimo 3 variables definidas en :root y usadas con var()
  • Al menos una transición con duración
  • Efecto :hover que aplique transform
  • Una animación @keyframes activa
  • box-shadow y un degradado en algún elemento
  • Ningún estilo inline: todo dentro del <style>

Este ejercicio es el reto del laboratorio del examen: la validación automática comprobará estos criterios por ti.

Evaluación del bloque

📝 Examen del Bloque 3

Dos partes: un test teórico autoevaluable (mínimo 70 %) y un reto práctico de autocorrección con checklist.

Parte A · Test teórico (aprueba con 9/12)

1 · ¿Cómo declaras una variable CSS?
2 · ¿Y cómo consumes esa variable?
3 · ¿Dónde se definen normalmente las variables globales?
4 · ¿Qué propiedad suaviza el cambio entre dos estados (por ejemplo normal → hover)?
5 · En transition: background .3s ease;, la palabra ease indica…
6 · transform: scale(1.2) hace que…
7 · Para que una animación se repita sin parar necesitas…
8 · Los pasos de una animación se definen con…
9 · Un degradado lineal se crea con…
10 · Una sombra exterior suave en una tarjeta se consigue con…
11 · Aplicar filter: grayscale(100%) a una imagen provoca…
12 · La ventaja real de las variables CSS es que…

Parte B · Reto práctico final

Construye el ejercicio 12 («tarjeta-pro.html») sin mirar soluciones y valida tú mismo/a estos criterios. Mínimo para aprobar: 7 de 8 casillas.

Cumplidos: 0 / 8

🎉 ¿Superaste las dos partes? Enhorabuena: has aprobado el Bloque 3 de CSS. Ya no solo maquetas interfaces: las haces sentir vivas y con acabado profesional. El Bloque 4 cierra el curso con un proyecto final completo.