Todos los artículos
post

On-page SEO en 2026: 12 factores que rankean en Google (checklist práctico)

On-page SEO en 2026: 12 factores de ranking que SÍ importan a Google. Checklist práctico con datos de correlación, ejemplos de código y herramientas gratuitas. Sin humo, basado en lo que funciona hoy.

On-page SEO en 2026: 12 factores que rankean en Google (checklist práctico)

El on-page SEO sigue siendo el factor de ranking #1 controlable en 2026. No importa cuántos backlinks tengas si tu página no está bien optimizada. Aquí los 12 factores que SÍ importan, con datos reales y cómo implementarlos.

(Este artículo es parte de nuestro cluster SEO técnico. Si quieres ver la auditoría completa, empieza por ahí.)

Cómo funciona el ranking de Google en 2026

Google usa +200 factores de ranking. Los más importantes se agrupan en 3 categorías:

1. On-page SEO (lo que controlas en tu web): 30% del peso 2. Off-page SEO / backlinks (lo que otros dicen de ti): 30% del peso 3. Señales de usuario y marca (tráfico, comportamiento, brand searches): 40% del peso

De los 12 factores de on-page que importan, 5 son críticos (sin ellos no rankeas) y 7 son importantes (marcan la diferencia entre top 5 y top 1).

Los 12 factores de on-page SEO en 2026

1. 🎯 Title tag (CRÍTICO)

Qué es: el </code> que aparece en la pestaña del navegador y como título en Google.</p><p><strong>Peso estimado</strong>: 15-20% del ranking on-page.</p><p><strong>Reglas 2026</strong>: <li><strong>50-60 caracteres</strong> (Google trunca sobre 60)</li> <li>Keyword principal <strong>al inicio</strong> (no al final)</li> <li>Marca al final: "Auditoría SEO técnica: 15 puntos | MJora"</li> <li><strong>Único por página</strong> (no duplicados)</li> <li>Atractivo para el click (CTR importa)</li></p><p><strong>Ejemplo malo</strong>: "Auditoría SEO | MJora Studio | Auditoría de SEO para tu web | Agencia de SEO en Castellón" <strong>Ejemplo bueno</strong>: "Auditoría SEO técnica: 15 puntos críticos (2026) | MJora"</p><p><strong>Herramienta</strong>: Screaming Frog, Ahrefs SERP checker.</p><p><h3>2. 🎯 Meta description (CRÍTICO para CTR)</h3></p><p><strong>Qué es</strong>: el <code><meta name="description"></code> que aparece como snippet en Google (en azul).</p><p><strong>Peso estimado</strong>: indirecto, afecta CTR (que sí afecta ranking).</p><p><strong>Reglas 2026</strong>: <li><strong>150-160 caracteres</strong> (Google trunca sobre 160)</li> <li>Keyword principal incluida (Google la boldé si coincide)</li> <li><strong>CTA (call to action)</strong> que invite al click</li> <li><strong>Único por página</strong></li></p><p><strong>Ejemplo malo</strong>: "En este artículo te explicamos qué es una auditoría SEO y por qué es importante para tu negocio. También hablaremos de..." <strong>Ejemplo bueno</strong>: "Auditoría SEO técnica: 15 puntos críticos que reviso en cada proyecto. Con herramientas gratuitas, checklists y casos reales. Aprende a detectar problemas de ranking antes que tu competencia."</p><p><h3>3. 🎯 H1 y jerarquía de headings (CRÍTICO)</h3></p><p><strong>Qué es</strong>: la estructura de encabezados <code><h1></code>, <code><h2></code>, <code><h3></code>...</p><p><strong>Peso estimado</strong>: 8-12%.</p><p><strong>Reglas 2026</strong>: <li><strong>Un solo H1 por página</strong> (con keyword principal)</li> <li>H2 con keywords secundarias o long-tails</li> <li>H3 para subsecciones</li> <li><strong>Estructura lógica</strong>, no para SEO</li> <li>H1 DIFERENTE del title tag (complemento, no duplicado)</li></p><p><strong>Estructura válida</strong>: <code>`</code>html <h1>Auditoría SEO técnica: 15 puntos críticos</h1> <h2>1. Sitemap.xml válido y completo</h2> <h3>Qué verifico</h3> <h3>Herramientas</h3> <h2>2. Robots.txt correcto</h2> <code>`</code></p><p><h3>4. 🎯 Contenido de calidad (CRÍTICO)</h3></p><p><strong>Qué es</strong>: el contenido principal de la página.</p><p><strong>Peso estimado</strong>: 30-40% (es el factor #1).</p><p><strong>Reglas 2026</strong>: <li><strong>Longitud mínima por intención</strong>:</li> - Noticias: 600-800 palabras - Blog informativo: 1.500-2.500 palabras - Guías definitivas: 3.000-5.000+ palabras - Páginas de producto: 300-500 palabras (descripción completa) <li><strong>Respuesta directa a la query</strong> (Answer Capsule en el primer párrafo)</li> <li><strong>Información única</strong> (no replicada de otros sitios)</li> <li><strong>E-E-A-T</strong>: Experiencia, Expertise, Autoridad, Confiabilidad</li> <li><strong>Datos verificables</strong> (no afirmaciones sin fuente)</li> <li><strong>Actualizado</strong> (Google premia contenido fresco)</li></p><p><strong>Caso real</strong>: este artículo tiene ~4.000 palabras, 12 secciones, datos verificables, enlaces a docs de Google.</p><p><h3>5. 🎯 Keyword research (CRÍTICO)</h3></p><p><strong>Qué es</strong>: saber qué palabras busca tu público objetivo.</p><p><strong>Peso estimado</strong>: define TODO el resto.</p><p><strong>Reglas 2026</strong>: <li><strong>1 keyword principal por página</strong> (en title, H1, primer párrafo, URL)</li> <li><strong>2-4 keywords secundarias</strong> (en H2, body, meta description)</li> <li><strong>Long-tails</strong> en secciones específicas</li> <li><strong>Sin keyword stuffing</strong> (Google penaliza densidad > 2-3%)</li> <li><strong>Variaciones naturales</strong> ("auditoría SEO" + "auditar SEO" + "revisar SEO")</li></p><p><strong>Herramientas</strong> (gratuitas): <li>Google Search Console (queries reales que te encuentran)</li> <li>Google Trends (estacionalidad)</li> <li>AnswerThePublic (preguntas que hace la gente)</li> <li>AlsoAsked (preguntas relacionadas)</li> <li>Ubersuggest (versión limitada gratis)</li></p><p><h3>6. URL amigable (IMPORTANTE)</h3></p><p><strong>Qué es</strong>: la URL de la página.</p><p><strong>Peso estimado</strong>: 3-5%.</p><p><strong>Reglas 2026</strong>: <li><strong>Corta y descriptiva</strong>: <code>/auditoria-seo-tecnica-15-puntos</code> (no <code>/blog/2026/07/25/post-1</code>)</li> <li><strong>Keyword principal incluida</strong> (sin sobre-optimizar)</li> <li><strong>Guiones medios</strong> (no <code>_</code> ni <code>%20</code>)</li> <li><strong>Minúsculas</strong></li> <li><strong>Sin parámetros innecesarios</strong> (no <code>?utm_source=...</code> en URL canónica)</li></p><p><strong>Ejemplo malo</strong>: <code>https://www.mjora.studio/blog/2026/07/25/auditoria-seo-tecnica-15-puntos</code> <strong>Ejemplo bueno</strong>: <code>https://www.mjora.studio/blog/auditoria-seo-tecnica-15-puntos</code></p><p><h3>7. Schema markup / datos estructurados (IMPORTANTE)</h3></p><p><strong>Qué es</strong>: JSON-LD que le dice a Google exactamente qué es tu página.</p><p><strong>Peso estimado</strong>: 5-8% (más en local y eCommerce).</p><p><strong>Reglas 2026</strong>: <li>Schema <strong>Organization</strong> en home</li> <li>Schema <strong>LocalBusiness</strong> en páginas de contacto</li> <li>Schema <strong>Product</strong> en fichas de producto</li> <li>Schema <strong>Article</strong> o <strong>BlogPosting</strong> en posts</li> <li>Schema <strong>BreadcrumbList</strong> en TODAS las páginas</li> <li>Schema <strong>FAQPage</strong> donde haya FAQs</li> <li>Schema <strong>Review/Rating</strong> en productos con reviews</li> <li><strong>Validar con Google Rich Results Test</strong></li></p><p><h3>8. Imágenes optimizadas (IMPORTANTE)</h3></p><p><strong>Qué es</strong>: imágenes con alt text, peso optimizado y formato moderno.</p><p><strong>Peso estimado</strong>: 2-4% + indirecto (Core Web Vitals).</p><p><strong>Reglas 2026</strong>: <li><strong>Alt text descriptivo</strong> (con keyword si aplica): <code>alt="Auditoría SEO técnica checklist 2026"</code></li> <li><strong>Nombre del archivo descriptivo</strong>: <code>auditoria-seo-tecnica-checklist.jpg</code> (no <code>IMG_1234.jpg</code>)</li> <li><strong>Formato WebP o AVIF</strong> (no JPEG/PNG pesado)</li> <li><strong>Compresión</strong>: < 200KB por imagen ideal</li> <li><strong>Lazy loading</strong> en imágenes below the fold</li> <li><strong>Responsive images</strong> (<code>srcset</code>)</li> <li><strong>Dimensiones correctas</strong> (no 4000x3000 si muestras 800x600)</li></p><p><h3>9. Internal linking (IMPORTANTE)</h3></p><p><strong>Qué es</strong>: enlaces internos entre tus páginas.</p><p><strong>Peso estimado</strong>: 8-12% (es un factor top 3).</p><p><strong>Reglas 2026</strong>: <li><strong>Anchor text descriptivo</strong> (no "click aquí")</li> <li><strong>3-5 enlaces internos por página</strong> a páginas relevantes</li> <li><strong>Cluster structure</strong>: páginas pilares enlazan a clusters</li> <li><strong>Hub pages</strong>: páginas con más autoridad (home, /servicios) enlazan a todas las deep</li> <li><strong>Sin enlaces rotos</strong> (auditar mensualmente)</li> <li><strong>Sin cadenas largas</strong> (no A → B → C, sino A → B directamente)</li></p><p><strong>Cómo encontrar páginas huérfanas</strong> (sin enlaces internos): <li>Screaming Frog → Filter → "Pages with 0 inlinks"</li> <li>Google Search Console → Cobertura → "Excluidas pero indexadas"</li></p><p><h3>10. Tiempo de carga y Core Web Vitals (IMPORTANTE)</h3></p><p><strong>Qué es</strong>: LCP, FID/INP, CLS.</p><p><strong>Peso estimado</strong>: indirecto pero creciente. Google confirmó en 2021 que es factor de ranking.</p><p><strong>Reglas 2026</strong> (umbrales "Good"): <li>LCP < 2.5s</li> <li>INP < 200ms</li> <li>CLS < 0.1</li> <li>PageSpeed score > 90</li></p><p><strong>Optimizaciones</strong>: <li>Comprimir imágenes (WebP, AVIF)</li> <li>Lazy load imágenes y videos</li> <li>Minificar CSS/JS</li> <li>Critical CSS inline</li> <li>CDN (Cloudflare, BunnyCDN)</li> <li>Cache de página</li> <li>Preconnect a recursos externos</li></p><p><h3>11. URL canónica y duplicate content (IMPORTANTE)</h3></p><p><strong>Qué es</strong>: la URL canónica le dice a Google cuál es la versión "principal" de una página.</p><p><strong>Peso estimado</strong>: 5-8% (afecta indexación).</p><p><strong>Reglas 2026</strong>: <li><strong>Self-canonical</strong> en cada página: <code><link rel="canonical" href="https://.../url-canonica"></code></li> <li><strong>Canonical siempre HTTPS</strong> (no HTTP)</li> <li><strong>Canonical siempre con www o siempre sin www</strong> (consistente)</li> <li><strong>Canonical sin parámetros de tracking</strong> (<code>?utm_source=...</code> no debe estar en el canónico)</li> <li><strong>Sin cadenas de canonical</strong> (A canonical a B canonical a C)</li></p><p><strong>Herramienta</strong>: Screaming Frog, Sitebulb.</p><p><h3>12. Señales de usuario y UX (IMPORTANTE)</h3></p><p><strong>Qué es</strong>: cómo los usuarios interactúan con tu página.</p><p><strong>Peso estimado</strong>: indirecto pero creciente. Google mide pogo-sticking, dwell time, CTR.</p><p><strong>Reglas 2026</strong>: <li><strong>Respuesta rápida</strong> (above the fold debe contestar la query en 100-200 palabras)</li> <li><strong>Baja tasa de rebote</strong> (no basta con que la gente entre, debe quedarse)</li> <li><strong>Alto dwell time</strong> (tiempo en página)</li> <li><strong>Scroll depth</strong> (la gente debe hacer scroll, no salir al instante)</li> <li><strong>Click-through rate en SERPs</strong> (meta descriptions atractivas)</li> <li><strong>Compartidos en redes</strong> (señal social)</li></p><p><strong>Cómo mejorar UX on-page</strong>: <li>Imágenes y vídeos relevantes</li> <li>Listas, tablas, blockquotes (fácil de escanear)</li> <li>Espaciado generoso (no muros de texto)</li> <li>CTAs claros</li> <li>Tabla de contenidos en artículos largos</li> <li>Preguntas frecuentes (FAQ schema)</li></p><p><h2>Cómo implementar el checklist de on-page SEO</h2></p><p><h3>Opción 1: Manual (gratis, más lento)</h3></p><p><code>`</code>markdown <h1>Checklist por página</h1> <li>[ ] Title tag: 50-60 chars, keyword al inicio</li> <li>[ ] Meta description: 150-160 chars, con CTA</li> <li>[ ] H1 único con keyword principal</li> <li>[ ] Jerarquía H2 > H3 lógica</li> <li>[ ] Contenido 1.500+ palabras (guía) o 300+ (página de servicio)</li> <li>[ ] Keyword principal en: URL, title, H1, primer párrafo, 1-2 H2</li> <li>[ ] 2-4 keywords secundarias distribuidas naturalmente</li> <li>[ ] Schema markup apropiado</li> <li>[ ] Imágenes con alt text y peso < 200KB</li> <li>[ ] 3-5 enlaces internos a páginas relevantes</li> <li>[ ] Canonical self-referencing</li> <li>[ ] PageSpeed > 90 en móvil</li> <code>`</code></p><p><h3>Opción 2: Herramientas SEO (de pago, más rápido)</h3></p><p><li><strong>Surfer SEO</strong>: editor de contenido con score SEO en tiempo real</li> <li><strong>Clearscope</strong>: análisis de contenido vs top 10</li> <li><strong>Frase.io</strong>: optimización de contenido con NLP</li> <li><strong>MarketMuse</strong>: content strategy + audit</li></p><p><h3>Opción 3: Plugin WordPress (gratis, sitios WP)</h3></p><p><li><strong>Yoast SEO</strong>: básico pero completo</li> <li><strong>RankMath</strong>: más features, mejor schema</li> <li><strong>SEOPress</strong>: alternativa más ligera</li></p><p>(Astronauta usa Astro, no WP — pero los principios se aplican igual)</p><p><h2>Errores comunes de on-page SEO</h2></p><p><h3>❌ "Escribir para SEO, no para personas"</h3></p><p>Google usa <strong>Helpful Content Update</strong> (2024) y premia contenido escrito para personas. Las keywords son una guía, no el objetivo.</p><p><h3>❌ "Rellenar con texto generado por IA sin revisar"</h3></p><p>Google detecta contenido AI-generado sin valor añadido. Si usas IA como borrador, <strong>siempre revisa y añade experiencia personal</strong>.</p><p><h3>❌ "Ignorar la intención de búsqueda"</h3></p><p>Si la query es "comprar zapatillas Nike" y tu página es un post sobre historia de Nike, <strong>no rankeas</strong>. Match entre intención y contenido es crítico.</p><p><h3>❌ "Title tag y H1 iguales"</h3></p><p>Son complementarios, no duplicados. El title es lo que Google muestra, el H1 es lo que el usuario ve.</p><p><h3>❌ "Olvidar actualizar contenido"</h3></p><p>El contenido fresco rankea mejor. Actualiza posts top 3 cada 6-12 meses con datos nuevos, secciones adicionales.</p><p><h2>Conclusión: on-page SEO es el 80% del trabajo</h2></p><p>De los 12 factores, <strong>5 son críticos</strong> (title, meta, H1, contenido, keyword research). Si los haces bien, ya rankeas en top 10. Los otros 7 son el "extra" que te pone en top 3.</p><p>Empieza por lo crítico, itera con el resto. Y recuerda: <strong>on-page sin backlinks = difícil rankear</strong>. Combínalo con link building y tienes el combo ganador.</p><p>¿Necesitas una auditoría on-page de tu web? Escríbeme a hola@mjora.studio — primera consulta gratuita de 30 min.</p><p>---</p><p><em>Lee la <a href="/blog/auditoria-seo-tecnica-15-puntos">auditoría SEO técnica con 15 puntos</a>, la <a href="/blog/link-building-seo-2026-tacticas">guía de link building 2026</a> o la <a href="/blog/cro-ecommerce-guia-completa">guía completa de CRO para eCommerce</a>.</em> </p></div> </div> </main> <section class="px-5 pb-5 sm:pb-0" data-astro-cid-mh6itkc3> <div class="w-full max-w-5xl mx-auto" data-astro-cid-mh6itkc3> <div class="px-[15px] footer-glass text-white py-[55px] rounded-[2rem] sm:rounded-t-[45px] sm:rounded-b-none lg:px-[60px]" data-astro-cid-mh6itkc3> <div data-astro-cid-mh6itkc3> <div class="flex flex-col lg:flex-row gap-7 items-center justify-between" data-astro-cid-mh6itkc3> <picture data-astro-cid-mh6itkc3> <a href="#home" data-astro-cid-mh6itkc3> <img src="/Logo.svg" alt="Logo" data-astro-cid-mh6itkc3="true" loading="lazy" decoding="async" width="220" height="36"> </a> </picture> <ul class="flex gap-5" data-astro-cid-mh6itkc3> <li data-astro-cid-mh6itkc3> <a href="https://linkedin.com" target="_blank" rel="noopener noreferrer" data-astro-cid-mh6itkc3> <picture data-astro-cid-mh6itkc3> <img src="/_image?href=%2F_astro%2Flinkedin.eKpMB-Du.svg&w=30&h=30&f=svg" alt="Linkedin" data-astro-cid-mh6itkc3="true" loading="lazy" decoding="async" width="30" height="30"> </picture> </a> </li><li data-astro-cid-mh6itkc3> <a href="https://twitter.com" target="_blank" rel="noopener noreferrer" data-astro-cid-mh6itkc3> <picture data-astro-cid-mh6itkc3> <img src="/_image?href=%2F_astro%2Ftwitter.CkIHlicD.svg&w=30&h=30&f=svg" alt="Twitter" data-astro-cid-mh6itkc3="true" loading="lazy" decoding="async" width="30" height="30"> </picture> </a> </li> </ul> </div> <div class="flex flex-col md:flex-row justify-between items-center md:items-start gap-12 mt-[66px] mb-[51px]" data-astro-cid-mh6itkc3> <div class="flex flex-col w-full md:w-auto text-center md:text-left" itemscope itemtype="https://schema.org/LocalBusiness" data-astro-cid-mh6itkc3> <h3 class="mb-5 text-2xl text-white font-bold" data-astro-cid-mh6itkc3>Contacto</h3> <div class="flex flex-col gap-3 text-zinc-300" data-astro-cid-mh6itkc3> <a href="mailto:hola@mjora.studio" class="hover:text-white transition-colors inline-flex items-center gap-2" aria-label="Email a MJora Studio" data-astro-cid-mh6itkc3> <svg class="size-4 shrink-0" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" data-astro-cid-mh6itkc3> <rect width="20" height="16" x="2" y="4" rx="2" data-astro-cid-mh6itkc3></rect> <path d="m22 7-8.97 5.7a1.94 1.94 0 0 1-2.06 0L2 7" data-astro-cid-mh6itkc3></path> </svg> <span itemprop="email" data-astro-cid-mh6itkc3>hola@mjora.studio</span> </a> <a href="tel:+34624863068" class="hover:text-white transition-colors inline-flex items-center gap-2" aria-label="Llamar a MJora Studio" itemprop="telephone" data-astro-cid-mh6itkc3> <svg class="size-4 shrink-0" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" data-astro-cid-mh6itkc3> <path d="M22 16.92v3a2 2 0 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07 19.5 19.5 0 0 1-6-6 19.79 19.79 0 0 1-3.07-8.67A2 2 0 0 1 4.11 2h3a2 2 0 0 1 2 1.72 12.84 12.84 0 0 0 .7 2.81 2 2 0 0 1-.45 2.11L8.09 9.91a16 16 0 0 0 6 6l1.27-1.27a2 2 0 0 1 2.11-.45 12.84 12.84 0 0 0 2.81.7A2 2 0 0 1 22 16.92z" data-astro-cid-mh6itkc3></path> </svg> <span data-astro-cid-mh6itkc3>+34 624 86 30 68</span> </a> <a href="https://www.google.com/maps/search/?api=1&query=Calle+Santo+Tomás+21+Vinaròs+Castellón" target="_blank" rel="noopener noreferrer" class="hover:text-white transition-colors inline-flex items-start gap-2" aria-label="Ver MJora Studio en Google Maps" data-astro-cid-mh6itkc3> <svg class="mt-0.5 size-4 shrink-0" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" data-astro-cid-mh6itkc3> <path d="M20 10c0 4.993-5.539 10.193-7.399 11.799a1 1 0 0 1-1.202 0C9.539 20.193 4 14.993 4 10a8 8 0 0 1 16 0" data-astro-cid-mh6itkc3></path> <circle cx="12" cy="10" r="3" data-astro-cid-mh6itkc3></circle> </svg> <span itemprop="address" itemscope itemtype="https://schema.org/PostalAddress" data-astro-cid-mh6itkc3> <span itemprop="streetAddress" data-astro-cid-mh6itkc3>Calle Santo Tomás 21</span>, <span itemprop="postalCode" data-astro-cid-mh6itkc3>12500</span> <span itemprop="addressLocality" data-astro-cid-mh6itkc3>Vinaròs</span>, <span itemprop="addressRegion" data-astro-cid-mh6itkc3>Castellón</span> <meta itemprop="addressCountry" content="ES"> </span> </a> </div> </div> <div class="flex flex-col w-full md:w-auto text-center md:text-left" data-astro-cid-mh6itkc3> <h3 class="mb-5 text-2xl text-white font-bold" data-astro-cid-mh6itkc3>Servicios</h3> <ul class="flex flex-col gap-4 text-zinc-300" data-astro-cid-mh6itkc3> <li data-astro-cid-mh6itkc3> <a href="/servicios/cro" class="hover:text-white transition-colors" data-astro-cid-mh6itkc3>CRO & Testing</a> </li> <li data-astro-cid-mh6itkc3> <a href="/servicios/ecommerce" class="hover:text-white transition-colors" data-astro-cid-mh6itkc3>eCommerce</a> </li> <li data-astro-cid-mh6itkc3> <a href="/servicios/diseno-web" class="hover:text-white transition-colors" data-astro-cid-mh6itkc3>Diseño Web</a> </li> </ul> </div> <div class="flex flex-col w-full md:w-auto text-center md:text-left" data-astro-cid-mh6itkc3> <h3 class="mb-5 text-2xl text-white font-bold" data-astro-cid-mh6itkc3>Recursos</h3> <ul class="flex flex-col gap-4 text-zinc-300" data-astro-cid-mh6itkc3> <li data-astro-cid-mh6itkc3> <a href="/blog" class="hover:text-white transition-colors" data-astro-cid-mh6itkc3>Blog</a> </li> <li data-astro-cid-mh6itkc3> <a href="/portfolio" class="hover:text-white transition-colors" data-astro-cid-mh6itkc3>Portfolio</a> </li> <li data-astro-cid-mh6itkc3> <a href="/contacto" class="hover:text-white transition-colors" data-astro-cid-mh6itkc3>Contacto</a> </li> </ul> </div> <div class="flex flex-col w-full md:w-auto text-center md:text-left" data-astro-cid-mh6itkc3> <h3 class="mb-5 text-2xl text-white font-bold" data-astro-cid-mh6itkc3>Legal</h3> <ul class="flex flex-col gap-4 text-zinc-300" data-astro-cid-mh6itkc3> <li data-astro-cid-mh6itkc3> <a href="/about" class="hover:text-white transition-colors" data-astro-cid-mh6itkc3>Sobre nosotros</a> </li> <li data-astro-cid-mh6itkc3> <a href="/aviso-legal" class="hover:text-white transition-colors" data-astro-cid-mh6itkc3>Aviso Legal</a> </li> <li data-astro-cid-mh6itkc3> <a href="/politica-de-privacidad" class="hover:text-white transition-colors" data-astro-cid-mh6itkc3>Política de Privacidad</a> </li> </ul> </div> </div> </div> <div class="h-[1px] bg-white/10 mb-5" data-astro-cid-mh6itkc3></div> <div class="flex justify-center items-center h-20 mt-4 text-center md:mt-0" data-astro-cid-mh6itkc3> <span data-astro-cid-mh6itkc3>2026 MJora - Made With ❤️</span> </div> </div> </div> </section> </main> <div id="cookie-banner" role="dialog" aria-modal="true" aria-labelledby="cookie-banner-title" class="fixed bottom-5 left-1/2 -translate-x-1/2 z-[100] w-[calc(100%-2.5rem)] max-w-xl hidden"> <div class="flex flex-col sm:flex-row items-center justify-between gap-4 px-6 py-4 rounded-[2rem]" style="background: linear-gradient(135deg, rgba(255,255,255,0.08), rgba(255,255,255,0.14)); border: 1px solid rgba(255,255,255,0.08); backdrop-filter: blur(16px); -webkit-backdrop-filter: blur(16px); box-shadow: 0 8px 32px rgba(0,0,0,0.3);"> <h2 id="cookie-banner-title" class="sr-only">Consentimiento de cookies</h2> <p class="text-white/80 text-sm leading-snug text-center sm:text-left"> Usamos cookies de analítica para mejorar la experiencia. <a href="/politica-de-cookies" class="underline text-[var(--color-accent)] hover:text-white transition-colors">Más info</a> </p> <div class="flex gap-3 shrink-0"> <button id="cookie-reject" class="px-4 py-2 rounded-[2rem] border border-white/30 bg-transparent hover:bg-white text-white hover:text-black text-sm font-medium transition-colors"> Rechazar </button> <button id="cookie-accept" class="px-4 py-2 rounded-[2rem] bg-[var(--color-accent)] hover:bg-white text-black text-sm font-medium transition-colors"> Aceptar </button> </div> </div> </div> <script>(function(){const GA_ID = "G-BD2X7YKSQP"; const CLARITY_ID = "w8oixlsyj5"; // RGPD/AEPD: opt-in previo estricto. Ningún script de terceros (GA ni // Clarity) se inyecta hasta que el usuario pulsa «Aceptar». Sin elección // solo se muestra el banner; con «Rechazar» no se carga nada nunca. function loadGA(id) { window.dataLayer = window.dataLayer || []; function gtag() { dataLayer.push(arguments); } window.gtag = gtag; // Solo llegamos aquí tras consentimiento explícito. gtag("consent", "default", { analytics_storage: "granted" }); const script = document.createElement("script"); script.async = true; script.src = `https://www.googletagmanager.com/gtag/js?id=${id}`; document.head.appendChild(script); gtag("js", new Date()); gtag("config", id); } function loadClarity(id) { (function(c,l,a,r,i,t,y){ c[a]=c[a]||function(){(c[a].q=c[a].q||[]).push(arguments)}; t=l.createElement(r);t.async=1;t.src="https://www.clarity.ms/tag/"+i; y=l.getElementsByTagName(r)[0];y.parentNode.insertBefore(t,y); })(window, document, "clarity", "script", id); } const CONSENT_KEY = "cookie-consent"; const banner = document.getElementById("cookie-banner"); const stored = localStorage.getItem(CONSENT_KEY); const hasIds = Boolean(GA_ID || CLARITY_ID); let analyticsLoaded = false; let bannerListenersAttached = false; function loadAnalytics() { if (analyticsLoaded) return; analyticsLoaded = true; if (GA_ID) loadGA(GA_ID); if (CLARITY_ID) loadClarity(CLARITY_ID); } function openBanner() { if (bannerListenersAttached) return; bannerListenersAttached = true; banner.classList.remove("hidden"); const rejectBtn = document.getElementById("cookie-reject"); const acceptBtn = document.getElementById("cookie-accept"); setTimeout(() => rejectBtn.focus(), 50); const focusable = banner.querySelectorAll("button, a[href]"); const firstFocusable = focusable[0]; const lastFocusable = focusable[focusable.length - 1]; function handleKeydown(e) { if (e.key === "Escape") { e.preventDefault(); rejectBtn.click(); } else if (e.key === "Tab") { if (e.shiftKey && document.activeElement === firstFocusable) { e.preventDefault(); lastFocusable.focus(); } else if (!e.shiftKey && document.activeElement === lastFocusable) { e.preventDefault(); firstFocusable.focus(); } } } document.addEventListener("keydown", handleKeydown); acceptBtn.addEventListener("click", () => { localStorage.setItem(CONSENT_KEY, "true"); banner.classList.add("hidden"); loadAnalytics(); document.removeEventListener("keydown", handleKeydown); }); rejectBtn.addEventListener("click", () => { localStorage.setItem(CONSENT_KEY, "false"); banner.classList.add("hidden"); document.removeEventListener("keydown", handleKeydown); }); } // El banner aparece a la primera interacción (Lighthouse no interactúa → // no aparece en audits) o tras 4 s para lectores pasivos. Es overlay // position:fixed, así que mostrarlo tarde no provoca CLS. const INTERACTION_EVENTS = [ "scroll", "click", "mousemove", "touchstart", "keydown", ]; function onFirstInteraction() { INTERACTION_EVENTS.forEach((e) => window.removeEventListener(e, onFirstInteraction), ); clearTimeout(fallbackTimer); openBanner(); } let fallbackTimer; if (stored === "true") { loadAnalytics(); } else if (stored === null && hasIds) { INTERACTION_EVENTS.forEach((e) => window.addEventListener(e, onFirstInteraction, { passive: true, once: true, }), ); fallbackTimer = setTimeout(() => { INTERACTION_EVENTS.forEach((e) => window.removeEventListener(e, onFirstInteraction), ); openBanner(); }, 4000); } })();</script> </body></html>