Programación · n.º 3 entre los lenguajes más usados

Aprende HTML y CSS desde cero

La estructura y el diseño de todas las páginas web.

  • 10 lecciones
  • 10 ejercicios interactivos
  • 7 conceptos clave
  • 58,2 % lo usa*

Qué es HTML y CSS y para qué sirve

HTML describe qué hay en una página (títulos, párrafos, imágenes, enlaces) y CSS decide cómo se ve (colores, tamaños, posición). No son lenguajes de programación en sentido estricto, sino de marcado y de estilos, pero son la base de cualquier web y lo primero que conviene aprender si quieres crear páginas.

  • Crear páginas y sitios web
  • Diseñar correos y documentos
  • La parte visual de aplicaciones web

Para empezar: Crea un archivo index.html con el Bloc de notas o Visual Studio Code y ábrelo con doble clic en el navegador.

Nivel 1 Básico

Lección 1 · Básico

Qué es HTML: tu primera página

HTML marca cada parte del contenido con etiquetas: <h1> para el título principal, <p> para un párrafo… Casi todas se abren y se cierran, y lo que va dentro es el contenido.

Toda página tiene el mismo esqueleto: <!DOCTYPE html>, la etiqueta <html> con el idioma, un <head> con datos que no se ven (como el título de la pestaña) y un <body> con lo que sí se ve.

Ejemplo práctico
<!DOCTYPE html>
<html lang="es">
  <head>
    <meta charset="utf-8">
    <title>Mi primera página</title>
  </head>
  <body>
    <h1>Hola, soy Ana</h1>
    <p>Esta es mi primera página web.</p>
  </body>
</html>

Ejercicio

¿Dónde va el contenido que se ve en la página?

Ver la solución

Respuesta: En <body>. <body> contiene todo lo visible. <head> guarda datos sobre la página, como el título de la pestaña.

Lección 2 · Básico

Enlaces, imágenes y listas

Los atributos añaden información a una etiqueta. Un enlace <a> necesita href con la dirección; una imagen <img> necesita src con el archivo y alt con una descripción para quien no puede verla.

Las listas se hacen con <ul> (con viñetas) u <ol> (numeradas), y cada elemento va en un <li>.

Ejemplo práctico
<a href="https://www.portaltec.eu/">Visita PortalTec</a>

<img src="gato.jpg" alt="Un gato dormido sobre el teclado" width="400" height="300">

<ul>
  <li>Pan</li>
  <li>Leche</li>
</ul>

Ejercicio

Completa el atributo que describe la imagen para quien no la ve.

<img src="gato.jpg" ="Un gato dormido">
Ver la solución

Respuesta: alt. alt es el texto alternativo: lo leen los lectores de pantalla y aparece si la imagen no carga.

Conceptos clave

Lección 3 · Básico

Qué es CSS y dónde se escribe

CSS son reglas con un selector (a qué elementos afecta) y unas declaraciones propiedad: valor; entre llaves. Por ejemplo, h1 { color: navy; } pone azul marino todos los títulos <h1>.

Lo habitual es escribir el CSS en un archivo aparte, estilos.css, y enlazarlo desde el <head> con <link>. Así una sola hoja da estilo a todas tus páginas.

Ejemplo práctico
<!-- En el <head> de index.html -->
<link rel="stylesheet" href="estilos.css">

/* En estilos.css */
body {
  font-family: system-ui, sans-serif;
  line-height: 1.6;
}
h1 {
  color: navy;
}

Ejercicio

¿Qué etiqueta enlaza una hoja de estilos externa?

Ver la solución

Respuesta: <link rel="stylesheet">. <link rel="stylesheet" href="archivo.css"> carga el CSS de un archivo aparte.

Lección 4 · Básico

Clases y el modelo de caja

Con el atributo class marcas los elementos que quieres tratar igual, y en CSS los seleccionas con un punto: .aviso. Un mismo elemento puede tener varias clases.

Cada elemento es una caja con contenido, relleno interior (padding), borde (border) y margen exterior (margin). Con box-sizing: border-box el ancho que indicas incluye el relleno y el borde, y es más fácil de calcular.

Ejemplo práctico
<p class="aviso">Oferta solo hoy</p>

/* CSS */
* { box-sizing: border-box; }

.aviso {
  padding: 12px 16px;          /* espacio interior */
  border: 2px solid #b45309;   /* borde */
  margin: 24px 0;              /* espacio exterior */
  border-radius: 8px;
}

Ejercicio

¿Qué propiedad da espacio entre el contenido y su borde?

Ver la solución

Respuesta: padding. padding es el relleno interior; margin separa la caja de las demás.

Conceptos clave

Nivel 2 Intermedio

Lección 5 · Intermedio

Formularios accesibles

Un formulario recoge datos con campos <input>, <select> o <textarea>. El atributo type cambia el teclado y la validación: email, number, date…

Cada campo necesita una etiqueta <label> unida a él con for e id: así el lector de pantalla la anuncia y, al pulsar el texto, se activa el campo.

Ejemplo práctico
<form action="/suscribir" method="post">
  <label for="correo">Tu correo</label>
  <input id="correo" name="correo" type="email" required autocomplete="email">

  <button type="submit">Suscribirme</button>
</form>

Ejercicio

Completa el atributo que une la etiqueta con el campo de id «correo».

<label ="correo">Tu correo</label>
Ver la solución

Respuesta: for. El for de la etiqueta debe coincidir con el id del campo.

Lección 6 · Intermedio

Colocar elementos con Flexbox

Con display: flex en un contenedor, sus hijos se colocan en fila (o en columna con flex-direction: column). justify-content los reparte en esa dirección y align-items los alinea en la otra.

gap pone separación entre ellos sin tener que usar márgenes. Flexbox es ideal para barras de menú, botones en fila o centrar algo.

Ejemplo práctico
<nav class="menu">
  <a href="/">Inicio</a>
  <a href="/blog/">Blog</a>
  <a href="/contacto/">Contacto</a>
</nav>

/* CSS */
.menu {
  display: flex;
  justify-content: space-between;
  align-items: center;
  gap: 16px;
}

Ejercicio

Completa para colocar los hijos en fila con Flexbox.

.menu {
  display: ;
}
Ver la solución

Respuesta: flex. display: flex convierte el elemento en un contenedor flexible.

Lección 7 · Intermedio

Diseño adaptable al móvil

Una web adaptable se ve bien en cualquier pantalla. Lo primero es la etiqueta <meta name="viewport"> en el <head>; sin ella, el móvil muestra la página como en un ordenador, en miniatura.

Las consultas de medios (@media) aplican reglas solo a partir de cierto ancho. Lo más cómodo es diseñar primero para móvil y añadir cambios para pantallas grandes.

Ejemplo práctico
<meta name="viewport" content="width=device-width, initial-scale=1">

/* CSS: una columna en el móvil, dos a partir de 700 px */
.tarjetas { display: grid; gap: 16px; }

@media (min-width: 700px) {
  .tarjetas { grid-template-columns: 1fr 1fr; }
}

Ejercicio

¿Qué regla aplica estilos solo a partir de cierto ancho de pantalla?

Ver la solución

Respuesta: @media. @media (min-width: …) activa las reglas solo cuando la pantalla mide al menos ese ancho.

Nivel 3 Avanzado

Lección 8 · Avanzado

Rejillas con CSS Grid

Grid coloca elementos en filas y columnas a la vez. Con grid-template-columns defines las columnas; la unidad fr reparte el espacio libre.

La combinación repeat(auto-fit, minmax(200px, 1fr)) crea tantas columnas como quepan, de al menos 200 px, sin escribir ninguna consulta de medios.

Ejemplo práctico
.galeria {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
  gap: 12px;
}

Ejercicio

¿Qué hace repeat(auto-fit, minmax(200px, 1fr))?

Ver la solución

Respuesta: Tantas columnas de al menos 200 px como quepan. Ajusta el número de columnas al ancho disponible, cada una de 200 px como mínimo.

Lección 9 · Avanzado

Variables CSS y modo oscuro

Las propiedades personalizadas (variables CSS) empiezan por -- y se leen con var(). Defínelas en :root y cambia todo el diseño tocando un solo valor.

La consulta prefers-color-scheme: dark detecta si la persona usa el tema oscuro del sistema; basta con redefinir ahí las variables de color.

Ejemplo práctico
:root {
  --fondo: #ffffff;
  --texto: #1f2937;
}
@media (prefers-color-scheme: dark) {
  :root {
    --fondo: #111827;
    --texto: #f3f4f6;
  }
}
body {
  background: var(--fondo);
  color: var(--texto);
}

Ejercicio

Completa para usar la variable --texto.

p { color: (--texto); }
Ver la solución

Respuesta: var. var(--nombre) lee el valor de una propiedad personalizada.

Lección 10 · Avanzado

HTML semántico, accesibilidad y publicar

Usa la etiqueta que describe el contenido: <header>, <nav>, <main>, <article>, <footer>, <button> para acciones… Los buscadores y los lectores de pantalla entienden mejor la página y el teclado funciona sin trucos.

Revisa que el texto tenga contraste suficiente con el fondo (las pautas WCAG piden al menos 4,5:1 en texto normal) y, cuando esté lista, publícala gratis con un servicio como GitHub Pages.

Ejemplo práctico
<body>
  <header>
    <nav aria-label="Principal">…</nav>
  </header>
  <main>
    <article>
      <h1>Receta de tortilla</h1>
      <p>…</p>
    </article>
  </main>
  <footer>© 2026 Mi web</footer>
</body>

Ejercicio

Para una acción como «Añadir al carrito», ¿qué elemento es el correcto?

Ver la solución

Respuesta: <button>. <button> se puede usar con el teclado y los lectores de pantalla lo anuncian como botón, sin trabajo extra.

¿Has terminado? Sigue practicando

Repasa los conceptos en el diccionario, practica con estas herramientas o prueba otro lenguaje: las ideas que has aprendido (variables, condiciones, funciones, objetos…) te servirán en cualquiera.

  • Texto y programación

    Selector de colores y contraste

    Convierte colores entre HEX, RGB y HSL, toma colores de una imagen y comprueba el contraste WCAG.

  • Texto y programación

    Comparar dos textos

    Encuentra las diferencias entre dos versiones de un texto, línea a línea y palabra a palabra.

Fuentes consultadas

* Porcentaje de personas que dijeron haber usado HTML y CSS en la Stack Overflow Developer Survey 2026: Technology (pregunta sobre lenguajes de programación, de scripts y de marcado; todas las respuestas). El progreso de las lecciones se guarda solo en este navegador.