Tutorial WordPress: Crear un footer pegajoso (sticky footer) que no tape contenido

·

·

Introducción: ¿qué es un footer pegajoso y cuál es el problema a evitar?

Un footer pegajoso (sticky footer) es un pie de página que permanece en la parte inferior de la ventana cuando el contenido es escaso, pero sin tapar contenido cuando éste excede la altura de la pantalla. El error frecuente es usar position: fixed sin compensar el contenido, lo que provoca que el footer cubra parte importante de la página, empeorando la usabilidad y la accesibilidad.

Objetivo de este tutorial

Explicar varias implementaciones robustas y compatibles con WordPress para lograr un footer pegajoso que no tape contenido, incluyendo:

Requisitos previos

Método 1 — Flexbox (la forma más simple y fiable)

Requisitos: que el contenedor principal del sitio (por ejemplo .site, #page o similar) pueda envolverse alrededor de header, main y footer. La idea es usar flex-direction: column y hacer que el main expanda con flex: 1 para empujar el footer al fondo cuando el contenido es escaso.

Estructura HTML típica en WordPress

En el tema, asegúrate de tener una envoltura que cubra toda la estructura, por ejemplo en header.php o index.php:

ltdiv id=page class=sitegt
  ltheader class=site-headergt...lt/headergt
  ltmain class=site-maingt
    lt!-- loop de WP y contenido --gt
  lt/maingt
  ltfooter class=site-footergt...lt/footergt
lt/divgt

CSS recomendado (Flexbox)

/ Asegúrate de que html y body ocupen 100% de altura /
html, body {
  height: 100%
  margin: 0
}

/ Contenedor principal que envuelve header, main y footer /
#page.site {
  display: flex
  flex-direction: column
  min-height: 100vh / garantiza que la página ocupe toda la altura /
}

/ Main ocupa el espacio sobrante /
.site-main {
  flex: 1 0 auto / crecer y reducir según sea necesario /
}

/ Footer se coloca al final naturalmente /
.site-footer {
  / estilos visuales del footer /
  background: #222
  color: #fff
  padding: 1rem
}

Con esto, cuando la página tenga poco contenido, el main expande y empuja el footer hasta el borde inferior cuando haya mucho contenido, el footer queda al final y no se superpone.

Notas prácticas

Método 2 — CSS Grid (alternativa moderna)

Grid permite definir filas: header, main (auto), footer. Es igualmente sencillo y flexible.

/ Estructura: mismo wrapper #page.site /
#page.site {
  display: grid
  grid-template-rows: auto 1fr auto / header, main, footer /
  min-height: 100vh
}
.site-main {
  / no necesita flex /
}
.site-footer {
  background: #222
  color: #fff
  padding: 1rem
}

Grid y Flexbox son igualmente válidos Flexbox es más simple para compatibilidad amplia, Grid puede ser útil si ya usas grid en el resto del layout.

Método 3 — Footer fijo ajuste de padding/margen (cuando no se puede cambiar estructura)

Si no puedes modificar el wrapper del tema (p. ej. tema muy rígido), puedes dejar el footer con position: fixed bottom: 0 width: 100% pero tendrás que añadir espacio inferior al contenido para que no sea cubierto. La manera fiable es detectar la altura real del footer y aplicarla como padding-bottom al contenedor principal con JavaScript.

/ CSS: footer fijo /
.site-footer {
  position: fixed
  left: 0
  right: 0
  bottom: 0
  z-index: 999 / si necesitas que esté por encima /
  background: #222
  color: #fff
  padding: 1rem
}
// JS: calcular y aplicar padding-bottom al main o al wrapper
(function(){
  function ajustarPaddingFooter(){
    var footer = document.querySelector(.site-footer)
    var wrapper = document.querySelector(#page)  document.querySelector(.site-main)  document.body
    if (!footer  !wrapper) return
    var h = footer.getBoundingClientRect().height
    wrapper.style.paddingBottom = h   px
  }
  // Ejecutar al cargar y al cambiar tamaño
  window.addEventListener(load, ajustarPaddingFooter)
  window.addEventListener(resize, ajustarPaddingFooter)
  // Si contenido dinámico cambia el tamaño del footer, observar cambios:
  if (window.MutationObserver) {
    var obs = new MutationObserver(ajustarPaddingFooter)
    obs.observe(document.querySelector(.site-footer), { childList: true, subtree: true, characterData: true })
  }
})()

Este método funciona, pero añade complejidad (JS) y puede tener parpadeos visuales si no se gestiona con cuidado. Úsalo solo si no puedes tocar la estructura del tema.

Integración específica en WordPress

Pasos prácticos para integrar la solución Flexbox (recomendado) en tu tema WordPress:

  1. Asegúrate de que tu tema imprime un wrapper global. Si no existe, edita header.php y footer.php para que tu estructura quede encerrada en un wrapper como #page.site.
  2. En style.css del tema (o en archivo de estilos encolado desde functions.php), añade el CSS de Flexbox mostrado más arriba.
  3. Verifica que footer.php llame a wp_footer() antes de cerrar cualquier etiqueta, por ejemplo:
    ltfooter class=site-footergt
      ltdiv class=wrapgt
        lt?php dynamic_sidebar(footer-widgets) ?gt
        ltpgtcopy lt?php echo date(Y) ?gt Mi Sitiolt/pgt
      lt/divgt
    lt/footergt
    
    lt?php wp_footer() ?gt
    lt/bodygt
    lt/htmlgt
        
  4. Si tu theme child necesita sobreescribir estilos, usa el archivo style.css del child o encola un archivo CSS en functions.php para prioridad adecuada.

Ejemplo: encolar CSS en functions.php

function tema_child_enqueue_styles() {
  wp_enqueue_style(tema-parent-style, get_template_directory_uri() . /style.css)
  wp_enqueue_style(tema-child-style, get_stylesheet_directory_uri() . /style-child.css, array(tema-parent-style), wp_get_theme()->get(Version))
}
add_action(wp_enqueue_scripts, tema_child_enqueue_styles)

Accesibilidad, mobile y consideraciones UX

Depuración: problemas comunes y soluciones

Pruebas y checklist antes de publicar

Conclusión

La solución más limpia y robusta es usar Flexbox (o Grid) en el wrapper global del tema: define un contenedor que ocupe toda la altura de la ventana y deja que el main crezca con flex: 1. Esto evita superposiciones y no necesita JavaScript. Solo usa posición fija como último recurso y compénsalo mediante padding/calculos con JS. Mantén en cuenta la accesibilidad y las comprobaciones en móviles para una experiencia correcta.

Enlaces útiles



Leave a Reply

Your email address will not be published. Required fields are marked *