🎨 1.5 · CSS3: el lenguaje de estilo

⏱ 8h 00min ⚡ 120 XP 🏅 Aprendiz 📖 Fundamentos del Web FullStack
"CSS no es decorar HTML: es el contrato visual entre tu código y la persona que lo mira."

🎯 Objetivo del tema

Al terminar este tema serás capaz de: Al terminar este tema serás capaz de aplicar CSS3 a una página HTML: escribir selectores básicos y avanzados, dominar el Box Model, elegir unidades de medida adecuadas (px, %, em, rem, vw, vh), especificar colores en distintos formatos, y dar estilo a la tipografía. Estilizarás la página 'Sobre mí' que creaste en el Tema 1.3.
🎬
Video del instructor

El administrador aún no ha insertado un video para esta sección.

🗺️ Mapa del tema

HTML define la estructura y el significado; CSS define la presentación visual. Sin CSS, la web sería un muro de texto negro sobre fondo blanco. Con CSS, la web se vuelve legible, atractiva, y adaptable a cada dispositivo. En este tema vas a aprender las reglas del lenguaje: selectores, propiedades, valores, y el famoso Box Model que determina cómo se posiciona cada elemento.

1. Qué es CSS y cómo se conecta con HTML

Las 3 formas de aplicar CSS: inline, interno, externo. Cuál usar y por qué.

2. Selectores: básicos y avanzados

Por elemento, clase, id, atributo, descendiente, hijo, pseudo-clases.

3. El Box Model: el corazón de CSS

Content, padding, border, margin: cómo se calcula el tamaño real de cada caja.

4. Unidades: px, %, em, rem, vw, vh

Cuándo usar cada una: relativas, absolutas, del viewport, del elemento padre.

5. Colores: hex, rgb, hsl y más

Cómo especificar color de forma legible, mantenible y accesible.

6. Tipografía: legibilidad primero

font-family, font-size, font-weight, line-height, letter-spacing: cómo hacer texto que se lee bien.

1.5.1 Qué es CSS y cómo se conecta con HTML

CSS (Cascading Style Sheets) es el lenguaje de estilo de la web. Define CÓMO se ven los elementos HTML: colores, tamaños, posiciones, animaciones, tipografía. La regla CSS más simple tiene dos partes: un selector (a quién aplica) y un bloque de declaraciones (qué le hace).

Anatomía de una regla CSS

/* Esto es un comentario CSS */

selector {
  propiedad: valor;
  otra-propiedad: otro-valor;
}

/* Ejemplo real: */
h1 {
  color: #333;
  font-size: 2.5rem;
  text-align: center;
}

Anatomía de una regla CSS

Las 3 formas de aplicar CSS

FormaSintaxisCuándo usarProblema
Inline (en línea)<h1 style="color: red;">NUNCA en producción. Solo para pruebas rápidas.Mezcla estructura con estilo. Imposible de mantener.
Interno (en <style>)<style>h1 { color: red; }</style>Solo para páginas únicas o demos pequeñas.No se reutiliza entre páginas. Ensucia el HTML.
Externo (archivo .css)<link rel="stylesheet" href="estilos.css">SIEMPRE en producción. La forma profesional.Ninguno real. Es la forma correcta.
⭐ Regla de oro: Regla de oro: TODO tu CSS va en archivos .css externos, enlazados con <link>. El HTML debe quedar LIMPIO de estilos. Esta separación te permite cambiar el aspecto de 50 páginas tocando UN solo archivo.

Cómo se carga: la cascada

CSS es 'Cascading' (en cascada) porque cuando hay reglas en conflicto, se aplica un orden de prioridad. De mayor a menor importancia:

  • !important (úsalo solo en emergencias; es una bomba atómica).
  • Estilos inline (style='...') en el propio elemento.
  • Selectores por ID (#mi-id).
  • Selectores por clase (.mi-clase) y por atributo ([type='text']).
  • Selectores por etiqueta (h1, p, div).
  • Reglas que aparecen MÁS TARDE en el archivo (ganan a las anteriores con igual especificidad).
🎬
Video del instructor

El administrador aún no ha insertado un video para esta sección.

1.5.2 Selectores: hablarle a los elementos correctos

Un selector es la parte de la regla CSS que dice a qué elemento(s) aplicar el estilo. Mientras más preciso seas, menos CSS innecesario escribes y menos bugs introduces. Vamos de menor a mayor especificidad.

SelectorSintaxisAplica aEjemplo
Universal*Todos los elementos.* { box-sizing: border-box; }
Por etiquetah1Todos los <h1>.h1 { color: blue; }
Por clase.mi-claseCualquier elemento con class='mi-clase'..boton { padding: 10px; }
Por id#mi-idEl ÚNICO elemento con id='mi-id'.#menu-principal { display: flex; }
Por atributo[type='text']Elementos con ese atributo.input[type='text'] { border: 1px solid; }
Descendientediv pTodo <p> dentro de un <div>.article p { line-height: 1.6; }
Hijo directodiv > pSolo <p> que sea hijo directo de <div>.ul > li { margin: 4px 0; }
Hermano adyacenteh1 + pEl <p> inmediatamente después de <h1>.h1 + p { font-size: 1.1em; }

Pseudo-clases: estilo según estado

Las pseudo-clases te permiten aplicar estilo según el ESTADO o POSICIÓN del elemento. Son vitales para interactividad y accesibilidad.

/* Estilo del enlace en sus 4 estados */
a:link    { color: blue; }              /* enlace no visitado */
a:visited { color: purple; }            /* enlace visitado */
a:hover   { color: red; text-decoration: underline; }  /* mouse encima */
a:active  { color: orange; }            /* en el momento del clic */
a:focus-visible { outline: 2px solid orange; }  /* foco por teclado */

/* Estilo del primer/último hijo */
li:first-child { font-weight: bold; }
li:last-child  { border-bottom: none; }

/* Estilo de campos de formulario */
input:disabled  { background: #eee; cursor: not-allowed; }
input:required  { border-left: 3px solid red; }
input:valid     { border-color: green; }
input:invalid   { border-color: red; }

Pseudo-clases comunes

⭐ Class > ID: Usa class para estilos reutilizables, ID solo para elementos únicos (como #menu-principal). Los IDs tienen MUY alta especificidad y hacen que sobreescribir estilos sea un infierno. Reserva los IDs para anclas y para JavaScript.
🎬
Video del instructor

El administrador aún no ha insertado un video para esta sección.

1.5.3 El Box Model: el corazón de CSS

Todo elemento HTML es una CAJA rectangular. Aunque sea un círculo (con border-radius: 50%) o un texto, internamente se calcula como una caja. Entender el Box Model es entender cómo se posiciona, dimensiona y separa cada elemento del resto.

Las 4 capas del Box Model

  • CONTENT: el contenido real (texto, imagen, etc.).
  • PADDING: espacio INTERNO entre el contenido y el borde. 'Respira' el contenido dentro de su caja.
  • BORDER: la línea que rodea la caja (puede ser invisible si border: 0).
  • MARGIN: espacio EXTERNO entre esta caja y las demás.

El ejemplo clásico del padding

.caja {
  width: 200px;       /* ancho del CONTENIDO */
  padding: 20px;        /* +40px al ancho total (20 izq + 20 der) */
  border: 5px solid;    /* +10px al ancho total (5 izq + 5 der) */
  margin: 10px;         /* espacio hacia afuera, no afecta el tamaño de la caja */
}

/* Anchura total real: 200 + 40 + 10 = 250px */
/* Esto confunde a MUCHOS principiantes. */

Box Model estándar (content-box)

⭐ El reset obligatorio: Truco que te ahorra horas: aplica box-sizing: border-box a TODOS los elementos desde el inicio. Hace que width incluya el padding y el border, así 'lo que pides es lo que obtienes'.
/* Reset moderno: TODOS los elementos usan border-box */
*, *::before, *::after {
  box-sizing: border-box;
}

/* Ahora esto SÍ mide 200px de ancho total */
.caja {
  width: 200px;
  padding: 20px;
  border: 5px solid;
}

Reset box-sizing

margin vs padding: la duda eterna

Usa PADDING cuando...Usa MARGIN cuando...
Quieres espacio DENTRO de la caja, entre el contenido y el borde.Quieres espacio ENTRE esta caja y otras.
El fondo del elemento debe cubrir esa zona.El fondo NO debe llegar a esa zona.
Necesitas que el área sea 'tocable' (botones grandes).No necesitas que el área sea interactiva.
🎬
Video del instructor

El administrador aún no ha insertado un video para esta sección.

1.5.4 Unidades: px, %, em, rem, vw, vh

Elegir la unidad correcta es la diferencia entre un diseño que se ve bien en tu pantalla y un diseño que se ve bien en TODAS las pantallas. Hay dos familias: absolutas (no escalan) y relativas (escalan según un contexto).

UnidadTipoRelativa aCuándo usarla
pxAbsolutaEl píxel físico (o del dispositivo).Bordes, sombras, detalles pequeños. Cosas que NO deben escalar.
%RelativaEl tamaño del elemento padre.Anchos de columnas, alturas de imágenes. Cuando quieres 'el 50% del espacio disponible'.
emRelativaEl font-size del elemento PADRE.Cosas que escalan con el texto del contexto. (Cuidado: se anida y se vuelve confusa).
remRelativaEl font-size del elemento RAÍZ (<html>).Tipografía y espacios en general. La más predecible.
vwRelativaEl 1% del ANCHO del viewport.Cosas que escalan con el ancho de pantalla: tipografía fluida, hero sections.
vhRelativaEl 1% del ALTO del viewport.Pantallas completas (height: 100vh), secciones a página completa.

El ejemplo: tipografía fluida

/* html por defecto: 1rem = 16px */

/* h1 fijo a 32px: no escala con el dispositivo */
h1 { font-size: 32px; }

/* h1 relativo: escala con la raíz, mejor para accesibilidad */
h1 { font-size: 2rem; }              /* = 32px por defecto */

/* h1 fluido: escala entre 24px (móvil) y 48px (escritorio) */
h1 {
  font-size: clamp(1.5rem, 4vw, 3rem);
  /* mínimo: 24px, ideal: 4% del viewport, máximo: 48px */
}

Tipografía: px vs rem vs clamp()

⭐ Regla moderna: Regla moderna: usa rem para TODO lo que tenga que ver con texto y espacios (padding, margin, gap). Reserva px para bordes y sombras. Usa vw/vh con moderación y siempre con clamp() para que no se vuelva gigante en monitores 4K.
🎬
Video del instructor

El administrador aún no ha insertado un video para esta sección.

1.5.5 Colores: hex, rgb, hsl y cuándo usar cada uno

CSS ofrece 4 formas principales de especificar colores. Cada una tiene ventajas y desventajas. La elección correcta hace que tu paleta sea fácil de mantener, ajustar y hacer accesible.

FormatoEjemploVentajaCuándo usarlo
Nombrered, blue, transparentFácil de leer.Solo para colores básicos y la palabra 'transparent'.
Hex#FF6B00Corto y compacto. Soportado en todo.Paleta fija. Cuando el color no cambia en el sitio.
rgb() / rgba()rgb(255, 107, 0)Permite alpha (transparencia) fácil.Cuando necesitas transparencia sobre imágenes.
hsl() / hsla()hsl(24, 100%, 50%)INTUITIVO: H es el color, S la intensidad, L la claridad.Cuando creas VARIACIONES de un color (hover, active, dark mode).

Por qué hsl es el futuro

/* Generar variaciones de un naranja con hsl es trivial: */
:root {
  --color-primario: hsl(24, 100%, 50%);   /* naranja puro */
  --color-hover:    hsl(24, 100%, 40%);   /* más oscuro */
  --color-activo:   hsl(24, 100%, 30%);   /* aún más oscuro */
  --color-fondo:    hsl(24, 100%, 95%);   /* casi blanco anaranjado */
  --color-texto:    hsl(24, 50%, 20%);    /* gris anaranjado oscuro */
}

/* Cambiar TODO el sitio a azul: cambia UN número */
:root {
  --color-primario: hsl(220, 100%, 50%);  /* azul */
  /* el resto se ajusta automáticamente */
}

Por qué hsl es poderoso

⭐ Custom properties: El truco profesional: define tu paleta como CUSTOM PROPERTIES (variables CSS) en :root, y luego usa esas variables en todo el sitio. Cambiar el color principal de naranja a azul es cambiar 1 línea, no 200.
🎬
Video del instructor

El administrador aún no ha insertado un video para esta sección.

1.5.6 Tipografía: legibilidad primero

El 95% de la web es texto. Una buena tipografía hace que tu contenido se lea cómodo, rápido, y sin esfuerzo. Una mala tipografía hace que el usuario huya a los 5 segundos, independiente de lo bueno que sea tu contenido.

Las 5 propiedades clave

/* Familia tipográfica: incluye SIEMPRE fallbacks */
body {
  font-family: 'Inter', 'Helvetica Neue', Arial, sans-serif;
}

/* Tamaño: usa rem, no px */
body { font-size: 1rem; }        /* 16px por defecto */
h1   { font-size: 2.5rem; }     /* 40px */
h2   { font-size: 1.875rem; }   /* 30px */
small { font-size: 0.875rem; }  /* 14px */

/* Peso: 100-900, usa los que la fuente tenga */
h1 { font-weight: 700; }  /* bold */
p  { font-weight: 400; }  /* normal */

/* Altura de línea: 1.5 a 1.7 para texto corrido */
body { line-height: 1.6; }
h1   { line-height: 1.2; }  /* títulos más compactos */

/* Espaciado entre letras: sutil pero importante */
h1 { letter-spacing: -0.02em; }  /* títulos grandes: un poco menos */
p  { letter-spacing: 0; }
small { letter-spacing: 0.02em; }  /* texto pequeño: un poco más */

Las 5 propiedades de tipografía

Google Fonts: tipografías gratis y legales

No uses Comic Sans en un sitio profesional. Pero tampoco te limites a 'Times New Roman' y 'Arial'. Google Fonts ofrece más de 1500 familias tipográficas gratuitas y optimizadas para la web. Las más populares en 2024-2025:

FamiliaEstiloIdeal para
InterSans-serif moderna y muy legible.Cuerpo de texto en sitios profesionales.
RobotoSans-serif geométrica (Google).Apps, dashboards, interfaces.
PoppinsSans-serif geométrica con personalidad.Títulos, landing pages, branding moderno.
MerriweatherSerif diseñada para pantalla.Blog posts, lecturas largas, contenido editorial.
JetBrains MonoMonoespaciada para programadores.Bloques de código, datos tabulares.
💡 Optimización: Carga solo los pesos que vas a usar. Si solo usas Regular y Bold de Inter, no cargues Light, Medium y Black. Cada peso extra es ~30 KB que el usuario paga en tiempo de carga.
🎬
Video del instructor

El administrador aún no ha insertado un video para esta sección.

📚 Contenido ampliado

Material adicional, referencias externas verificadas y ejemplos extendidos.

🤖 AI Mission

La IA sugiere, tú decides. El estilo es identidad, no autocompletado.

Misión: Toma la página 'Sobre mí' del Tema 1.3 (sin estilos, o con los estilos básicos que le pusiste). Pídele a la IA que te sugiera una paleta de colores y tipografía coherente con un tema (ej: 'minimalista y profesional', 'juvenil y creativa', 'editorial y seria'). Después implementa SOLO lo que TÚ entiendas y te guste. Modifica al menos 2 cosas de lo que sugirió la IA. El estilo es tuyo, no de la herramienta.

Pasos sugeridos

  1. Abre tu página 'Sobre mí' sin estilos o con estilos mínimos.
  2. Piensa 5 minutos: ¿qué personalidad quieres? (minimalista, juvenil, editorial, técnica). Anota 3 adjetivos en tu cuaderno.
  3. Pídele a la IA: 'Sugiere una paleta de 3 colores y 2 familias tipográficas para una página personal con personalidad [tus adjetivos]. Justifica cada elección. Dame los valores en hex y los nombres de Google Fonts.'
  4. Revisa las sugerencias. ¿Te gustan? ¿Hay algo que cambiarías?
  5. Implementa en tu CSS: define custom properties en :root, aplica la paleta y tipografía.
  6. Modifica AL MENOS 2 cosas de lo que sugirió la IA (un color, una fuente, un tamaño). Es tu firma personal.
  7. Verifica accesibilidad: el contraste texto/fondo debe ser 4.5:1 mínimo. Usa WebAIM Contrast Checker.
  8. Anota en tu cuaderno, bajo 'Estilo personal vs IA': qué tomaste, qué cambiaste, por qué.

📓 Entregable: Captura de tu página 'Sobre mí' con la nueva paleta + tipografía, captura del WebAIM Contrast Checker mostrando el contraste de tu combinación principal, y media página de cuaderno justificando tus elecciones de estilo.

🚫 Errores típicos de razonamiento

Error 1: Usar `style='...'` inline en el HTML.
Por qué: Parece 'más fácil' al inicio, pero destruye la separación entre estructura y presentación. Cambiar el color de los 50 botones de tu sitio requiere tocar 50 archivos HTML en vez de 1 línea de CSS. Además, los estilos inline tienen MAYOR especificidad que cualquier selector CSS, así que sobreescribirlos después se vuelve un infierno.
Error 2: Olvidar el reset de box-sizing y pelearse con el Box Model.
Por qué: El Box Model estándar (content-box) hace que un elemento con width:200px + padding:20px + border:5px mida 250px de ancho real, no 200. Esto confunde a casi todos los principiantes. El reset universal (* { box-sizing: border-box; }) hace que el width sea LO QUE PIDES, y se acabó el conflicto. Es uno de los primeros resets que debes aplicar.
Error 3: Usar IDs (#mi-id) en vez de clases (.mi-clase) para estilos.
Por qué: Los IDs tienen MUY alta especificidad: una clase no puede sobreescribir un estilo aplicado por ID. Terminas con !important por todos lados intentando 'ganar' al ID. Reserva los IDs para anclas (href='#menu') y para JavaScript (getElementById). Para estilos, usa SIEMPRE clases.
Error 4: Elegir colores 'a ojo' sin verificar contraste.
Por qué: Tu pantalla puede estar calibrada distinta a la del usuario. Ese gris que 'se ve bien' para ti puede ser INVISIBLE para alguien con luz solar en la pantalla o baja visión. WCAG exige 4.5:1 para texto normal. Herramientas gratuitas: WebAIM Contrast Checker, axe DevTools, Lighthouse Accessibility. Verifica SIEMPRE antes de dar por bueno un color.
Error 5: Cargar 10 familias de Google Fonts y todos sus pesos.
Por qué: Cada familia de Google Fonts pesa entre 50 y 200 KB. Si cargas 5 familias en 4 pesos cada una, son 10 peticiones HTTP y ~1 MB extra que el usuario paga en tiempo de carga. Carga solo lo que uses. Si solo usas Inter Regular y Bold, no cargues Inter Light, Medium y Black. Y considera self-hosting las fuentes en producción.

🧪 Laboratorio práctico

Estilo es identidad. Define la tuya antes de pedirla a la IA.

Laboratorio: Estilizar la página 'Sobre mí' con CSS3 profesional

Objetivo: Tomar la página 'Sobre mí' del Tema 1.3 y darle estilo profesional con CSS3 externo: paleta coherente, tipografía legible, espaciado consistente, y que pase la auditoría de accesibilidad.

Pasos

  1. Crea una carpeta css/ y dentro un archivo estilos.css.
  2. Enlaza el CSS en tu HTML con <link rel='stylesheet' href='css/estilos.css'> en el <head>.
  3. Aplica el reset universal (* { box-sizing: border-box; margin: 0; padding: 0; } y font: inherit).
  4. Define tu paleta en :root usando custom properties (--color-primario, --color-fondo, --color-texto, etc.). Usa hsl() para que las variaciones sean fáciles.
  5. Carga UNA o DOS familias de Google Fonts (con <link rel='preconnect'> y <link rel='stylesheet'>). Solo los pesos que uses.
  6. Aplica la tipografía al body (font-family, font-size: 1rem, line-height: 1.6).
  7. Estiliza los encabezados (h1, h2, h3) con tamaños en rem y colores de tu paleta.
  8. Estiliza los enlaces con los 4 estados (:link, :visited, :hover, :focus-visible) y focus visible SIEMPRE.
  9. Dale un ancho máximo al main (max-width: 70ch; margin: 0 auto) para que el texto no se estire en pantallas grandes.
  10. Estiliza las imágenes: max-width: 100%; height: auto; para que sean responsive.
  11. Estiliza las <figure> y <figcaption> con tipografía más pequeña e italic.
  12. Verifica contraste con WebAIM Contrast Checker: tu combinación texto/fondo debe dar 4.5:1 mínimo.
  13. Ejecuta Lighthouse > Accessibility. Debe dar 95+.
  14. Prueba la página en móvil con DevTools (Toggle device toolbar). El texto debe ser legible sin hacer zoom.
  15. Haz commit: 'style: aplico CSS3 profesional con paleta y tipografía'.

📓 Entregable: Capturas de: (1) tu página con el nuevo estilo, (2) el archivo CSS mostrando las custom properties, (3) WebAIM Contrast Checker, (4) Lighthouse Accessibility 95+, (5) vista en móvil en DevTools, (6) commit final en Git.

📓 Tu cuaderno: Anota pseudocódigo, diagramas, errores que encontraste y respuestas a "explica sin código". La escritura manual refuerza tu razonamiento. Tu profesor puede pedirte que subas fotos de páginas específicas.