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:
- La solución moderna con Flexbox (recomendada).
- Alternativa con CSS Grid.
- Solución con footer fijo ajuste de padding mediante JavaScript (cuando no se puede tocar estructura del tema).
- Integración correcta en un tema WordPress (footer.php, main wrapper, wp_footer()).
- Pruebas, accesibilidad y resolución de problemas comunes.
Requisitos previos
- Acceso a los archivos del tema (editor de temas o FTP) para editar header.php, footer.php o el archivo de plantilla principal.
- Conocer dónde se cargan tus estilos (style.css o archivos enlazados desde functions.php).
- Hacer copia de seguridad antes de cambios en producción.
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
- Si tu tema usa un contenedor con otro nombre, cambia #page.site por el selector correspondiente.
- No uses position: fixed ni position: absolute en el footer con este método.
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:
- 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.
- En style.css del tema (o en archivo de estilos encolado desde functions.php), añade el CSS de Flexbox mostrado más arriba.
- 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 - 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
- Evita que el footer fijo cubra controles importantes (botones, campos de formulario). Si el footer debe ser fijo en móviles, comprueba que no tape inputs al abrir el teclado virtual.
- Manten buena relación de contraste y tamaño táctil en el footer para accesibilidad.
- Si el footer contiene elementos interactivos (enlaces, formularios), asegúrate de que sean navegables con teclado.
- Si usas position: fixed, revisa el atributo z-index para que el footer no tape otros elementos críticos (o al contrario si debe superponerse).
Depuración: problemas comunes y soluciones
- Footer cubre contenido: probablemente estás usando position: fixed sin ajustar padding-bottom. Solución: usa Flexbox o aplica padding al contenedor igual a la altura del footer.
- El contenedor no ocupa toda la altura: asegúrate de que html y body tengan height: 100% y que el wrapper tenga min-height: 100vh o min-height: 100% según enfoque.
- Footer se queda flotando en el medio: verifica que .site-main tenga flex: 1 (o en Grid, que la fila central sea 1fr).
- Footer cambia de tamaño dinámicamente: si usas footer fijo, aplica JS para recalcular padding si usas Flexbox/Grid no suele ser necesario.
- Problemas con barras de administración de WP (admin bar): la barra de administración puede cambiar el viewport. Comprueba con usuarios logueados y añade estilos específicos si es necesario (p. ej. body.admin-bar adjustments).
Pruebas y checklist antes de publicar
- Probar en pantallas pequeñas y grandes, y en orientación vertical/horizontal en móviles.
- Comprobar que el footer no tape inputs o CTA en páginas con formularios.
- Verificar con y sin sesión iniciada (admin-bar visible).
- Probar con contenido dinámico (widgets del footer que cambien de tamaño).
- Medir rendimiento: si añades JS, asegúrate de que sea ligero y que se ejecute solo cuando sea necesario.
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.
Leave a Reply