¿Qué es CSS y cómo se aplica?
CSS son las siglas de Cascading Style Sheets (Hojas de Estilo en Cascada). Es el lenguaje que controla la presentación de la web: colores, tamaños, tipografías, espaciados y posición. Si HTML es el esqueleto, CSS es la piel, la ropa y el maquillaje.
1.1 · Anatomía de una regla CSS
Toda hoja de estilos está hecha de reglas. Cada regla tiene un selector (¿a quién le hablo?) y un bloque de declaraciones (¿qué le cambio?):
p {
color: #7c3aed; /* propiedad : valor ; */
font-size: 18px;
}
1.2 · Las tres formas de aplicar CSS
| Forma | Cómo | ¿Cuándo usarla? |
|---|---|---|
| Inline | <p style="color:red"> dentro de la etiqueta |
Solo para pruebas rápidas o emails. Evítala: mezcla estructura y estilo. |
| Interno | Un <style> dentro del <head> |
Páginas sueltas o ejemplos de aprendizaje. |
| Externo | <link rel="stylesheet" href="styles.css"> |
La forma profesional: un archivo compartido por todo el sitio. |
<head>
<style>
h1 { color: teal; }
</style>
</head>
<head>
<link rel="stylesheet"
href="styles.css">
</head>
1.3 · La cascada: ¿quién gana cuando hay conflicto?
La «C» de CSS significa cascada. Cuando varias reglas tocan la misma propiedad del mismo elemento, el navegador decide así:
- Especificidad: gana la regla más concreta. Orden aproximado:
id (#)>clase (.)>etiqueta (p). - Orden: si empatan, gana la que aparece última en el código.
- Origen: lo inline pisa casi todo, y
!importantse salta la cola (¡úsalo solo en emergencias!).
color, font-family o line-height pasan de padres a hijos
sin que tengas que repetirlas.Selectores básicos y combinados
2.1 · Los cinco selectores fundamentales
| Selector | Nombre | Afecta a… |
|---|---|---|
p | Etiqueta / tipo | Todos los <p> de la página |
.destacado | Clase | Todo elemento con class="destacado" (el más usado) |
#menu | ID | El único elemento con id="menu" |
* | Universal | Todos los elementos |
[type="email"] | Atributo | Elementos con ese atributo y valor |
id debe ser único en la página y pesa mucho en la
especificidad. Para estilos reutilizables, piensa en clases primero:
.btn sirve para 50 botones, #btnEnviar solo para uno.2.2 · Agrupar y combinar
/* Agrupación: misma regla para varios selectores */
h1, h2, h3 {
font-family: "Sora", sans-serif;
}
/* Descendiente: cualquier p DENTRO de .card */
.card p { line-height: 1.6; }
/* Hijo directo: li colgados justo de ul.menu */
ul.menu > li { list-style: none; }
/* Hermano adyacente: el p justo después de un h2 */
h2 + p { margin-top: 0; }
| Combinador | Lectura | Ejemplo |
|---|---|---|
A B | B descendiente de A (cualquier profundidad) | .card p |
A > B | B hijo directo de A | ul > li |
A + B | B inmediatamente después de A | h2 + p |
A ~ B | B hermano posterior de A (no obligatorio adyacente) | img ~ figcaption |
a.boton.destacado:hover = un <a> con esas dos clases al pasar el ratón.Colores, tipografías y unidades
3.1 · Cuatro maneras de decir un color
.a { color: violet; } /* nombre */
.b { color: #7c3aed; } /* hexadecimal (el estándar) */
.c { color: rgb(124, 58, 237); } /* rojo, verde, azul (0–255) */
.d { color: rgba(124, 58, 237, .5); } /* con transparencia */
- Hex abreviado: si sus pares se repiten puedes acortarlo:
#ffffff→#fff. - HSL (tono, saturación, luminosidad) es ideal para crear paletas:
hsl(262, 83%, 58%). - Herramienta imprescindible: el cuentagotas de las DevTools (F12) para robar colores a cualquier web.
3.2 · Tipografías web
body {
font-family: "Inter", "Segoe UI", Arial, sans-serif;
font-size: 16px;
line-height: 1.6; /* sin unidad = multiplicador */
}
h1 {
font-weight: 800; /* 100 fino … 900 negro */
text-align: center;
letter-spacing: -.02em;
text-transform: uppercase;
}
sans-serif, serif, monospace): es el plan B si ninguna
fuente está disponible. Y para fuentes de marca usa servicios como Google Fonts.3.3 · Unidades: absolutas vs relativas
| Unidad | Significado | Ideal para… |
|---|---|---|
px | Píxel fijo (absoluta) | Bordes, sombras, detalles finos |
% | Porcentaje del contenedor | Anchos fluidos |
em | Multiplica la fuente del propio elemento | Espaciados ligados al texto local |
rem | Multiplica la fuente de la raíz (16px por defecto) | Fuentes, paddings, márgenes |
vw / vh | 1 % del ancho / alto de la ventana | Héroes a pantalla completa |
rem para tamaños de texto: si el usuario amplía la fuente
en su navegador (accesibilidad), toda tu página escala con ella. 1rem = 16px,
1.5rem = 24px, 0.75rem = 12px.El modelo de caja
Para el navegador, todo elemento es una caja rectangular con cuatro capas, de dentro hacia fuera:
- Contenido — el texto o la imagen (lo mide
width/height). padding— aire interior entre contenido y borde.border— el borde: grosor, estilo y color (1px solid #ccc).margin— espacio transparente que separa la caja de sus vecinas.
.card {
max-width: 360px;
padding: 24px; /* shorthand: los 4 lados */
border: 1px solid #ddd;
border-radius: 14px;
margin: 40px auto; /* vertical auto = centrada */
background-color: #fff;
}
| Escribo… | Significa… |
|---|---|
margin: 10px; | Los cuatro lados |
margin: 10px 20px; | Vertical 10 · horizontal 20 |
margin: 10px 20px 30px; | Arriba · lados · abajo |
margin: 1px 2px 3px 4px; | Sentido horario: arriba, derecha, abajo, izquierda |
4.1 · El truco imprescindible: box-sizing
Por defecto, width mide solo el contenido: si añades padding, la caja
crece. Con box-sizing: border-box el padding y el borde quedan
dentro del ancho declarado, y calcular layouts se vuelve trivial:
.card {
width: 300px;
padding: 20px;
}
/* ocupa 300 + 40 = 340px 😱 */
* {
box-sizing: border-box;
}
/* .card ocupa exactamente 300px ✌️ */
margin: 0 auto centra cajas con ancho fijo.
Lo verás constantemente en código real.✍️ Los 10 ejercicios del bloque
Trabaja sobre una carpeta css-b1/ con tu index.html del curso de
HTML (¡ya tienes el esqueleto!) y un archivo estilos.css. Intenta cada ejercicio
antes de mirar la solución.
1 Mi primera hoja de estilos
Enlaza estilos.css desde tu index.html y consigue: fondo general
gris muy claro, títulos violetas y párrafos en gris oscuro.
Ver solución
/* index.html → <link rel="stylesheet" href="estilos.css"> */
body {
background-color: #f6f5fa;
}
h1, h2, h3 {
color: #7c3aed;
}
p {
color: #444;
}
2 Detective de errores
Este CSS tiene 5 errores. Encuéntralos y corrígelos:
h1 {
colour: red
font-size; 32px;
padding: 20px;
}
// título principal
p {
color: #333;;
line-heigth: 1.5;
}
Ver solución
colourno existe: la propiedad escolor.- Falta el
;trasred. font-size; 32px;usa punto y coma en lugar de dos puntos.- Los comentarios CSS van con
/* … */, nunca con//. line-heigthestá mal escrito: esline-height.
h1 {
color: red;
font-size: 32px;
padding: 20px;
}
/* título principal */
p {
color: #333;
line-height: 1.5;
}
3 Selectores al blanco
Dado este HTML, escribe reglas para: todos los párrafos (gris), solo los párrafos dentro
de .noticia (negro), el elemento #principal (borde violeta), y
agrupa h2 y h3 en cursiva… ¡sin repetir selectores!
<main id="principal">
<article class="noticia"><p>Titular…</p></article>
<p>Párrafo suelto</p>
</main>
Ver solución
p { color: #555; }
.noticia p { color: #111; }
#principal { border: 2px solid #7c3aed; }
h2, h3 { font-style: italic; }
4 Duelo de especificidad
Sin abrir el navegador: ¿de qué color acaba el texto del siguiente párrafo? Justifica cada paso con la cascada.
/* styles.css, en este orden */
p { color: green; }
.texto { color: blue; }
#aviso { color: crimson; }
p.texto { color: orange; }
.texto { color: teal; }
<p class="texto" id="aviso">¿De qué color soy?</p>
Ver solución
El elemento acumula etiqueta p + clase .texto + id #aviso.
Las reglas con id son las más específicas, así que solo compiten #aviso { crimson } contra…
ninguna otra: el resto caen por especificidad. Resultado: crimson 🩸.
Sin el id, ganarían p.texto (dos factores) sobre .texto, y entre las dos
reglas .texto ganaría la última (teal). Prueba a borrar el id y compruébalo.
5 Paleta corporativa
Define los mismos tonos en tres formatos distintos: fondo del pie en hex, texto del
footer en rgb(), y un enlace destacado en hsl() con 60 % de
transparencia al hacer hover.
Ver solución
footer {
background-color: #1e1b29;
color: rgb(230, 230, 240);
}
footer a {
color: hsl(262, 83%, 65%);
}
footer a:hover {
color: hsla(262, 83%, 65%, 0.6);
}
6 Tipografía profesional
Dota al body de una pila de fuentes con fallback genérico, interlineado 1.7,
y crea un .kicker: mayúsculas, espaciado entre letras 0.08em, tamaño 0.75rem
y peso 700.
Ver solución
body {
font-family: "Segoe UI", Roboto, Arial, sans-serif;
line-height: 1.7;
}
.kicker {
text-transform: uppercase;
letter-spacing: 0.08em;
font-size: 0.75rem;
font-weight: 700;
}
7 Escala tipográfica en rem
Convierte esta escala en píxeles a rem (raíz de 16px): 48, 28, 20, 16 y 13 px. Asigna cada medida a h1, h2, h3, p y small respectivamente.
Ver solución
h1 { font-size: 3rem; } /* 48 / 16 */
h2 { font-size: 1.75rem; } /* 28 / 16 */
h3 { font-size: 1.25rem; } /* 20 / 16 */
p { font-size: 1rem; }
small { font-size: 0.8125rem; } /* 13 / 16 */
8 Tarjeta con modelo de caja completo
Crea un .perfil de 320px máximo, centrado horizontalmente, con padding de
24px, borde gris de 1px, esquinas redondeadas de 16px y margen superior de 40px. Con
box-sizing: border-box global.
Ver solución
* { box-sizing: border-box; }
.perfil {
max-width: 320px;
margin: 40px auto 0;
padding: 24px;
border: 1px solid #ddd;
border-radius: 16px;
}
9 Menú horizontal elegante
Convierte un <ul class="menu"> en barra horizontal: sin viñetas, elementos
en línea con separación de 16px, enlaces sin subrayado y color violeta que oscurece al pasar
el ratón.
Ver solución
ul.menu {
list-style: none;
padding-left: 0;
}
ul.menu > li {
display: inline-block;
margin-right: 16px;
}
ul.menu a {
text-decoration: none;
color: #7c3aed;
}
ul.menu a:hover {
color: #5b21b6;
}
10 🏆 Proyecto integrador: «tarjeta-de-presentacion.html»
Crea una página con una tarjeta de presentación personal estilizada íntegramente desde
un <style> interno. Requisitos:
- Estilos en un
<style>dentro del head (nada inline) - Selector de clase para la tarjeta y selector de etiqueta para textos
colorybackground-colorválidos (hex, rgb o hsl)font-familycon familia genérica de respaldo- Alguna unidad relativa (rem, em o %)
- Modelo de caja visible: margin, padding y border
- Comentarios
/* … */explicando tus reglas - Ni un solo
!important
Este ejercicio es exactamente el reto del laboratorio: la plantilla incluye un
!important inline heredado que deberás migrar al <style>
del head antes de empezar a estilar.
📝 Examen del Bloque 1
Dos partes: un test teórico autoevaluable (necesitas un mínimo de 70 % para superar el bloque) y un reto práctico de autocorrección con checklist.
Parte B · Reto práctico final
Construye el ejercicio 10 («tarjeta-de-presentacion.html») sin mirar la solución y valida tú mismo/a estos criterios. Mínimo para aprobar: 7 de 8 casillas.
Cumplidos: 0 / 8