Cómo crear un carrusel de CMS completamente dinámico en Webflow usando Swiper.js (Guía 2025)

Crear un deslizador responsive y táctil conectado al CMS de Webflow parece sencillo… hasta que realmente lo intentas. La estructura de Lista de Colecciones de Webflow no te permite insertar los elementos necesarios de Swiper (swiper-wrapper, swiper-slide) directamente, lo que hace que la mayoría de las implementaciones fallen.

Después de probar muchos enfoques, este es el método más simple y completamente funcional:

:backhand_index_pointing_right: Deja que Webflow genere su estructura CMS, y luego reconstruye dinámicamente el HTML requerido por Swiper usando JavaScript.

Este artículo te guía paso a paso por:

  • La estructura HTML requerida
  • Cómo Webflow realmente genera las listas CMS
  • Por qué los enfoques típicos de Swiper fallan
  • La solución final 100% funcional
  • Código completo (listo para copiar y pegar)
  • Estilos y configuraciones responsivas

:construction: El Problema: El CMS de Webflow Bloquea la Estructura

El CMS de Webflow siempre genera la siguiente estructura:

Contenedor de Lista de Colecciones
  Lista de Colecciones
    Elemento de Colección
      Tu Contenido

No puedes insertar:

  • <div class="swiper-wrapper">

  • <div class="swiper-slide">

dentro de la lista CMS.

Esto es lo que impide que Swiper se inicialice.


:bullseye: El Objetivo: Una Estructura Real Compatible con Swiper

Swiper requiere esto:

.swiper-container
  .swiper-wrapper
      .swiper-slide
      .swiper-slide
      .swiper-slide

Pero como Webflow no te permite reestructurar el DOM dentro de una Lista de Colecciones, lo hacemos dinámicamente usando JavaScript.


:puzzle_piece: Estructura Final de Webflow (en el Diseñador)

Solo necesitas construir esto en Webflow:

div.swiper-container
    Contenedor de Lista de Colecciones
        Lista de Colecciones
            Elemento de Colección
                Tarjeta (tu contenido)
    botón-previo-swiper (bloque de texto)
    botón-siguiente-swiper (bloque de texto)
    paginación-swiper (bloque de texto)

Sin envoltorios adicionales.
Sin clases swiper-slide.
Sin incrustaciones necesarias dentro del CMS.

Todo lo demás lo maneja el script.


:brick: Paso 1 — Incluir el CSS de Swiper

Dentro de Ajustes del Proyecto → Código Personalizado → Dentro de <head>:

<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/swiper@11/swiper-bundle.min.css" />

:brick: Paso 2 — Añadir el JS + Cargador de Swiper

Dentro de Ajustes del Proyecto → Antes de la etiqueta </body>:

<script src="https://cdn.jsdelivr.net/npm/swiper@11/swiper-bundle.min.js"></script>

<script>
document.addEventListener("DOMContentLoaded", () => {

  const container = document.querySelector('.swiper-container');
  if (!container) return;

  // 1. Crear el real swiper-wrapper
  const wrapper = document.createElement('div');
  wrapper.classList.add('swiper-wrapper');

  // 2. Mover cada elemento CMS dentro del nuevo wrapper
  const cmsItems = container.querySelectorAll('.w-dyn-item');

  cmsItems.forEach(item => {
    item.classList.add('swiper-slide');
    wrapper.appendChild(item);
  });

  // 3. Insertar el wrapper antes de la navegación
  container.insertBefore(wrapper, container.querySelector('.swiper-button-prev'));

  // 4. Inicializar Swiper
  const swiper = new Swiper('.swiper-container', {
    slidesPerView: 1.1,
    spaceBetween: 20,
    loop: false,
    navigation: {
      nextEl: '.swiper-button-next',
      prevEl: '.swiper-button-prev',
    },
    pagination: {
      el: '.swiper-pagination',
      clickable: true,
    },
    breakpoints: {
      768: { slidesPerView: 2.2 },
      1024: { slidesPerView: 3 },
    },
  });

});
</script>

:artist_palette: Paso 3 — CSS Opcional (Recomendado)

Dentro de Ajustes de Página → Dentro de <head>:

<style>
.swiper-container {
  width: 100%;
  position: relative;
  overflow: hidden;
}

.swiper-wrapper {
  display: flex;
}

.swiper-slide {
  width: auto;
}
</style>

Esto asegura que las tarjetas no se colapsen y que Swiper maneje correctamente el ancho.


:test_tube: Por qué Este Método Funciona

:check_mark: Webflow CMS genera elementos .w-dyn-item que no puedes modificar manualmente
:check_mark: Convertimos dinámicamente cada .w-dyn-item en un verdadero .swiper-slide
:check_mark: Generamos dinámicamente .swiper-wrapper
:check_mark: Lo insertamos correctamente en el DOM de Webflow
:check_mark: Swiper se inicializa con éxito, cada vez
:check_mark: Funciona con cualquier cantidad de elementos CMS

Esto te permite crear deslizadores modernos y reales directamente desde colecciones CMS, algo que Webflow no soporta de forma nativa.


:link: Enlaces Útiles


:tada: Resultado Final

Ahora tienes:

  • Un deslizador alimentado por CMS completamente responsive
  • Interacciones de deslizar/drag
  • Botones de navegación
  • Puntos de paginación
  • Puntos de rotura para móvil/tableta/escritorio
  • Sin incrustaciones dentro del CMS
  • Compatible con el nuevo Diseñador de Webflow 2025

Este método ha sido probado y funciona de forma confiable en múltiples proyectos.

Si lo deseas, también puedo proporcionarte:

:white_check_mark: Versión con reproducción automática
:white_check_mark: Versión con bucle infinito (con lógica de clonación de CMS)
:white_check_mark: Efecto Coverflow
:white_check_mark: Iconos personalizados para flechas
:white_check_mark: Soporte para múltiples deslizadores en una misma página

3 Me gusta