Anatomía de una etiqueta

Un elemento son tres cosas: la etiqueta de apertura, el contenido y la etiqueta de cierre.

<p>Hola mundo</p>
TrozoCómo se llamaQué es
<p>Etiqueta de aperturaDice qué empieza aquí
Hola mundoContenidoLo que el usuario verá
</p>Etiqueta de cierreDice dónde termina. Lleva /

La etiqueta de cierre es igual a la de apertura pero con una barra / delante del nombre.

Algunas etiquetas llevan atributos: información extra que va dentro de la etiqueta de apertura, como un par nombre="valor".

<a href="pagina.html">Ir a la página</a>

No todas se cierran

Unas pocas etiquetas no llevan cierre porque no envuelven nada. Las dos que verás siempre son <img> (una imagen) y <br> (un salto de línea).

Anidación e indentación

Las etiquetas se meten unas dentro de otras, como cajas dentro de cajas. La regla única: la que se abre última se cierra primero.

<!-- Así sí -->
<p>Hola <strong>mundo</strong></p>

Se cierra strong y después p: las cajas quedan una dentro de otra.

<!-- Así no -->
<p>Hola <strong>mundo</p></strong>

Aquí las etiquetas se cruzan: p se cierra antes que strong, que se abrió después. El navegador intenta arreglarlo por su cuenta y el resultado es impredecible.

Es el error que más tiempo cuesta

Un cruce de etiquetas no da un mensaje de error. La página carga igual, pero algo se ve raro y no es evidente dónde. Por eso vale la pena escribir siempre el cierre inmediatamente después de la apertura, y recién entonces llenar el contenido.

Indentación

Cada nivel de anidación se escribe dos espacios más adentro que el anterior:

<!-- un comentario no se ve en la página -->
<main>
  <article>
    <h2>Título</h2>
  </article>
</main>

Al navegador la indentación le da exactamente igual: podrías escribir todo en una línea y funcionaría. A ti no: es lo que te permite ver de un vistazo qué está dentro de qué.

VSCode lo ordena solo

Shift + Alt + F formatea el documento completo y arregla la indentación. Si tienes Prettier instalado, además puedes activar Format on Save y se ordena cada vez que guardas.

Padre e hijo

Un elemento que está dentro de otro es su hijo; el de afuera es su padre. En el ejemplo de arriba, h2 es hijo de article, que a su vez es hijo de main.

Es vocabulario que vas a necesitar en cuanto lleguemos a CSS: muchos selectores se escriben justamente en términos de padres e hijos.

El esqueleto de una página

Toda página HTML tiene la misma estructura mínima:

<!DOCTYPE html>
<html lang="es">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta name="description" content="Página personal de Ana Soto" />
    <link rel="icon" href="img/favicon.png" />
    <title>Sobre mí · Ana Soto</title>
  </head>
  <body>
    <nav>
      <!-- menú -->
    </nav>
    <h1>Hola mundo</h1>
    <footer>
      <!-- pie -->
    </footer>
  </body>
</html>
ParteQué es
<!DOCTYPE html>Le dice al navegador que esto es HTML5. Va siempre en la primera línea
<html lang="es">Envuelve todo el documento. El lang declara el idioma del contenido
<head>Información que no se ve en la página
<body>Todo lo que sí se ve: textos, imágenes, tablas y formularios
<nav>El menú del sitio, arriba: los enlaces a las otras vistas
<footer>El pie de la página, abajo: autoría, contacto, año

nav y footer ya vienen en el esqueleto porque son las dos zonas que se repiten igual en todas las vistas del sitio.

Qué va dentro del head

Nada de esto se ve en la página, y sin embargo cada línea cambia algo.

LíneaQué haceQué pasa si falta
<meta charset="UTF-8">Declara cómo se codifican los caracteresLas tildes y la ñ salen como símbolos raros
<meta name="viewport" …>Le dice al móvil que use el ancho real de la pantallaEl móvil finge una pantalla de escritorio y encoge todo
<meta name="description" …>El resumen que muestra Google bajo el títuloEl buscador inventa uno con el primer texto que encuentre
<link rel="icon" …>El favicon: el ícono de la pestañaSale el ícono genérico del navegador
<title>El texto de la pestaña y del resultado en GoogleLa pestaña muestra la ruta del archivo
lang="es" (en <html>)El idioma del contenidoEl lector de pantalla lee en inglés, y el navegador ofrece traducir del idioma equivocado

Sin <meta name="viewport"> la página no sirve en el móvil

Es una sola línea, y es la que decide si la página funciona o no en un celular. Cuando lleguemos a Tailwind, sin ella nada de lo responsivo va a funcionar.

El title es distinto en cada vista

Es lo que se ve en la pestaña y en los favoritos. Contacto · Ana Soto dice dónde estás; Documento o index.html repetido en las tres vistas, no.

Atajos de Emmet

VSCode trae Emmet, que expande una abreviatura en HTML completo. Se escribe la abreviatura y se aprieta Tab (o Enter, si aparece la sugerencia).

EscribesObtienes
!El esqueleto completo de la página
ul>li*3Una ul con tres li dentro (> es “dentro”, * repite)
nav>ul>li*3>aLa navbar entera, con sus tres enlaces
p.destacado<p class="destacado"></p> (el punto es la clase)
img<img src="" alt="">, con los dos atributos ya puestos

El esqueleto de Emmet viene en inglés

! escribe <html lang="en"> y <title>Document</title>. Cámbialos a lang="es" y a un título propio en cuanto lo generes.

¿Qué es un div?

Un div es una caja sin significado: no describe qué es el contenido, solo lo agrupa para poder tratarlo como un bloque.

<div>
  <h2>Sobre mí</h2>
  <p>Estudio Análisis de Sistemas.</p>
</div>

El div envuelve los dos elementos: ahora son un solo bloque, que se puede mover, alinear o pintar de un color como una sola unidad.

DIV y Span

<div><span>
TipoDe bloqueEn línea
Qué haceOcupa todo el ancho disponible y empuja lo que sigue hacia abajoMarca un trozo de texto sin cortar el párrafo
Para quéAgrupar varios elementosDestacar o marcar una palabra dentro de un texto
<p>Hola <span>Ana</span></p>

Bloque y línea

Esa diferencia entre div y span no es cosa de esas dos etiquetas: todo elemento de HTML es de bloque o de línea, y eso decide cómo se acomoda en la página.

De bloqueEn línea
AnchoOcupa todo el disponibleSolo lo que mide su contenido
SaltoEmpuja hacia abajo lo que sigueSe queda en la misma línea
Ejemplosdiv, p, h1–h6, ul, li, section, main, footerspan, a, strong, em, img

La regla de anidación que se deriva de esto

Un elemento de texto en línea no puede contener uno de bloque. <span><div>…</div></span> es inválido; <div><span>…</span></div> es correcto. Lo mismo pasa con <p><div>…</div></p>: un párrafo solo admite contenido en línea.

La excepción que vas a ver seguido es <a>: en HTML5 un enlace sí puede envolver bloques, como una tarjeta completa que se pueda pulsar.

Esta distinción es la base de todo el modelo de caja de CSS, así que conviene tenerla clara desde ahora.

Si existe una etiqueta con significado, úsala

El vicio más común de quien empieza es llenar la página de div. Si la zona que estás marcando es el menú, va en <nav>; si es el contenido principal, en <main>; si es el pie, en <footer>.

El div es para cuando ninguna etiqueta semántica aplica.

Esto se llama escribir HTML semántico, y tiene tres consecuencias prácticas: los lectores de pantalla pueden anunciar las zonas de la página, los buscadores entienden mejor el contenido, y tu propio código se lee solo.

Checkpoint

Intenta responder antes de desplegar cada pregunta.