chuletón

Todo lo que puedes escribir, con lo que hace cada cosa y sus opciones. Para tenerlo abierto en otra pestaña mientras trasteas.

La forma de aprender esto no es leerlo entero: es buscar lo que necesitas, copiarlo, cambiar un número, guardar, recargar y mirar. Cuarenta veces. No se rompe nada.

html · las etiquetas

El HTML dice qué es cada cosa. Estas son todas las que necesitas, y unas cuantas más.

el esqueletoesencial

Lo que lleva toda página, siempre igual. Copia esto en cada archivo nuevo.

<!DOCTYPE html>
<html lang="es">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>Tu nombre — Proyectos</title>
  <link rel="stylesheet" href="estilo.css">
</head>
<body>

</body>
</html>

charset hace que los acentos y la ñ no salgan rotos. viewport hace que el móvil no encoja la página. Los dos son obligatorios.

<header> <nav> <main> <footer>esencial

Las cajas grandes de la página. No hacen nada visible por sí solas: sirven para organizar y para que el CSS pueda apuntarles.

  • header cabecera
  • nav el menú
  • main el contenido de esta página
  • footer el pie
  • article una unidad: un proyecto
  • section un apartado
  • div una caja sin significado
<header>
  <h1>Rita Mestre</h1>
  <nav>
    <a href="index.html">Inicio</a>
    <a href="proyectos.html">Proyectos</a>
  </nav>
</header>
<h1> … <h6>esencial

Títulos, de más a menos importante. Es jerarquía, no tamaño: el tamaño lo decides luego en el CSS.

Un solo h1 por página, y no te saltes niveles: después de un h2 va un h3, no un h5.

<p> <br> <hr>esencial

Párrafo, salto de línea suelto y línea de separación.

<p>Un párrafo. Uno por idea.</p>
<p>Barcelona<br>2026</p>   salto sin cambiar de párrafo
<hr>                       una línea horizontal

br y hr no se cierran. Y usa br poco: si quieres separar ideas, son dos párrafos.

<strong> <em> <small> <mark>esencial

Marcar un trozo dentro de un texto.

  • strong negrita
  • em cursiva
  • small letra pequeña
  • mark subrayado con color
  • s tachado
<p>Pieza de <strong>gres</strong> con <em>engobe</em>.</p>
<ul> <ol> <li>esencial

Listas. ul con puntos, ol numerada. Cada li es una línea. El CV entero es una lista.

<ul>
  <li>2026 · <em>Cámaras sordas</em>, La Escocesa, Barcelona</li>
  <li>2025 · <em>Ruido blanco</em>, Sala X, Girona</li>
</ul>

Para quitar los puntos: ul { list-style: none; padding-left: 0; }

<a href>esencial

Un enlace. href es a dónde va; lo de entre las etiquetas es lo que se ve y se clica.

<a href="cv.html">CV</a>                        otra página tuya
<a href="https://neocities.org">Neocities</a>   otra web (con https://)
<a href="mailto:rita@ejemplo.com">Escríbeme</a>   abre el correo
<a href="tel:+34600000000">Llámame</a>           llama, en el móvil
<a href="cv.pdf" download>Descargar CV</a>      descarga un archivo
<a href="#contacto">Ir al contacto</a>          baja a id="contacto"

Para abrir en pestaña nueva: target="_blank" rel="noopener". Úsalo solo para webs de fuera.

<img src alt>esencial

Una imagen. src es dónde está el archivo; alt la describe para quien no la ve.

<img src="img/obra-1.jpg" alt="Cinco recipientes de gres sobre una mesa">

No lleva cierre. El nombre del archivo y el src tienen que coincidir exactamente: .JPG no es .jpg.

<figure> <figcaption>avanzado

Una imagen con su pie, atados. Es lo correcto para una ficha técnica.

<figure>
  <img src="img/obra-1.jpg" alt="…">
  <figcaption>Cámaras sordas, 2026. Gres, 30 × 20 cm.</figcaption>
</figure>
loading="lazy" · width · heightavanzado

Que las imágenes de más abajo no se carguen hasta que hagan falta, y que la página no dé saltos mientras cargan.

<img src="img/obra-1.jpg" alt="…"
     width="1600" height="1200" loading="lazy">

Pon las medidas reales del archivo. El tamaño en pantalla lo sigue decidiendo el CSS.

<video> <audio>avanzado

Vídeo o sonido servido desde tu propia carpeta, sin YouTube de por medio.

<video src="video/pieza.mp4" controls width="640"></video>
<audio src="audio/campo.mp3" controls></audio>

Ojo al peso. GitHub Pages no sirve archivos de más de 100 MB, y un vídeo largo tarda en cargar. Para piezas largas, mejor un enlace o un iframe de Vimeo.

<iframe>avanzado

Meter dentro de tu página algo que vive en otro sitio: un vídeo de Vimeo, un disco de Bandcamp, un mapa.

<iframe src="https://player.vimeo.com/video/000000"
        width="640" height="360"
        title="Documentación de la pieza"
        allowfullscreen></iframe>

En esas webs, botón Compartir → Insertar y te dan el código hecho. Para que se adapte al móvil: iframe { max-width: 100%; }

<!-- comentario -->esencial

Una nota para ti que no se ve en el navegador. Sirve para dejarte recordatorios y para apagar un trozo sin borrarlo.

<!-- esto no se ve -->
<!-- <a href="tienda.html">Tienda</a> -->   apagado hasta que exista
favicon · meta descriptionavanzado

El iconito de la pestaña y el texto que sale en Google. Van en el <head>.

<link rel="icon" href="favicon.png">
<meta name="description" content="Rita Mestre, cerámica y sonido. Barcelona.">

El favicon, un PNG cuadrado de 64 × 64 en la raíz de tu carpeta. La descripción, una frase por página.

class="…" · id="…"esencial

Ponerle un nombre a un trozo del HTML para que el CSS pueda apuntarle solo a él.

en el HTML
<p class="ficha">2026 · Gres</p>
<section id="contacto">…</section>

en el CSS
.ficha  { color: grey; }        punto para class
#contacto { margin-top: 80px; }  almohadilla para id

class se puede repetir todas las veces que quieras: es lo que usarás casi siempre. id es único en la página y sirve sobre todo para enlazar con #.

css · reglas y selectores

Cómo se escribe una regla y a qué le apuntas con ella.

la forma de una reglaesencial
selector {
  propiedad: valor;
}

Punto y coma al final de cada línea. Si te lo olvidas, esa línea deja de funcionar y a veces la siguiente también, y no avisa nadie: no sale ningún error, simplemente no pasa nada.

Comentario en CSS: /* así */. Sirve para apagar una línea sin borrarla.

a qué apunta cada selectoresencial
p { }                  todos los párrafos
.ficha { }             todo lo que tenga class="ficha"
#contacto { }          lo que tenga id="contacto"
header, footer { }    los dos — la coma es "y también"
nav a { }              los enlaces DENTRO de nav — el espacio es "dentro de"
a:hover { }            cuando el ratón está encima
* { }                  absolutamente todo

La confusión más común: header, a son las cabeceras y todos los enlaces. header a son solo los enlaces de dentro de la cabecera. Una coma lo cambia todo.

:first-child · :last-child · :nth-child()avanzado

Apuntar a un elemento por su posición dentro de la serie.

article:first-child { margin-top: 0; }
article:last-child  { border-bottom: none; }
li:nth-child(2)     { color: red; }       el segundo
li:nth-child(odd)   { background: #f4f4f4; } 1º, 3º, 5º…
li:nth-child(even)  { background: #fff; }    2º, 4º, 6º…

Quitarle el borde al último de una serie es el uso que más vas a darle.

la cascada · quién ganaavanzado

Cuando dos reglas dicen cosas distintas sobre lo mismo, gana:

  • 1 · el selector más específico (id > class > elemento)
  • 2 · a igualdad, el que esté más abajo en el archivo

Por eso la media query del móvil va siempre al final. Y por eso !important casi nunca es la solución: si lo necesitas, normalmente es que hay dos reglas peleándose y conviene arreglar eso.

variables · :root y var()avanzado

Guardar un valor con nombre y usarlo por toda la web. Cambias el color en un sitio y cambia en todas partes.

:root {
  --tinta: #12233a;
  --papel: #fbfaf7;
  --acento: #f2e94e;
}

body    { color: var(--tinta); background: var(--papel); }
a:hover { background: var(--acento); }

Es la mejora que más se agradece cuando ya tienes tres o cuatro páginas.

css · texto

Qué letra, de qué tamaño, cómo alineada y a cuánta distancia una línea de otra. Es lo que más cambia la sensación de una web.

font-familyesencial

Qué tipografía. Pones varias separadas por comas y el navegador usa la primera que encuentre instalada. La última es el comodín.

con remates — para leer, clásica
font-family: "Iowan Old Style", Georgia, "Times New Roman", serif;

sin remates — limpia, neutra
font-family: "Helvetica Neue", Arial, sans-serif;

de máquina de escribir — técnica, de archivo
font-family: ui-monospace, "SF Mono", Menlo, monospace;

la del sistema — la que use quien te visite
font-family: system-ui, sans-serif;

Estas cuatro no hay que descargarlas: ya están en todos los ordenadores.

usar una tipografía tuyaavanzado

Dos caminos. El rápido va en el <head> del HTML:

<link href="https://fonts.bunny.net/css?family=eb-garamond" rel="stylesheet">

Ese es el mismo catálogo que Google Fonts con el dominio cambiado, y no le pasa a Google la IP de quien te visita. Si copias un <link> de Google Fonts, sustituye fonts.googleapis.com/css2?family=EB+Garamond por fonts.bunny.net/css?family=eb-garamond — en minúsculas y con guiones — y ya está.

El bueno: descargas el archivo, lo metes en tipos/ y lo sirves tú. Carga más rápido y no le cuentas a nadie quién te visita.

@font-face {
  font-family: "Mi Tipo";
  src: url("tipos/mi-tipo.woff2") format("woff2");
  font-display: swap;
}
body { font-family: "Mi Tipo", Georgia, serif; }

Mira la licencia antes de subir una tipografía de pago. Gratis y buenas: Velvetyne y Collletttivo (libres, raras, de cartel — las que le dan carácter a una web de artista), Fontshare (familias completas y muy pulidas) y Bunny Fonts (el catálogo de Google, servido sin rastreo).

font-sizeesencial

El tamaño de la letra.

  • 16px lo mínimo cómodo
  • 18px agradable para leer
  • 20px generoso
  • 1.2rem proporcional al del navegador

Prueba 17, 18 y 20 en el body y quédate con el que te canse menos. Nunca bajes de 14px en texto que haya que leer.

clamp()avanzado

Un tamaño que crece con la pantalla, entre un mínimo y un máximo. Para titulares es magnífico: te ahorra la media query.

h1 { font-size: clamp(32px, 7vw, 76px); }
                 ↑mínimo  ↑crece  ↑tope

vw es «por cien del ancho de la ventana». Compruébalo estrechando el navegador.

line-heightesencial

La separación entre líneas. Es el ajuste que más cambia la sensación de una web y el que más se olvida.

  • 1.2 apretado — para titulares
  • 1.5–1.6 cómodo — para leer
  • 1.8 aireado

Sin unidad: line-height: 1.6, no 1.6px.

font-weight · font-styleesencial

Grosor y cursiva.

  • normal / 400
  • bold / 700
  • 300 fino
  • 900 negrísimo
  • font-style: italic
  • font-style: normal quita la cursiva

Los números solo funcionan si la tipografía tiene ese grosor. Si no, el navegador lo finge y queda mal.

text-alignesencial

Cómo se alinea el texto dentro de su caja.

  • left por defecto
  • center centrado
  • right a la derecha
  • justify cuadrado a los dos lados

justify deja ríos de espacio feos en columnas estrechas: úsalo solo en columnas anchas. Y center para párrafos largos cansa; resérvalo para titulares y frases sueltas.

text-transformesencial

Cambia las mayúsculas sin tocar el HTML: el texto de verdad sigue escrito como lo escribiste.

  • uppercase TODO EN MAYÚSCULAS
  • lowercase todo en minúsculas
  • capitalize Primera De Cada Palabra
  • none como está escrito

Con uppercase, añade siempre algo de letter-spacing: las mayúsculas juntas se leen fatal.

letter-spacing · word-spacingesencial

Separación entre letras y entre palabras.

  • -0.02em apretado — titulares grandes
  • normal
  • 0.08em suelto — etiquetas en mayúsculas
  • 0.3em muy suelto — decorativo

En em, no en píxeles: así se mantiene proporcional si cambias el tamaño.

text-decorationesencial

El subrayado. Los enlaces vienen subrayados de fábrica.

  • none quitarlo
  • underline ponerlo
  • line-through tachado
nav a { text-decoration: none; }
p a   { text-underline-offset: 4px; }  separarlo un poco

Si quitas el subrayado, deja otra pista de que es un enlace —color, negrita, un :hover claro—, o nadie sabrá que se puede clicar.

columnsavanzado

Partir un texto largo en columnas, como un periódico.

.texto-largo {
  columns: 2;
  column-gap: 40px;
}

En móvil vuelve a una sola columna con columns: 1 dentro de la media query, o quedará ilegible.

white-spaceavanzado

Qué hacer con los espacios y saltos de línea que escribiste.

  • normal los junta todos
  • pre-wrap respeta tus saltos
  • nowrap nunca salta de línea

pre-wrap es lo que quieres para un poema: escribes los versos tal cual en el HTML y salen tal cual.

css · color

Dos colores bien elegidos bastan. El tercero, solo para una cosa.

color · background-coloresencial

color es la letra. background-color es el fondo. Se confunden todo el rato.

body {
  color: #12233a;             la letra
  background-color: #fbfaf7;  el fondo
}

Se heredan: si lo pones en body, todo lo de dentro lo coge, salvo que se lo cambies.

las formas de escribir un coloresencial
  • red, black, ivory nombres
  • #12233a hexadecimal
  • #123 abreviado
  • rgb(18 35 58)
  • rgb(18 35 58 / 40%) con transparencia
  • hsl(210 53% 15%)
  • transparent

hsl es el útil para trastear: tono (0–360), saturación y luminosidad. Bajas el último número y tienes el mismo color más oscuro, sin buscar otro hex. Copia hex de coolors.co o del cuentagotas del inspector.

contrasteesencial

Si el texto no se lee con el móvil al sol, no se lee. Gris claro sobre blanco es la manera más común de hacer una web bonita e ilegible.

Compruébalo en webaim.org/resources/contrastchecker. Busca 4.5 o más para texto normal, 3 o más para titulares grandes.

Y negro puro sobre blanco puro cansa la vista: baja un poco los dos. Un blanco con algo de calidez (#fbfaf7) y un negro que en realidad sea azul muy oscuro (#12233a).

opacityavanzado

Transparencia de todo el elemento, contenido incluido. De 0 (invisible) a 1 (opaco).

.pie          { opacity: .55; }
.pie:hover    { opacity: 1; }

Si solo quieres el fondo traslúcido y la letra opaca, no uses opacity: usa rgb(0 0 0 / 40%) en el background-color.

background-image · degradadosavanzado

Un fondo que no es un color plano.

background-image: linear-gradient(#f2e94e, #fbfaf7);
background-image: linear-gradient(90deg, black, transparent);
background-image: url("img/textura.jpg");

Con una imagen, casi siempre querrás también:
background-size: cover; background-position: center; background-repeat: no-repeat;

mix-blend-modeavanzado

Mezclar un elemento con lo que tiene detrás, como las capas de Photoshop. Con imágenes da resultados muy buenos y cuesta una línea.

  • multiply oscurece, tiñe
  • screen aclara
  • difference invierte
  • overlay, luminosity, hue
.foto {
  background-color: #f2e94e;
}
.foto img {
  mix-blend-mode: multiply;   la foto se tiñe de amarillo
  filter: grayscale(1);         en blanco y negro primero
}

Míralo funcionando en el muestrario.

modo oscuroavanzado

Que tu web siga el modo claro u oscuro del ordenador de quien la visita.

:root { --papel: #fbfaf7; --tinta: #12233a; }

@media (prefers-color-scheme: dark) {
  :root { --papel: #12131a; --tinta: #e8e8e8; }
}

body { background: var(--papel); color: var(--tinta); }

Necesita variables. Es la razón principal para usarlas.

css · la caja

Todo elemento es una caja: contenido, padding por dentro, border, y margin por fuera. El 70% de las dudas del taller son dudas de caja.

paddingesencial

Relleno por dentro: separa el contenido de su propio borde. Si la caja tiene fondo, el padding también lo tiene.

padding: 24px;              los cuatro lados
padding: 16px 24px;         arriba/abajo · izquierda/derecha
padding: 16px 24px 40px;    arriba · lados · abajo
padding: 8px 16px 24px 32px; arriba · derecha · abajo · izquierda
padding-top: 40px;           un lado suelto

El orden de los cuatro valores es en el sentido de las agujas del reloj desde arriba.

marginesencial

Aire por fuera: separa la caja de sus vecinas. Se escribe igual que el padding.

margin: 0 0 32px 0;   solo separación por debajo
margin: 0 auto;       CENTRA la caja (si tiene max-width)
margin-top: -20px;    negativo: la sube, se solapa

auto significa «reparte el espacio sobrante a los dos lados por igual». Por eso centra.

Dos márgenes verticales que se tocan no se suman: se queda el mayor. Es normal, no es un fallo.

borderesencial

Una línea alrededor. Tres datos: grosor, tipo y color.

border: 1px solid #ccc;          los cuatro lados
border-bottom: 1px solid #ccc;   solo debajo — el más útil
border-left: 3px solid black;   una banda lateral
border: none;                    quitarlo
  • solid continua
  • dashed a rayas
  • dotted de puntos
  • double doble

border-bottom fino entre proyectos es la forma más barata de que una web se vea ordenada.

box-sizing: border-boxesencial

Ponlo siempre, en la primera línea de tu CSS. Sin esto, una caja de 300px con 20px de padding mide 340 y todo se descuadra.

* { box-sizing: border-box; }

Con esto, 300px son 300px, padding y borde incluidos. Es la línea que más disgustos ahorra.

width · max-width · heightesencial

Ancho y alto. Usa max-width, no width: pone un tope pero deja que encoja en el móvil.

main {
  max-width: 640px;
  margin: 0 auto;
}
  • 500px estrecha, íntima
  • 640px cómoda de leer
  • 900px ancha, para imágenes
  • 100% todo el hueco disponible
  • min-height: 100vh al menos toda la pantalla

Sin tope, en una pantalla ancha las líneas se hacen larguísimas y al saltar de renglón te pierdes. Entre 60 y 80 caracteres por línea es lo cómodo.

la regla de las imágenesesencial

Esta va en todas las webs, sin excepción.

img {
  max-width: 100%;   nunca más ancha que su hueco
  height: auto;      no se deforma
  display: block;    sin el hueco raro de debajo
}
border-radiusavanzado

Esquinas redondeadas.

  • 4px apenas
  • 16px se nota
  • 50% círculo perfecto
  • 999px forma de pastilla
box-shadowavanzado

Sombra. Cuatro datos: desplazamiento horizontal, vertical, difuminado y color.

box-shadow: 0 14px 34px rgb(0 0 0 / 12%);   levantada
box-shadow: 6px 6px 0 black;                dura, gráfica
box-shadow: inset 3px 0 0 #f2e94e;          banda por dentro

Sombras muy difuminadas y muy transparentes quedan naturales. Las duras y sin difuminar quedan de cartel.

overflowavanzado

Qué hacer cuando el contenido no cabe.

  • visible se sale (por defecto)
  • hidden se recorta
  • auto aparece barra de scroll si hace falta
  • scroll barra siempre

overflow-x: auto en una tabla ancha evita que la página entera se desplace de lado en el móvil.

css · composición

Colocar las cosas en la página: en fila, en rejilla, pegadas al scroll.

displayesencial

Cómo se comporta la caja.

  • block ocupa toda la línea
  • inline va dentro del texto
  • inline-block en línea, pero con medidas
  • flex pone a sus hijos en fila
  • grid rejilla
  • none desaparece del todo

display: none es útil para esconder el menú de escritorio en el móvil.

flex · poner cosas en filaesencial

Lo pones en el padre y sus hijos se colocan en fila. Es lo que usarás para el menú.

nav {
  display: flex;
  gap: 20px;              separación entre ellos
  flex-wrap: wrap;         que salten si no caben
  justify-content: center; alineación horizontal
  align-items: center;     alineación vertical
}
  • justify-content: flex-start
  • center
  • flex-end
  • space-between pegados a los extremos
  • space-around
  • flex-direction: column en vertical

space-between es lo que quieres para «nombre a la izquierda, menú a la derecha».

grid · rejilla de proyectosavanzado

Una rejilla que se adapta sola al ancho de la pantalla, sin media queries.

.proyectos {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));
  gap: 24px;
}

Se lee: «tantas columnas como quepan, cada una de 240px como mínimo y repartiendo el sobrante». Cambia el 240 y mira qué pasa estrechando la ventana.

Para columnas fijas: grid-template-columns: 1fr 2fr; — la segunda el doble de ancha.

object-fit · aspect-ratioavanzado

Que todas las fotos de una galería midan lo mismo aunque sean de proporciones distintas. Resuelve el problema más molesto de una rejilla de obra.

.proyectos img {
  aspect-ratio: 4 / 3;     todas con la misma forma
  object-fit: cover;       recorta lo que sobre
  object-position: center;  por dónde recorta
  width: 100%;
}
  • cover llena y recorta
  • contain cabe entera, deja aire
  • 1 / 1 cuadrado
  • 3 / 4 vertical
positionavanzado

Sacar un elemento del flujo normal.

  • static lo normal
  • relative se mueve un poco, guarda su hueco
  • absolute se coloca respecto al padre relative
  • fixed se queda quieto en la pantalla
  • sticky normal hasta que llega arriba, y ahí se pega
header {
  position: sticky;
  top: 0;
  background: white;   o se transparenta al pasar por debajo
  z-index: 10;          por encima de lo demás
}

sticky es el más agradecido: menú que acompaña, o título de sección que se queda mientras lees.

scroll-snapavanzado

Que el scroll se detenga con imán en cada sección, como una exposición de salas. Es lo que hace que esta misma presentación funcione.

html {
  scroll-snap-type: y mandatory;
}
section {
  scroll-snap-align: start;
  min-height: 100vh;
}

Para hacerlo en horizontal: x mandatory y display: flex en el contenedor. Míralo en expo horizontal y expo vertical.

Cuidado: no lo combines con scroll-behavior: smooth; en Chrome se cancelan entre sí.

css · que funcione en el móvil

Es donde va a verse tu web casi siempre.

@mediaesencial

Reglas que solo se aplican en pantallas pequeñas. Va al final del archivo, porque pisa lo de arriba.

@media (max-width: 600px) {
  body { font-size: 17px; padding: 16px; }
  h1   { font-size: 28px; }
  nav  { flex-direction: column; gap: 8px; }
  .proyectos { grid-template-columns: 1fr; }
}

Compruébalo estrechando la ventana del navegador con el ratón. Es más directo que el modo dispositivo del inspector.

Cortes habituales: 600px móvil, 900px tableta. Con uno solo tienes de sobra.

las unidadesesencial
  • px fijo, exacto
  • % del ancho del padre
  • em del tamaño de letra del elemento
  • rem del tamaño base del navegador
  • vw por cien del ancho de la ventana
  • vh por cien del alto
  • svh alto real en el móvil

En el móvil, 100vh se cuela por debajo de la barra del navegador. Usa 100svh si quieres exactamente una pantalla.

la etiqueta viewportesencial

Sin esta línea en el <head>, el móvil finge ser un ordenador y enseña tu web diminuta. Ninguna media query funciona sin ella.

<meta name="viewport" content="width=device-width, initial-scale=1">

css · efectos y movimiento

Lo que hace que una web se sienta viva. Con moderación: si todo se mueve, nada destaca.

:hover · :focus-visibleesencial

Cuando el ratón está encima, y cuando se llega con el teclado.

a:hover { background: #f2e94e; }
a:focus-visible { outline: 2px solid black; outline-offset: 3px; }

En el móvil no hay hover. No escondas nada importante detrás de él. Y no quites nunca el outline del focus sin poner otra cosa: es cómo se navega sin ratón.

transitionesencial

Que un cambio ocurra poco a poco en vez de de golpe. Se pone en el estado normal, no en el :hover.

a {
  color: black;
  transition: color .2s ease;
}
a:hover { color: red; }

transition: all .3s ease;   todo lo que cambie

Entre .15s y .3s. Más lento se siente pesado.

transformavanzado

Mover, girar o escalar sin descolocar lo que hay alrededor.

transform: scale(1.05);          un 5% más grande
transform: rotate(-2deg);        girado
transform: translateY(-6px);    subido
transform: rotate(-2deg) scale(1.05);  los dos

Con transition y :hover, una foto que crece un poco al pasar por encima son tres líneas.

filteravanzado

Efectos de imagen, como los de un editor de fotos, en directo.

  • grayscale(1) blanco y negro
  • blur(4px) desenfoque
  • invert(1) negativo
  • sepia(.6)
  • contrast(1.4)
  • brightness(.8)
  • saturate(2)
.galeria img       { filter: grayscale(1); transition: filter .3s; }
.galeria img:hover { filter: grayscale(0); }

Se pueden encadenar: filter: grayscale(1) contrast(1.2);

@keyframes · animationavanzado

Movimiento que ocurre solo, sin que nadie toque nada.

@keyframes latir {
  from { transform: scale(1); }
  to   { transform: scale(1.08); }
}

.sello {
  animation: latir 1.4s ease-in-out infinite alternate;
}

Míralo en cartel vivo. Y respeta a quien pida menos movimiento:

@media (prefers-reduced-motion: reduce) {
  * { animation: none; transition: none; }
}
cursoravanzado

Qué forma tiene el ratón encima de algo.

  • pointer la manita
  • crosshair la cruz
  • grab mano abierta
  • zoom-in lupa
  • none invisible

plantillas para copiar

Trozos enteros que funcionan. Copia, pega en tu archivo y cambia los textos.

una página enteraesencial

El punto de partida de cualquier página nueva de tu web.

<!DOCTYPE html>
<html lang="es">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>Rita Mestre — Textos</title>
  <link rel="stylesheet" href="estilo.css">
</head>
<body>

  <header>
    <h1>Rita Mestre</h1>
    <nav>
      <a href="index.html">Inicio</a>
      <a href="proyectos.html">Proyectos</a>
      <a href="cv.html">CV</a>
    </nav>
  </header>

  <main>
    <h2>Textos</h2>
    <p>Aquí va el contenido de esta página.</p>
  </main>

  <footer>
    <p><a href="mailto:rita@ejemplo.com">rita@ejemplo.com</a></p>
  </footer>

</body>
</html>

Recuerda: si añades esta página, el enlace nuevo va en el menú de todas las demás.

un estilo.css de arranqueesencial

Todo lo esencial, comentado y en el orden correcto. Cambia los valores marcados y ya tienes web.

/* ── la línea que ahorra disgustos ── */
* { box-sizing: border-box; }

/* ── 1 · la base ── */
body {
  margin: 0;
  padding: 40px 24px;
  background-color: #fbfaf7;      ← tu fondo
  color: #12233a;                 ← tu tinta
  font-family: Georgia, serif;     ← tu tipografía
  font-size: 18px;
  line-height: 1.6;
}

/* ── 2 · la columna ── */
header, main, footer {
  max-width: 640px;               ← prueba 500, 640, 900
  margin: 0 auto;
}

/* ── 3 · los titulares ── */
h1 { font-size: 42px; line-height: 1.15; margin: 0 0 8px; }
h2 { font-size: 28px; margin: 48px 0 12px; }
h3 { font-size: 20px; margin: 0 0 4px; }

/* ── 4 · el menú ── */
nav {
  display: flex;
  gap: 20px;
  flex-wrap: wrap;
  margin-bottom: 48px;
}
nav a {
  color: inherit;
  text-decoration: none;
  transition: background .2s ease;
}
nav a:hover { background: #f2e94e; }   ← tu acento

/* ── 5 · los bloques y las imágenes ── */
article {
  margin-bottom: 48px;
  padding-bottom: 48px;
  border-bottom: 1px solid #ddd;
}
article:last-child { border-bottom: none; }

img {
  max-width: 100%;
  height: auto;
  display: block;
  margin: 16px 0;
}

footer {
  margin-top: 80px;
  padding-top: 24px;
  border-top: 1px solid #ddd;
  font-size: 15px;
}

/* ── 6 · el móvil · SIEMPRE AL FINAL ── */
@media (max-width: 600px) {
  body { font-size: 17px; padding: 24px 16px; }
  h1   { font-size: 30px; }
  h2   { font-size: 22px; }
}
un proyectoesencial

Copia el bloque entero para cada proyecto y cambia el texto y la imagen. Así de aburrido, así de fiable.

<article>
  <h3>Cámaras sordas</h3>
  <p class="ficha">2026 · Gres y grabaciones de campo · Barcelona</p>
  <img src="img/obra-1.jpg" alt="Cinco recipientes cerrados sobre una mesa">
  <p>Dos o tres líneas sobre el proyecto.</p>
</article>
.ficha {
  font-size: 14px;
  text-transform: uppercase;
  letter-spacing: .08em;
  opacity: .6;
}
galería en rejillaavanzado
<div class="galeria">
  <figure>
    <img src="img/obra-1.jpg" alt="…">
    <figcaption>Cámaras sordas, 2026</figcaption>
  </figure>
  <!-- repite figure para cada obra -->
</div>
.galeria {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));
  gap: 24px;
}
.galeria figure { margin: 0; }
.galeria img {
  aspect-ratio: 4 / 3;
  object-fit: cover;
  width: 100%;
  margin: 0 0 8px;
}
.galeria figcaption { font-size: 14px; opacity: .6; }
un CV que se lee bienavanzado
<h2>Exposiciones</h2>
<ul class="cv">
  <li><span>2026</span> <em>Cámaras sordas</em>, La Escocesa, Barcelona</li>
  <li><span>2025</span> <em>Ruido blanco</em>, Sala X, Girona</li>
</ul>
.cv { list-style: none; padding: 0; }
.cv li {
  display: flex;
  gap: 16px;
  padding: 8px 0;
  border-bottom: 1px solid #eee;
}
.cv span { min-width: 54px; opacity: .5; }  los años, alineados
menú desplegable, sin javascriptavanzado

Si tienes muchas páginas y en el móvil no caben, <details> lo resuelve sin una línea de código.

<details class="menu">
  <summary>Menú</summary>
  <nav>
    <a href="index.html">Inicio</a>
    <a href="proyectos.html">Proyectos</a>
  </nav>
</details>

<details> sirve para cualquier cosa que se abra y se cierre: textos largos, notas al pie, fichas técnicas.

el pie con tu licenciaesencial

Estás publicando obra tuya en abierto. Si no dices nada, quien llegue no sabe si puede usarla — y tú tampoco tienes dónde señalar si alguien la usa mal. Una línea en el <footer> lo resuelve.

<footer>
  <p>© 2026 Rita Mestre</p>
  <p>Textos bajo <a href="https://creativecommons.org/licenses/by-nc-sa/4.0/deed.es">CC BY-NC-SA 4.0</a>.
     <br>Las imágenes de obra, todos los derechos reservados.</p>
  <p><a href="mailto:hola@ritamestre.com">hola@ritamestre.com</a></p>
</footer>

Las cuatro letras: BY hay que citarte · NC no para uso comercial · SA quien lo reutilice comparte igual · ND no se puede modificar. Las combinas como quieras. Puedes poner licencias distintas a los textos y a las imágenes, que es lo que suele querer una artista.

Para elegirla con preguntas y que te dé el código: creativecommons.org/chooser — está solo en inglés. Sin poner nada, se entiende «todos los derechos reservados», que también es una opción legítima: lo que no vale es no haberlo pensado.

cuando algo no funciona

Por orden. Funciona casi siempre.

no cambia nadaesencial
  1. ¿Has guardado el archivo? En VS Code, un punto en la pestaña significa sin guardar.
  2. ¿Has recargado? Recarga forzada: Cmd+Shift+R (Mac) o Ctrl+F5 (Windows).
  3. ¿Está el <link rel="stylesheet"> en esta página? Se olvida al crear una nueva.
  4. ¿Falta un punto y coma o una llave? Esa línea y a veces la siguiente dejan de funcionar sin avisar.
  5. ¿El selector apunta de verdad a ese elemento? Botón derecho → Inspeccionar sobre el elemento y mira qué reglas le llegan.
una imagen no saleesencial

Casi siempre es el nombre. El archivo y el src tienen que coincidir exactamente.

  • .JPG no es .jpg
  • Obra 1.jpg no es obra-1.jpg
  • ¿está dentro de img/?
  • ¿lo subiste al publicar?

En tu Mac funciona igual con mayúsculas o sin ellas; en el servidor no. Por eso se ve en local y no publicada.

la web publicada da 404esencial

Entra en tu repositorio: ¿ves index.html nada más abrirlo?

Si lo que ves es una carpeta, subiste la carpeta contenedora en vez de su contenido. Bórralo y vuelve a subir solo lo de dentro.

Y comprueba que la portada se llama exactamente index.html: ni Index.html ni index.HTML.

el inspectoresencial

Botón derecho → Inspeccionar. Es tu mejor herramienta y es gratis.

  • Elements el HTML tal como lo ve el navegador
  • Styles qué reglas le llegan y cuáles están tachadas
  • Console los errores, escritos
  • Network qué archivos no cargaron

En Styles puedes cambiar valores y ver el resultado al instante, sin tocar tu archivo. Cuando des con el bueno, lo copias a tu CSS. Es la forma más rápida de trastear.

lo he roto del todoesencial
  1. Cmd+Z tantas veces como haga falta. Funciona más de lo que parece.
  2. Vuelve a la última copia de la carpeta que iba bien.
  3. En GitHub, pestaña History del archivo: están todas las versiones anteriores.

La costumbre: antes de un cambio grande, duplica la carpeta entera y ponle la fecha al nombre. Es la manera más simple que existe de poder volver atrás.

pedirle ayuda a una IAesencial
  • pega solo el trozo que falla
  • pide que te expliquen el cambio
  • no aceptes una reescritura entera

Si le das la web completa te la devuelve reescrita de arriba abajo. Funcionará, pero ya no sabrás dónde tocar, y eso es justo lo que has venido a aprender.

Nada coincide con eso. Prueba con otra palabra — o mira el índice completo.

y ahora

Esto no se aprende leyendo: se aprende cambiando un número, guardando, recargando y mirando. Abre tu estilo.css, ten esta página en otra pestaña, y trastea.