{ } CSS / LABDESARROLLO WEB / LABORATORIO INTERACTIVO
Explorar los 15 capítulos
PROYECTO DE DESARROLLO WEB · CSS INTERACTIVO

Aprendamos CSS
practicando.

Revisa cada concepto, cambia sus valores y observa el resultado directamente en la página.

15 temasCSS interactivo1 proyecto local
CSS EN ACCIÓNLIVE PREVIEW ↗
+
+
transform: rotate(-8deg); #2563EB
/* unas reglas, otra realidad */
SELECTORESLAYOUTCOLORMOVIMIENTORESPONSIVECREATIVIDAD
PLAYGROUND / PRUEBA ANTES DE LEER

Cambia una regla. Mira el resultado.

CSS EN VIVO

Este experimento resume la forma de trabajar con CSS: selecciona un elemento, modifica propiedades y observa cómo el navegador lo vuelve a dibujar. Los controles de abajo están conectados con variables CSS reales.

1 · ELIGE UN PUNTO DE PARTIDA
RESULTADO hover para probar
EXPERIMENTO 00

Estoy hecho con CSS.

Cada control modifica una propiedad de esta tarjeta.

.tarjeta {
  background: #C5F568;
  border-radius: 24px;
  box-shadow: 10px 10px 0 #24341B;
}
¿Quieres escribir el HTML y CSS completo? Abrir editor completo
00 / DE DÓNDE NACE CSS

La web tenía estructura, pero le faltaba diseño.

HISTORIA DE CSS

HTML nació para organizar documentos: títulos, párrafos y enlaces. Cuando la web empezó a crecer, mezclar el contenido con instrucciones visuales hacía las páginas difíciles de mantener. CSS apareció para separar esas dos responsabilidades.

1994
EL PROBLEMA

Håkon Wium Lie propone CSS

Mientras trabajaba en CERN, Håkon Wium Lie planteó un lenguaje de hojas de estilo para controlar la presentación de los documentos web sin perder su estructura HTML.

/* Una idea decisiva */
contenido HTML + reglas de estilo separadas
ANTES

El estilo se mezclaba con el contenido

<font color="red" size="6">
  Título
</font>

Cambiar cien títulos podía significar editar cien etiquetas.

CON CSS

Una regla controla muchos elementos

h1 {
  color: red;
  font-size: 3rem;
}

La estructura permanece en HTML y la apariencia se administra desde CSS.

PREGUNTAS RÁPIDAS

¿Cómo se crean estos efectos?

Abre una pregunta y mira la regla principal.

¿Cómo detecta CSS que el mouse está encima?

La pseudoclase :hover activa estilos mientras el puntero permanece sobre un elemento.

.boton:hover {
  transform: translateY(-3px);
}
¿Cómo se suaviza un cambio?

transition indica qué propiedad cambia, cuánto tarda y qué curva de velocidad utiliza.

.boton {
  transition: transform 200ms ease;
}
¿Cómo se crea el difuminado de la portada?

Un degradado radial sigue dos variables actualizadas con la posición del mouse. filter suaviza sus bordes.

.luz {
  background: radial-gradient(circle, #2563eb55, transparent 70%);
  filter: blur(18px);
}
01 / EL PUNTO DE PARTIDA

Fundamentos de CSS

FUNDAMENTOS

CSS significa Cascading Style Sheets: hojas de estilo en cascada. Seleccionas un elemento y declaras cómo debe verse.

LA ANATOMÍA DE CSS
.elemento {
  color: #c5f568;
}
Selector Propiedad Valor
01 Externo RECOMENDADO

Separa estructura y presentación en archivos reutilizables.

<link rel="stylesheet" href="styles.css?v=2">
02 Interno

Una etiqueta <style> dentro del documento, normalmente en el <head>.

<style> p { color: lime; } </style>
03 En línea

El atributo style afecta únicamente a ese elemento.

<p style="color: lime;">Hola</p>
EXPERIMENTO 01¿Qué regla gana?

La cascada decide.

Entre declaraciones normales del autor, en la misma capa, la mayor especificidad gana. Si empatan, gana la última.

La cascada también considera origen, importancia y capas. La herencia transmite algunas propiedades, como color y fuente, a los descendientes.

¿Quién tiene la última palabra?

Gana .mensaje · especificidad 0-1-0
p { color: #c5f568; }
.mensaje { color: #bca7ff; }
02 / ELEGIR QUÉ ELEMENTO CAMBIAR

Selectores explicados desde cero

SELECTORES

CSS necesita saber a quién debe aplicarle un estilo. El selector es la palabra que aparece antes de las llaves y funciona como una dirección para encontrar elementos HTML.

Imagina que el HTML es un salón de clase.

El docente puede llamar a todos los estudiantes, a un grupo o a una sola persona. CSS hace lo mismo: p llama a todos los párrafos, .especial llama al grupo con esa clase y #unico llama a un solo elemento por su identificación.

1 · TENEMOS ESTE HTML
<p>Mensaje normal</p>
<p class="aviso">Mensaje importante</p>
2 · CSS BUSCA LA CLASE
.aviso {
  color: red;
}

El punto significa: «busca un elemento que tenga class="aviso"».

3 · ESTE ES EL RESULTADO

Mensaje normal

Mensaje importante

Solo cambia el segundo porque es el único con esa clase.
pEtiqueta

Busca todos los elementos que se llaman p.

No lleva símbolo al inicio.
.especialClase

Busca todos los elementos del grupo especial.

Siempre comienza con un punto.
#unicoID

Busca el único elemento identificado como unico.

Siempre comienza con numeral.
PRUEBA GUIADA3 elementos seleccionados

Empieza con estos tres. Pulsa uno y mira qué tarjetas dicen «CSS se aplica».

Ver otros selectores cuando entiendas los tres anteriores

01Texto 1<p>CSS se aplica

02Texto 2<span class="especial">No coincide

03Texto 3<p class="especial">CSS se aplica

04Texto 4<div id="unico">No coincide
05Texto 5<span data-tipo="demo">No coincide

06Texto 6<p>CSS se aplica

¿QUÉ ACABA DE PASAR? Selector de etiqueta

La letra p busca todos los elementos cuya etiqueta es <p>. Por eso cambia Texto 1, Texto 3 y Texto 6.

CSS ESCRITO p { outline: 2px solid var(--accent); } Coinciden: 01, 03 y 06.
Consultar cómo se relacionan dos elementos
.caja pDentro de

Cualquier párrafo que esté dentro de .caja.

.caja > pHijo directo

Un párrafo ubicado exactamente un nivel debajo de la caja.

p + spanJusto después

Un span colocado inmediatamente después de un párrafo.

h2 ~ pDespués de

Los párrafos que aparecen después de un título h2.

03 / TODO ES UNA CAJA

Modelo de caja

BOX MODEL

Contenido, relleno, borde y margen. Cuatro capas que explican el tamaño y la separación de cada elemento.

EXPERIMENTO 03Arrastra para comprender
MARGIN
CONTENT120 × 56
Margin Border Padding

Con box-sizing: border-box, el padding y el borde quedan incluidos en el ancho declarado. El margen siempre queda fuera.

04 / CONSTRUYE UNA IDENTIDAD

Colores y tipografía

COLOR + TEXTO
TIPOGRAFÍA EN TIEMPO REAL
AaHazlo tuyo.
EL COLOR TAMBIÉN SE MEZCLA
COLOR
EN MOVIMIENTO.
HEX #c5f568RGB rgb(197 245 104)HSL hsl(80 88% 68%)
px

Unidad absoluta de referencia.

rem / em

Relativas a tamaños de fuente.

% / vw / vh

Proporción del contexto o viewport.

clamp()

Un tamaño fluido con límites.

05 / ENCUENTRA EL ORDEN

Flexbox y Grid

FLEXBOX + GRID

Flexbox organiza en un eje principal. Grid controla filas y columnas. Cambia las reglas y compara el resultado.

EXPERIMENTO 05
01
02
03
04

display: block ocupa el ancho disponible; inline fluye con el texto; inline-block permite dimensiones sin crear un bloque completo. display: none retira el elemento del layout.

06 / FUERA DEL FLUJO

Posición y capas

POSITION + Z-INDEX
EXPERIMENTA CON POSITION
01
02
03
CONTENEDOR RELATIVO

PROFUNDIDAD CON Z-INDEX
z-index: 1

El orden de apilamiento se resuelve dentro de cada contexto de apilamiento; un z-index enorme no permite escapar de él.

fixed suele fijarse al viewport. sticky se pega al alcanzar un umbral dentro de su contenedor de desplazamiento, como la barra superior de este laboratorio.

07 / DISEÑA LA RESPUESTA

Estados de los elementos

ESTADOS + PSEUDOELEMENTOS
:HOVER · :ACTIVE · :FOCUS-VISIBLE

Prueba también con Tab: el foco visible permite orientarse usando el teclado.

button:hover { translate: 0 -4px; }
button:active { scale: .96; }
button:focus-visible {
  outline: 3px solid #bca7ff;
}
:CHECKED · :HAS()

Este interruptor cambia su tarjeta únicamente con CSS, gracias a :has(input:checked).

.panel:has(input:checked) {
  border-color: var(--accent);
}
::BEFORE · ::AFTER · ::SELECTION
Los detalles
hacen el diseño.

Las comillas son pseudoelementos decorativos. Selecciona este texto y observa su color.

.cita::before { content: "«"; }
::selection {
  background: #c5f568;
  color: #141613;
}

El formulario también comunica.

:focus, :valid y :invalid responden al estado del campo.

Demostración local: no se envía ni se guarda.
08 / EL DISEÑO COBRA VIDA

Animaciones y transformaciones

TRANSFORM + ANIMATION

Una transición interpola un cambio de estado. Una animación con @keyframes define su propia secuencia.

EXPERIMENTO 08
CSS, fotograma a fotograma.

Pasa el cursor o enfoca las piezas. Las animaciones respetan prefers-reduced-motion y se pueden pausar desde la barra superior.

09 / SIN UN ÚNICO TAMAÑO

Diseño adaptable

MEDIA + CONTAINER QUERIES

Las media queries consultan el viewport. Las container queries permiten que un componente responda al ancho de su propio contenedor.

EXPERIMENTO 09Contenedor amplio
{ }
UN COMPONENTE, CUALQUIER ESPACIO

Flexible por naturaleza.

Cuando mi contenedor mide 460 px o menos, cambio de dos columnas a una.

@container en acción
.contenedor { container-type: inline-size; }
.tarjeta { display: grid; grid-template-columns: 140px 1fr; }
@container (max-width: 460px) {
  .tarjeta { grid-template-columns: 1fr; }
}
/* Para el viewport: @media (max-width: 700px) { … } */
min() / max() / clamp()

Dimensiones fluidas y límites legibles.

object-fit: cover

Imágenes que llenan su caja sin deformarse.

overflow: auto

Desplazamiento cuando el contenido no cabe.

10 / MÁS ALLÁ DEL RECTÁNGULO

Efectos visuales

EFECTOS VISUALES
CSS
TRANSPARENCIA CON TEXTURA

Vidrio y desenfoque

backdrop-filter filtra lo que hay detrás de una superficie translúcida.

background: rgb(255 255 255 / .08);
backdrop-filter: blur(12px);
HAZ CLIC EN LA FORMA ↗

Recortes y formas

clip-path delimita qué parte del elemento se muestra.

clip-path: polygon(50% 0%, 100% 50%,
  50% 100%, 0% 50%);

Filtros en tiempo real

filter: hue-rotate(0deg);
box-shadow / text-shadow

Profundidad en cajas y texto.

mix-blend-mode

Mezcla un elemento con su fondo.

mask-image

Oculta gradualmente con una máscara.

11 / EL LENGUAJE EVOLUCIONA

Herramientas modernas

HERRAMIENTAS MODERNAS

Un recorrido amplio por las herramientas esenciales y actuales. CSS es un lenguaje vivo: siempre hay nuevas propiedades que explorar.

01 Variables y cálculos

Centraliza decisiones y calcula dimensiones. El botón «Paleta» de esta página cambia variables en :root.

:root { --accent: #c5f568; }
.pieza {
  color: var(--accent, lime);
  width: calc(100% - 2rem);
}
02 Capas de cascada

Organiza la prioridad antes de comparar especificidad. En declaraciones normales, una capa posterior gana a una anterior; las reglas sin capa ganan a las que tienen capa. Con !important se invierte ese orden.

@layer base, componentes, utilidades;
@layer base { button { color: white; } }
@layer utilidades { button { color: lime; } }
03 Anidación nativa

Agrupa los estados junto a su componente. El símbolo & hace referencia al selector padre.

.tarjeta {
  padding: 1rem;
  &:hover { border-color: lime; }
  & h3 { font-size: 2rem; }
}
04 Propiedades lógicas

Usa los ejes del modo de escritura en lugar de izquierda y derecha: facilita adaptar interfaces a distintos idiomas.

.contenido {
  padding-inline: 2rem;
  margin-block: 1rem;
  border-inline-start: 3px solid lime;
}
05 Mejora progresiva

Ofrece una base funcional y activa una mejora cuando el navegador soporta una declaración.

.panel { background: #222; }
@supports (backdrop-filter: blur(12px)) {
  .panel {
    background: rgb(34 34 34 / .6);
    backdrop-filter: blur(12px);
  }
}
06 Color, subgrid y scroll

color-mix() mezcla colores; subgrid comparte pistas con la cuadrícula padre; las animaciones ligadas al scroll usan el desplazamiento como línea de tiempo.

color: color-mix(in oklab, lime 60%, white);
grid-template-columns: subgrid;
animation-timeline: scroll();

La compatibilidad varía por función y navegador. Consulta documentación y ofrece alternativas.

Continúa explorando la referencia completa de CSS en MDN
12 / TU TURNO DE CREAR

Práctica guiada

EXPERIMENTO FINAL

Combina lo aprendido. Diseña esta tarjeta y observa cómo se traduce cada decisión a CSS.

TU MINI ESTUDIO
CSS / LAB

Diseñado
por ti.

Una idea. Unas reglas.
Tu propia forma de verlo.

HECHO CON CSS012 — ∞
13 / HABLA EL IDIOMA DEL COLOR

Identificar colores

HEX + RGB + HSL

CSS sí entiende nombres como red, pero un código permite elegir tonos exactos y reproducirlos. Escoge un color, compáralo y llévate su declaración.

#C5F568COLOR ACTUAL
Si el navegador bloquea la captura, elige un color de esta página.
Formato: # seguido de seis dígitos entre 0–9 y A–F.
COMPROBADOR DE CONTRASTE
Texto legibleAsí se verá la combinación.
10.34:1
Contraste excelenteCumple AA y AAA para texto normal.color: #24341B · fondo: #C5F568
LLEVAR ESTA COMBINACIÓN
PALETA AUTOMÁTICA

Cinco variaciones para fondos, bordes, estados y acentos. Haz clic para convertir cualquiera en el color actual.

.elemento {
  color: #24341B;
  background-color: #C5F568;
}
HEX#C5F568

Mezcla rojo, verde y azul con pares hexadecimales.

RGBrgb(197 245 104)

Cantidad de rojo, verde y azul, de 0 a 255.

HSLhsl(80 88% 68%)

Matiz, saturación y luminosidad: suele ser intuitivo al crear variaciones.

ALPHArgb(197 245 104 / .5)

Una barra inclinada añade transparencia sin cambiar el tono.

14 / DE LA IDEA AL NAVEGADOR

Playground HTML y CSS

PLAYGROUND HTML + CSS

Tu espacio para practicar: escribe HTML y CSS en los paneles de la derecha y mira el resultado a la izquierda. Cada cambio se convierte en una página real.

El borrador se guarda en este navegador.
RESULTADO EN VIVO
— px
0 líneas
0 líneas

Ctrl + Enter (o + Enter) ejecuta el ejercicio. Tab recorre los controles. Puedes escribir un fragmento HTML o un documento completo.

El navegador interpreta tu código; las declaraciones CSS que no reconoce se ignoran. La vista previa está aislada: no ejecuta JavaScript ni carga archivos externos. El modo descanso también pausa sus animaciones; el HTML descargado conserva las que hayas escrito.

Fin del recorrido.Ahora prueba tus propias ideas. ↗
PlaygroundHTML + CSS
DOCUMENTACIÓN DEL PROYECTO

Cómo está construida esta página

El laboratorio está desarrollado con HTML, CSS y JavaScript puro. No utiliza frameworks ni necesita conexión para ejecutar los experimentos. Cada tecnología tiene una responsabilidad distinta.

HTMLOrganiza el contenido y los controles
CSSDibuja, adapta y anima la interfaz
JavaScriptEscucha al usuario y cambia valores
NavegadorCalcula y muestra el resultado
ESTRUCTURA REAL

Qué hace cada archivo

index.htmlContiene el menú, las 14 secciones, formularios, botones, diálogos y el editor.
styles.cssDefine los ejemplos principales: caja, selectores, Flexbox, Grid, estados y efectos.
workspace.cssAñade los tres temas, el laboratorio de color y la distribución del editor.
student.cssAplica la apariencia académica, los tamaños móviles y la lectura sencilla.
interactions.cssContiene la entrada inicial, el brillo del cursor, el menú animado y el inspector.
script.jsConecta los controles de los experimentos y actualiza estilos en tiempo real.
colors.jsCaptura colores, convierte HEX, RGB y HSL, genera paletas y calcula el contraste.
playground.jsConstruye la vista previa del editor y guarda el borrador en el navegador.
theme.jsRecupera el tema guardado antes de mostrar la página.
explain.jsAbre y cierra esta documentación mediante un elemento <dialog>.
interactions.jsSigue el mouse y relaciona cada ejemplo con su explicación de CSS.
RECORRIDO DE UNA INTERACCIÓN

Qué ocurre cuando mueves un control

  1. 1El HTML crea un control, por ejemplo un input type="range".
  2. 2JavaScript escucha su evento con addEventListener("input", ...).
  3. 3El programa cambia una clase, una variable CSS o una propiedad del ejemplo.
  4. 4El navegador vuelve a calcular el estilo y muestra el nuevo resultado inmediatamente.
EJEMPLOS TOMADOS DEL CÓDIGO

Cómo funcionan partes concretas

Modo claro, oscuro y descanso

El valor elegido se guarda en data-theme. Cada tema reemplaza variables como --bg y --text; por eso no hay que cambiar cada elemento por separado.

document.documentElement.dataset.theme = mode;

:root {
  --bg: #141613;
  --text: #f0f1e9;
}

html[data-theme="light"] {
  --bg: #f4f6f1;
  --text: #20291b;
}
Un control del modelo de caja

Los rangos entregan números. JavaScript los convierte a píxeles, cambia el elemento de ejemplo y también actualiza el código visible.

bind(["paddingRange", "borderRange", "marginRange"], () => {
  const p = Number($("paddingRange").value);
  Object.assign($("boxDemo").style, {
    padding: `${p}px`,
  });
});
El brillo que sigue al mouse

La posición del puntero se guarda en variables CSS. El círculo difuminado utiliza esas coordenadas para moverse.

hero.style.setProperty("--pointer-x", `${x}px`);
hero.style.setProperty("--pointer-y", `${y}px`);

.hero-pointer-glow {
  left: var(--pointer-x);
  top: var(--pointer-y);
  filter: blur(10px);
}
El editor HTML y CSS

El código se limpia y se coloca en iframe.srcdoc. El iframe usa sandbox sin permisos, elimina scripts y bloquea recursos externos.

const doc = new DOMParser().parseFromString(source.html, "text/html");
preview.srcdoc = buildDocument(
  source,
  document.documentElement.classList.contains("motion-paused"),
);
DECISIONES IMPORTANTES

Accesibilidad, adaptación y seguridad