Introducción
Las tablas HTML son una herramienta imprescindible para mostrar datos en WordPress: comparativas, listados, informes, etc. Sin embargo, en dispositivos móviles y pantallas pequeñas las tablas tradicionales se rompen porque tienen muchas columnas y no caben. Este tutorial explica, paso a paso y con todo lujo de detalles, cómo crear una tabla responsive con scroll horizontal elegante, accesible y fácil de integrar en un tema o plugin de WordPress.
Resumen de la solución
La técnica propuesta se basa en los siguientes puntos clave:
- Contenedor con scroll horizontal (overflow-x:auto) para mantener la tabla intacta sin romper el layout.
- Cabeceras fijas (position: sticky) para que las columnas se identifiquen al desplazarse.
- Indicadores visuales (degradados o flechas) para mostrar que hay contenido oculto a izquierda/derecha.
- Accesibilidad: soporte para teclado, atributos ARIA y focus visible.
- Integración WordPress: cómo encolar CSS/JS desde functions.php y cómo usar un shortcode o plantilla.
Ventajas de este enfoque
- Se mantiene la semántica de la tabla (table, thead, tbody), por lo que sigue siendo accesible para lectores de pantalla.
- No se reestructura la tabla en cards (que a veces elimina la relación filas/columnas).
- Fácil de aplicar a tablas ya existentes reemplazando el marcado por un envoltorio o añadiendo una clase CSS.
1. Estructura HTML recomendada (ejemplo)
Coloca la tabla dentro de un contenedor que actuará como zona desplazable y tendrá los indicadores visuales. Aquí tienes un ejemplo mínimo de marcado (este bloque es HTML de ejemplo):
Producto Precio Stock Proveedor Envío Valoración Comentarios Cámara A €399 24 Proveedor X 24-48h 4.7 Muy buena relación calidad-precio.
2. CSS: diseño, scroll elegante y cabeceras fijas
El CSS a continuación cubre:
- Contenedor con scroll horizontal y ocultación de scrollbar si se desea.
- Gradientes a izquierda/derecha para el efecto de fade que indica más contenido.
- Cabeceras sticky para que la fila de thead permanezca visible.
- Estilos móviles y mejoras de legibilidad.
/ Envolver la tabla para habilitar scroll horizontal /
.responsive-table-wrap{
position: relative
overflow-x: auto
-webkit-overflow-scrolling: touch / desplazamiento suave en iOS /
scrollbar-width: thin / Firefox /
margin: 0.8rem 0
padding: 0.25rem 0 / espacio para indicadores /
}
/ Opcional: ocultar scrollbar en WebKit y usar indicador visual en su lugar /
.responsive-table-wrap::-webkit-scrollbar{
height: 8px
}
.responsive-table-wrap::-webkit-scrollbar-track{
background: transparent
}
.responsive-table-wrap::-webkit-scrollbar-thumb{
background: rgba(0,0,0,0.2)
border-radius: 999px
}
/ Estilo básico de la tabla /
.responsive-table{
width: 100%
border-collapse: collapse
min-width: 720px / fuerza el scroll si no cabe /
background: #fff
font-size: 0.95rem
}
/ Filas y celdas /
.responsive-table th,
.responsive-table td{
padding: 0.6rem 0.9rem
text-align: left
border-bottom: 1px solid rgba(0,0,0,0.06)
white-space: nowrap / evita wrapping que rompa columnas /
}
/ Cabecera fija /
.responsive-table thead th{
position: sticky
top: 0
background: linear-gradient(180deg, #ffffff 0%, #f8f8f8 100%)
z-index: 3
border-bottom: 2px solid rgba(0,0,0,0.08)
}
/ Row hover /
.responsive-table tbody tr:hover{
background: rgba(0, 0, 0, 0.03)
}
/ Indicadores visuales: degradados en los lados /
.responsive-table-wrap::before,
.responsive-table-wrap::after{
content:
position: absolute
top: 0
bottom: 0
width: 2.4rem
pointer-events: none / no interfieren con el scroll táctil /
z-index: 2
transition: opacity 200ms ease
}
/ Degradado izquierdo (indica contenido a la izquierda) /
.responsive-table-wrap::before{
left: 0
background: linear-gradient(90deg, rgba(255,255,255,1) 0%, rgba(255,255,255,0) 100%)
opacity: 0 / por defecto oculto hasta que se detecte overflow /
}
/ Degradado derecho (indica contenido a la derecha) /
.responsive-table-wrap::after{
right: 0
background: linear-gradient(270deg, rgba(255,255,255,1) 0%, rgba(255,255,255,0) 100%)
opacity: 0
}
/ Cuando exista overflow a la izquierda/derecha, añadiremos clases via JS /
.responsive-table-wrap.has-left::before{
opacity: 1
}
.responsive-table-wrap.has-right::after{
opacity: 1
}
/ Mejoras de accesibilidad: foco visible para el contenedor /
.responsive-table-wrap:focus{
outline: 3px solid rgba(21,156,228,0.35)
outline-offset: 2px
}
/ Responsive: en pantallas muy pequeñas puedes permitir wrapping en celdas específicas /
@media (max-width: 480px){
.responsive-table th:nth-child(1),
.responsive-table td:nth-child(1){
min-width: 140px / columna principal conserva ancho /
}
.responsive-table{
min-width: 600px / ajusta según contenido /
}
}
3. JavaScript: detectar overflow y añadir indicadores
Un pequeño script detecta si la tabla tiene contenido que sobresale a izquierda o derecha y añade o quita las clases has-left y has-right. Además, mejora la experiencia para teclado (usar flechas izquierda/derecha para desplazar).
// Selecciona todos los envoltorios
document.querySelectorAll(.responsive-table-wrap).forEach(function(wrap){
function updateIndicators(){
var maxScrollLeft = wrap.scrollWidth - wrap.clientWidth
if (wrap.scrollLeft > 2){
wrap.classList.add(has-left)
} else {
wrap.classList.remove(has-left)
}
if (wrap.scrollLeft < maxScrollLeft - 2){
wrap.classList.add(has-right)
} else {
wrap.classList.remove(has-right)
}
}
// Actualizar al cargar, al redimensionar y al hacer scroll
updateIndicators()
wrap.addEventListener(scroll, updateIndicators)
window.addEventListener(resize, updateIndicators)
// Soporte básico de teclado cuando el wrapper está enfocado
wrap.addEventListener(keydown, function(e){
var key = e.key e.keyCode
if (key === ArrowRight key === 39){
wrap.scrollBy({ left: 120, behavior: smooth })
e.preventDefault()
} else if (key === ArrowLeft key === 37){
wrap.scrollBy({ left: -120, behavior: smooth })
e.preventDefault()
} else if (key === Home key === 36){
wrap.scrollTo({ left: 0, behavior: smooth })
e.preventDefault()
} else if (key === End key === 35){
wrap.scrollTo({ left: wrap.scrollWidth, behavior: smooth })
e.preventDefault()
}
})
})
4. Integración en WordPress: encolar CSS y JS
Es recomendable añadir los estilos y scripts del componente mediante wp_enqueue_style y wp_enqueue_script en el archivo functions.php de tu tema o en el plugin correspondiente. Ejemplo de funciones para encolar los archivos:
/ functions.php (o archivo principal del plugin) /
function mi_tema_enqueue_responsive_table_assets(){
wp_enqueue_style(
mi-responsive-table-css,
get_stylesheet_directory_uri() . /assets/css/responsive-table.css,
array(),
1.0
)
wp_enqueue_script(
mi-responsive-table-js,
get_stylesheet_directory_uri() . /assets/js/responsive-table.js,
array(),
1.0,
true
)
}
add_action(wp_enqueue_scripts, mi_tema_enqueue_responsive_table_assets)
Si prefieres, puedes inyectar estilos inline o usar el customizer, pero encolar archivos permite caché y mejor mantenimiento.
5. Shortcode para insertar tablas estilizadas
Si quieres una forma cómoda de añadir tablas en entradas o páginas sin tocar HTML, puedes registrar un shortcode que envuelva tablas o genere la tabla directamente. Ejemplo simple:
/ Shortcode: [responsive_table]...html table...[/responsive_table] /
function shortcode_responsive_table(atts, content = null){
return
. do_shortcode(content)
.
}
add_shortcode(responsive_table, shortcode_responsive_table)
Uso en el editor (visual o HTML):
[responsive_table]
Nota
Si usas el editor Gutenberg, puedes crear un bloque dinámico o simplemente usar un bloque HTML y envolver la tabla con la clase indicada.
6. Accesibilidad y consideraciones avanzadas
- Semántica: Mantén la estructura thead/tbody y usa th para encabezados. Evita soluciones que transformen la tabla en elementos no tabulares si la información es tabular.
- Lectores de pantalla: El contenedor tiene role=region y aria-label para dar contexto. Si la tabla necesita descripción larga, añade aria-describedby con un id que apunte a un párrafo explicativo.
- Teclado: El wrapper es focusable (tabindex=0) y el script permite usar ArrowLeft/ArrowRight/Home/End para navegar horizontalmente.
- Pruebas: Prueba en iOS/Android, en Chrome/Firefox/Safari y con zoom del navegador. Verifica también con lectores de pantalla como NVDA o VoiceOver si corresponde al público objetivo.
- Impresión: Si necesitas, añade reglas @media print para mostrar la tabla completa o para ocultar los degradados/scrollbars.
7. Personalizaciones y mejoras opcionales
- Reemplazar los degradados por iconos/flechas que aparezcan sobre el contenedor cuando exista overflow (se pueden añadir mediante pseudo-elementos y CSS o inyectando elementos via JS dentro del wrapper).
- Permitir ordenación de columnas con plugins o TinySort, manteniendo el wrapper intacto.
- Agregar paginación por filas para tablas muy largas combinando scroll horizontal y paginación vertical.
- Usar CSS variables para configurar colores y anchos desde el tema.
Ejemplo de ajuste para impresión (opcional)
@media print{
.responsive-table-wrap{
overflow: visible !important
-webkit-overflow-scrolling: auto
}
.responsive-table thead th{
position: static / evita problemas con sticky al imprimir /
}
.responsive-table{
min-width: 0
font-size: 0.9rem
}
}
8. Checklist final antes de lanzar a producción
- Encolados CSS/JS correctos y sin conflictos de nombres de clase.
- Tabla semántica (thead/tbody, th) y sin celdas fusionadas innecesarias que rompan el scroll.
- Comprobada la experiencia táctil en iOS/Android.
- Comprobado el soporte teclado y lector de pantallas básicos.
- Test de impresión y ofuscación de scrollbars si lo deseas.
Conclusión
Con un contenedor desplazable, cabeceras sticky, degradados indicadores y un pequeño script para detectar overflow y mejorar el control por teclado, obtendrás una tabla responsive con scroll horizontal elegante y accesible. La integración en WordPress es sencilla mediante la encolación de los assets y, si lo deseas, mediante un shortcode o bloque en Gutenberg. Aplica los fragmentos de código proporcionados, adapta los estilos a la identidad visual de tu tema y realiza pruebas de usabilidad en dispositivos reales antes de desplegar.
Leave a Reply