SEO on-page con HTML: metas, H1, canonical y Open Graph
El SEO on-page es todo lo que puedes hacer dentro de tu propia página para mejorar su posicionamiento en buscadores. Gran parte de ese trabajo ocurre en el HTML: en el <head>, en la estructura de encabezados y en el marcado semántico del contenido.
Esta lección cubre lo esencial que todo desarrollador debería tener claro.
El <head>: la base del SEO
Lo que el usuario no ve en pantalla tiene tanto o más impacto en el SEO que lo que sí ve. El <head> es donde le dices a Google quién eres, qué haces y cómo quieres aparecer.
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>HTML Intermedio: técnicas avanzadas para la web | ElData</title>
<meta
name="description"
content="Domina lazy loading, dialog nativo, atributos data-* y SEO on-page con HTML. Curso intermedio para desarrolladores frontend."
/>
<link rel="canonical" href="https://eldata.dev/cursos/html-intermedio/06-seo-onpage" />
</head>
<title>: el título más importante
El <title> es lo que aparece en la pestaña del navegador y, sobre todo, como enlace azul en los resultados de búsqueda.
<title>Aprende CSS Grid desde cero | ElData</title>
Buenas prácticas
- Longitud: entre 50 y 60 caracteres. Google trunca lo que pase de ahí.
- Incluye la palabra clave principal cerca del inicio.
- Sé descriptivo y específico: evita títulos genéricos como “Inicio” o “Página 1”.
- Unique: cada página debe tener un título diferente. Duplicar títulos confunde a Google.
- Incluye el nombre del sitio al final, separado por
|o–.
<!-- ✅ Bien -->
<title>CSS Grid: guía completa con ejemplos | ElData</title>
<!-- ❌ Mal: demasiado genérico -->
<title>Guía CSS</title>
<!-- ❌ Mal: demasiado largo, Google lo trunca -->
<title>Aprende a usar CSS Grid Layout para crear diseños complejos y responsivos de forma sencilla en cualquier proyecto web moderno</title>
meta description: el texto del snippet
La descripción no es un factor de ranking directo, pero sí afecta al CTR (click-through rate): cuánta gente hace clic en tu resultado cuando lo ve.
<meta
name="description"
content="Domina CSS Grid con ejemplos reales. Aprende a definir filas, columnas, áreas y alineación. Guía práctica para developers."
/>
Buenas prácticas
- Longitud: entre 120 y 155 caracteres.
- Incluye un call to action: “Aprende”, “Descubre”, “Guía práctica”…
- Menciona la palabra clave de forma natural.
- Única por página: igual que el título, no la dupliques.
- Si no la defines, Google la generará automáticamente (y suele quedar peor).
El H1: un único por página
El <h1> es el título principal del contenido. Google le da especial importancia para entender de qué trata la página.
Regla fundamental: solo un <h1> por página.
<!-- ✅ Correcto: un solo H1, el resto son H2, H3... -->
<h1>CSS Grid: guía completa con ejemplos</h1>
<h2>¿Qué es CSS Grid?</h2>
<h3>Diferencias con Flexbox</h3>
<h2>Cómo definir columnas y filas</h2>
<h3>La unidad fr</h3>
<h3>repeat() y minmax()</h3>
<!-- ❌ Incorrecto: múltiples H1 confunden la jerarquía -->
<h1>CSS Grid</h1>
<h1>Guía completa</h1>
La jerarquía de encabezados importa
Los encabezados no son solo estilos tipográficos: son la estructura semántica del documento. Deben tener sentido como un índice de contenidos.
H1: Guía de CSS Grid
H2: Fundamentos
H3: display: grid
H3: columnas y filas
H2: Técnicas avanzadas
H3: Template areas
H3: Auto-fill y auto-fit
H2: Ejemplos reales
No saltes niveles (de H2 a H4 directamente). Hazlo en orden descendente.
canonical: evitar contenido duplicado
La URL canónica le dice a Google cuál es la versión “oficial” de una página cuando el mismo contenido puede estar accesible desde varias URLs.
<!-- En todas las variantes de la URL, apuntando a la canónica -->
<link rel="canonical" href="https://eldata.dev/cursos/html-intermedio" />
¿Cuándo necesitas canonical?
- Tienes paginación (
/blog,/blog?page=2,/blog?pagina=2) - El mismo contenido es accesible con y sin
www - Tienes parámetros de seguimiento en URLs (
?utm_source=newsletter) - Tienes versiones mobile y desktop en URLs distintas
- Un artículo aparece en varias categorías (
/css/gridy/guias/grid)
<!-- URL con parámetros UTM -->
<!-- https://eldata.dev/cursos?utm_source=twitter -->
<link rel="canonical" href="https://eldata.dev/cursos" />
Importante: la URL canónica siempre debe ser absoluta (con https://).
meta robots: controlar el indexado
Le says a Google qué puede y qué no puede hacer con tu página:
<!-- Indexar la página y seguir sus enlaces (por defecto) -->
<meta name="robots" content="index, follow" />
<!-- No indexar esta página (no aparece en Google) -->
<meta name="robots" content="noindex" />
<!-- No seguir los enlaces de esta página -->
<meta name="robots" content="nofollow" />
<!-- Ni indexar ni seguir enlaces -->
<meta name="robots" content="noindex, nofollow" />
<!-- No mostrar snippet (descripción en resultados) -->
<meta name="robots" content="index, nosnippet" />
Páginas donde usar noindex:
- Panel de administración
- Páginas de confirmación (“Gracias por tu compra”)
- Páginas de resultados de búsqueda interna
- Páginas de staging/desarrollo
Open Graph: cómo se ve al compartir en redes
Cuando alguien comparte tu URL en Twitter, LinkedIn o WhatsApp, esas plataformas leen las Open Graph tags para mostrar el título, la imagen y la descripción correctos.
<!-- Tipo de contenido -->
<meta property="og:type" content="article" />
<!-- Título que aparece en la previsualización -->
<meta property="og:title" content="CSS Grid: guía completa con ejemplos" />
<!-- Descripción del contenido -->
<meta
property="og:description"
content="Domina CSS Grid con ejemplos reales. Aprende a definir filas, columnas, áreas y alineación."
/>
<!-- URL canónica -->
<meta property="og:url" content="https://eldata.dev/cursos/css/grid" />
<!-- Imagen de previsualización (recomendado: 1200×630px) -->
<meta property="og:image" content="https://eldata.dev/img/og/css-grid.jpg" />
<meta property="og:image:width" content="1200" />
<meta property="og:image:height" content="630" />
<meta property="og:image:alt" content="Diagrama de CSS Grid con ejemplos de código" />
<!-- Nombre del sitio -->
<meta property="og:site_name" content="ElData" />
<!-- Idioma -->
<meta property="og:locale" content="es_ES" />
Para artículos
Si la página es un artículo, puedes añadir metadatos específicos:
<meta property="og:type" content="article" />
<meta property="article:published_time" content="2026-03-20T10:00:00Z" />
<meta property="article:author" content="https://eldata.dev/about" />
<meta property="article:section" content="HTML" />
<meta property="article:tag" content="HTML" />
<meta property="article:tag" content="SEO" />
Twitter Cards
Twitter (X) usa sus propias meta tags además de Open Graph:
<!-- Tarjeta grande con imagen -->
<meta name="twitter:card" content="summary_large_image" />
<!-- Tarjeta pequeña con miniatura -->
<!-- <meta name="twitter:card" content="summary" /> -->
<meta name="twitter:title" content="CSS Grid: guía completa con ejemplos" />
<meta
name="twitter:description"
content="Domina CSS Grid con ejemplos reales."
/>
<meta name="twitter:image" content="https://eldata.dev/img/og/css-grid.jpg" />
<meta name="twitter:image:alt" content="Diagrama de CSS Grid" />
<!-- Cuenta del autor -->
<meta name="twitter:creator" content="@eldata_dev" />
Si ya tienes las Open Graph tags, Twitter las usará como fallback. Solo necesitas las Twitter Cards si quieres un comportamiento diferente o añadir el twitter:card.
Structured Data: hablar con Google directamente
El marcado estructurado (Schema.org) permite a Google entender el contenido de tu página a un nivel más profundo y mostrarlo con rich snippets: valoraciones con estrellas, precio de productos, pasos de recetas, preguntas frecuentes…
Se implementa con JSON-LD dentro de un <script type="application/ld+json">:
Artículo
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Article",
"headline": "CSS Grid: guía completa con ejemplos",
"description": "Domina CSS Grid con ejemplos reales.",
"datePublished": "2026-03-20",
"dateModified": "2026-03-20",
"author": {
"@type": "Person",
"name": "ElData",
"url": "https://eldata.dev/about"
},
"publisher": {
"@type": "Organization",
"name": "ElData",
"logo": {
"@type": "ImageObject",
"url": "https://eldata.dev/logo.png"
}
},
"image": "https://eldata.dev/img/og/css-grid.jpg"
}
</script>
FAQ (preguntas frecuentes)
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "FAQPage",
"mainEntity": [
{
"@type": "Question",
"name": "¿CSS Grid reemplaza a Flexbox?",
"acceptedAnswer": {
"@type": "Answer",
"text": "No. Grid es para diseños bidimensionales (filas y columnas). Flexbox es para diseños unidimensionales (una fila o una columna)."
}
},
{
"@type": "Question",
"name": "¿CSS Grid funciona en todos los navegadores?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Sí, CSS Grid tiene soporte en todos los navegadores modernos desde 2017."
}
}
]
}
</script>
El <head> completo y bien ordenado
Este es el orden recomendado para los elementos del <head>:
<head>
<!-- 1. Charset: siempre el primero -->
<meta charset="UTF-8" />
<!-- 2. Viewport: segundo -->
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<!-- 3. Title y description -->
<title>Título de la página | Sitio</title>
<meta name="description" content="Descripción de la página." />
<!-- 4. Canonical y robots -->
<link rel="canonical" href="https://tusitio.com/pagina" />
<meta name="robots" content="index, follow" />
<!-- 5. Open Graph -->
<meta property="og:type" content="website" />
<meta property="og:title" content="Título de la página" />
<meta property="og:description" content="Descripción." />
<meta property="og:url" content="https://tusitio.com/pagina" />
<meta property="og:image" content="https://tusitio.com/img/og.jpg" />
<!-- 6. Twitter Cards -->
<meta name="twitter:card" content="summary_large_image" />
<!-- 7. Estilos críticos -->
<link rel="stylesheet" href="/estilos.css" />
<!-- 8. Recursos: favicon, fuentes -->
<link rel="icon" href="/favicon.ico" />
<link rel="preconnect" href="https://fonts.googleapis.com" />
<!-- 9. Structured Data -->
<script type="application/ld+json">{ ... }</script>
</head>
Checklist de SEO on-page
Antes de publicar cualquier página, revisa:
-
<title>único, entre 50–60 caracteres, con la keyword principal. -
<meta name="description">única, entre 120–155 caracteres. - Un solo
<h1>por página, con la keyword principal. - Jerarquía de encabezados correcta (H1 → H2 → H3, sin saltos).
-
<link rel="canonical">apuntando a la URL canónica conhttps://. - Open Graph completo:
og:title,og:description,og:image,og:url. - Imagen OG de 1200×630px, con texto legible y sin texto recortado.
-
meta robotsconfigurado correctamente (index/noindex). - Atributos
altdescriptivos en todas las imágenes. - URLs limpias, en minúsculas, con guiones (no guiones bajos).
¿Qué hemos aprendido?
- El
<title>y la<meta description>son los elementos más visibles del SEO. - Un único
<h1>por página con la keyword principal es obligatorio. - El
canonicalevita penalizaciones por contenido duplicado. - Las Open Graph tags controlan cómo se ve tu página al compartirla.
- El JSON-LD (Schema.org) permite a Google mostrar rich snippets.
¡Curso completado!
Has terminado el curso de HTML Intermedio/Avanzado. Ahora conoces las herramientas que separan un HTML que funciona de un HTML que rinde, es accesible y está bien posicionado.
Próximos pasos sugeridos: