Marquesina CSS Tailwind solo para CSS para contenido y logotipos con desplazamiento horizontal. Control de velocidad y dirección mediante CSS, sin JavaScript. Accesible a WCAG AA, funciona con Django, HTMX, Laravel, React y cualquier pila.
Los componentes de marquesina crean tiras de contenido infinitas y de desplazamiento continuo, ideales para logotipos de marcas, pancartas publicitarias, testimonios o nubes de etiquetas. Construida completamente con animaciones CSS, la marquesina Frutjam admite direcciones horizontales y verticales, pausa al pasar el mouse, reproducción reversible y control de velocidad. Duplique el elemento marquee-track (con aria-hidden) para obtener un bucle fluido y sin espacios.
Solo CSS, no se requiere JavaScript. WCAG AA accesible e independiente del marco: funciona con Django, HTMX, Laravel, React y cualquier pila.
| Clase | Tipo | Descripción |
|---|---|---|
| marquee | Base | Contenedor exterior: los clips se desbordan y contienen variables de animación |
| marquee-track | Modificador | Fila interior de desplazamiento; duplicar con aria-hidden para un bucle sin interrupciones |
| marquee-pause | Modificador | Pausa la animación al pasar el mouse |
| marquee-reverse | Modificador | Se desplaza en la dirección opuesta |
| marquee-vertical | Modificador | Se desplaza de arriba a abajo en lugar de de izquierda a derecha |
| marquee-slow | Speed | Desplazamiento lento (ciclo de 40 segundos) |
| marquee-normal | Speed | Velocidad predeterminada (ciclo de 20 s) |
| marquee-fast | Speed | Desplazamiento rápido (ciclo de 10 segundos) |
| marquee-fade | Modificador | Agrega bordes degradados en ambos lados |
Uso básico
Agregue dos elementos marquee-track idénticos: el segundo (con aria-hidden="true") llena el espacio cuando el primero se desplaza fuera de la pantalla.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <div class="marquee"> <div class="marquee-track"> <span class="badge badge-soft">Item 1</span> <span class="badge badge-soft">Item 2</span> <span class="badge badge-soft">Item 3</span> <span class="badge badge-soft">Item 4</span> <span class="badge badge-soft">Item 5</span> </div> <div class="marquee-track" aria-hidden="true"> <span class="badge badge-soft">Item 1</span> <span class="badge badge-soft">Item 2</span> <span class="badge badge-soft">Item 3</span> <span class="badge badge-soft">Item 4</span> <span class="badge badge-soft">Item 5</span> </div> </div> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | const items = ["Item 1", "Item 2", "Item 3", "Item 4", "Item 5"] export default function MarqueeDemo() { return ( <div className="marquee"> <div className="marquee-track"> {items.map((item) => ( <span key={item} className="badge badge-soft">{item}</span> ))} </div> <div className="marquee-track" aria-hidden="true"> {items.map((item) => ( <span key={item} className="badge badge-soft">{item}</span> ))} </div> </div> ) } |
Pausa al pasar el mouse
Agregue marquee-pause para detener la animación cuando el usuario pasa el cursor sobre la tira.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <div class="marquee marquee-pause"> <div class="marquee-track"> <span class="badge badge-primary badge-soft">Hover me</span> <span class="badge badge-secondary badge-soft">to pause</span> <span class="badge badge-accent badge-soft">the scroll</span> <span class="badge badge-info badge-soft">Animation</span> <span class="badge badge-success badge-soft">stops here</span> </div> <div class="marquee-track" aria-hidden="true"> <span class="badge badge-primary badge-soft">Hover me</span> <span class="badge badge-secondary badge-soft">to pause</span> <span class="badge badge-accent badge-soft">the scroll</span> <span class="badge badge-info badge-soft">Animation</span> <span class="badge badge-success badge-soft">stops here</span> </div> </div> |
Dirección inversa
Utilice marquee-reverse para desplazarse de derecha a izquierda en lugar de de izquierda a derecha. Combina dos filas para obtener un efecto de capas.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | <div class="flex flex-col gap-3"> <div class="marquee"> <div class="marquee-track"> <span class="badge badge-primary">Alpha</span> <span class="badge badge-secondary">Beta</span> <span class="badge badge-accent">Gamma</span> <span class="badge badge-info">Delta</span> <span class="badge badge-success">Epsilon</span> </div> <div class="marquee-track" aria-hidden="true"> <span class="badge badge-primary">Alpha</span> <span class="badge badge-secondary">Beta</span> <span class="badge badge-accent">Gamma</span> <span class="badge badge-info">Delta</span> <span class="badge badge-success">Epsilon</span> </div> </div> <div class="marquee marquee-reverse"> <div class="marquee-track"> <span class="badge badge-soft badge-primary">Alpha</span> <span class="badge badge-soft badge-secondary">Beta</span> <span class="badge badge-soft badge-accent">Gamma</span> <span class="badge badge-soft badge-info">Delta</span> <span class="badge badge-soft badge-success">Epsilon</span> </div> <div class="marquee-track" aria-hidden="true"> <span class="badge badge-soft badge-primary">Alpha</span> <span class="badge badge-soft badge-secondary">Beta</span> <span class="badge badge-soft badge-accent">Gamma</span> <span class="badge badge-soft badge-info">Delta</span> <span class="badge badge-soft badge-success">Epsilon</span> </div> </div> </div> |
Variantes de velocidad
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | <div class="flex flex-col gap-3"> <div class="marquee marquee-slow"> <div class="marquee-track"> <span class="badge badge-soft">Slow</span> <span class="badge badge-soft">Slow</span> <span class="badge badge-soft">Slow</span> <span class="badge badge-soft">Slow</span> <span class="badge badge-soft">Slow</span> </div> <div class="marquee-track" aria-hidden="true"> <span class="badge badge-soft">Slow</span> <span class="badge badge-soft">Slow</span> <span class="badge badge-soft">Slow</span> <span class="badge badge-soft">Slow</span> <span class="badge badge-soft">Slow</span> </div> </div> <div class="marquee"> <div class="marquee-track"> <span class="badge badge-primary badge-soft">Normal</span> <span class="badge badge-primary badge-soft">Normal</span> <span class="badge badge-primary badge-soft">Normal</span> <span class="badge badge-primary badge-soft">Normal</span> <span class="badge badge-primary badge-soft">Normal</span> </div> <div class="marquee-track" aria-hidden="true"> <span class="badge badge-primary badge-soft">Normal</span> <span class="badge badge-primary badge-soft">Normal</span> <span class="badge badge-primary badge-soft">Normal</span> <span class="badge badge-primary badge-soft">Normal</span> <span class="badge badge-primary badge-soft">Normal</span> </div> </div> <div class="marquee marquee-fast"> <div class="marquee-track"> <span class="badge badge-accent badge-soft">Fast</span> <span class="badge badge-accent badge-soft">Fast</span> <span class="badge badge-accent badge-soft">Fast</span> <span class="badge badge-accent badge-soft">Fast</span> <span class="badge badge-accent badge-soft">Fast</span> </div> <div class="marquee-track" aria-hidden="true"> <span class="badge badge-accent badge-soft">Fast</span> <span class="badge badge-accent badge-soft">Fast</span> <span class="badge badge-accent badge-soft">Fast</span> <span class="badge badge-accent badge-soft">Fast</span> <span class="badge badge-accent badge-soft">Fast</span> </div> </div> </div> |
Carpa vertical
Agregue marquee-vertical y déle al contenedor una altura fija para un desplazamiento de arriba a abajo.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <div class="marquee marquee-vertical h-48"> <div class="marquee-track"> <div class="badge badge-primary badge-soft">Announcement one</div> <div class="badge badge-secondary badge-soft">Announcement two</div> <div class="badge badge-accent badge-soft">Announcement three</div> <div class="badge badge-info badge-soft">Announcement four</div> <div class="badge badge-success badge-soft">Announcement five</div> </div> <div class="marquee-track" aria-hidden="true"> <div class="badge badge-primary badge-soft">Announcement one</div> <div class="badge badge-secondary badge-soft">Announcement two</div> <div class="badge badge-accent badge-soft">Announcement three</div> <div class="badge badge-info badge-soft">Announcement four</div> <div class="badge badge-success badge-soft">Announcement five</div> </div> </div> |
Etiquetas de tecnología
Un patrón común para mostrar un conjunto de habilidades o un conjunto de tecnologías.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | <div class="marquee marquee-pause [--marquee--gap:0.75rem] p-2"> <div class="marquee-track"> <span class="badge badge-outline">HTML</span> <span class="badge badge-outline">CSS</span> <span class="badge badge-outline">JavaScript</span> <span class="badge badge-outline">TypeScript</span> <span class="badge badge-outline">React</span> <span class="badge badge-outline">Vue</span> <span class="badge badge-outline">Tailwind CSS</span> <span class="badge badge-outline">Node.js</span> </div> <div class="marquee-track" aria-hidden="true"> <span class="badge badge-outline">HTML</span> <span class="badge badge-outline">CSS</span> <span class="badge badge-outline">JavaScript</span> <span class="badge badge-outline">TypeScript</span> <span class="badge badge-outline">React</span> <span class="badge badge-outline">Vue</span> <span class="badge badge-outline">Tailwind CSS</span> <span class="badge badge-outline">Node.js</span> </div> </div> |
Brecha personalizada
Anule --marquee--gap o --marquee--duration con una utilidad en línea para ajustar el espaciado y la velocidad.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | <div class="marquee [--marquee--gap:2rem] [--marquee--duration:30s]"> <div class="marquee-track"> <span class="badge badge-lg badge-primary">Wide gap</span> <span class="badge badge-lg badge-secondary">Wide gap</span> <span class="badge badge-lg badge-accent">Wide gap</span> <span class="badge badge-lg badge-info">Wide gap</span> </div> <div class="marquee-track" aria-hidden="true"> <span class="badge badge-lg badge-primary">Wide gap</span> <span class="badge badge-lg badge-secondary">Wide gap</span> <span class="badge badge-lg badge-accent">Wide gap</span> <span class="badge badge-lg badge-info">Wide gap</span> </div> </div> |
Bordes desvanecidos
Agregue marquee-fade para desvanecer ambos extremos de la tira en el fondo de la página para una apariencia pulida.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | <div class="marquee marquee-fade marquee-pause"> <div class="marquee-track"> <span class="badge badge-soft badge-primary">Design</span> <span class="badge badge-soft badge-secondary">Development</span> <span class="badge badge-soft badge-accent">Performance</span> <span class="badge badge-soft badge-info">Accessibility</span> <span class="badge badge-soft badge-success">Open Source</span> <span class="badge badge-soft badge-warning">Security</span> <span class="badge badge-soft badge-error">Testing</span> </div> <div class="marquee-track" aria-hidden="true"> <span class="badge badge-soft badge-primary">Design</span> <span class="badge badge-soft badge-secondary">Development</span> <span class="badge badge-soft badge-accent">Performance</span> <span class="badge badge-soft badge-info">Accessibility</span> <span class="badge badge-soft badge-success">Open Source</span> <span class="badge badge-soft badge-warning">Security</span> <span class="badge badge-soft badge-error">Testing</span> </div> </div> |
Banner de anuncio
Una barra de teletipo delgada para promociones o avisos en todo el sitio. Combine marquee-fade y marquee-pause para obtener la mejor experiencia.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <div class="bg-primary text-on-primary py-2 px-4"> <div class="marquee marquee-fade marquee-pause [--marquee--duration:30s]"> <div class="marquee-track text-sm font-medium"> <span class="inline-flex items-center gap-2 whitespace-nowrap px-4">🎉 Version 2.0 is here — explore what's new</span> <span class="inline-flex items-center gap-2 whitespace-nowrap px-4">🌿 Built with Tailwind CSS v4</span> <span class="inline-flex items-center gap-2 whitespace-nowrap px-4">⚡ Zero JavaScript, pure CSS components</span> <span class="inline-flex items-center gap-2 whitespace-nowrap px-4">🎨 Fully themeable with CSS variables</span> </div> <div class="marquee-track text-sm font-medium" aria-hidden="true"> <span class="inline-flex items-center gap-2 whitespace-nowrap px-4">🎉 Version 2.0 is here — explore what's new</span> <span class="inline-flex items-center gap-2 whitespace-nowrap px-4">🌿 Built with Tailwind CSS v4</span> <span class="inline-flex items-center gap-2 whitespace-nowrap px-4">⚡ Zero JavaScript, pure CSS components</span> <span class="inline-flex items-center gap-2 whitespace-nowrap px-4">🎨 Fully themeable with CSS variables</span> </div> </div> </div> |
Marquesina con logotipo
Muestre socios o marcas confiables en una franja de desplazamiento continuo. Utilice marquee-fade para mezclar los bordes con el fondo.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | <div class="marquee marquee-fade marquee-pause [--marquee--gap:3rem] [--marquee--duration:25s]"> <div class="marquee-track items-center"> <div class="flex items-center justify-center h-10 px-4 opacity-60 hover:opacity-100 transition-opacity"> <span class="text-xl font-bold tracking-tight">Acme</span> </div> <div class="flex items-center justify-center h-10 px-4 opacity-60 hover:opacity-100 transition-opacity"> <span class="text-xl font-bold tracking-tight">Globex</span> </div> <div class="flex items-center justify-center h-10 px-4 opacity-60 hover:opacity-100 transition-opacity"> <span class="text-xl font-bold tracking-tight">Initech</span> </div> <div class="flex items-center justify-center h-10 px-4 opacity-60 hover:opacity-100 transition-opacity"> <span class="text-xl font-bold tracking-tight">Umbrella</span> </div> <div class="flex items-center justify-center h-10 px-4 opacity-60 hover:opacity-100 transition-opacity"> <span class="text-xl font-bold tracking-tight">Hooli</span> </div> <div class="flex items-center justify-center h-10 px-4 opacity-60 hover:opacity-100 transition-opacity"> <span class="text-xl font-bold tracking-tight">Pied Piper</span> </div> <div class="flex items-center justify-center h-10 px-4 opacity-60 hover:opacity-100 transition-opacity"> <span class="text-xl font-bold tracking-tight">Vehement</span> </div> <div class="flex items-center justify-center h-10 px-4 opacity-60 hover:opacity-100 transition-opacity"> <span class="text-xl font-bold tracking-tight">Massive</span> </div> </div> <div class="marquee-track items-center" aria-hidden="true"> <div class="flex items-center justify-center h-10 px-4 opacity-60 hover:opacity-100 transition-opacity"> <span class="text-xl font-bold tracking-tight">Acme</span> </div> <div class="flex items-center justify-center h-10 px-4 opacity-60 hover:opacity-100 transition-opacity"> <span class="text-xl font-bold tracking-tight">Globex</span> </div> <div class="flex items-center justify-center h-10 px-4 opacity-60 hover:opacity-100 transition-opacity"> <span class="text-xl font-bold tracking-tight">Initech</span> </div> <div class="flex items-center justify-center h-10 px-4 opacity-60 hover:opacity-100 transition-opacity"> <span class="text-xl font-bold tracking-tight">Umbrella</span> </div> <div class="flex items-center justify-center h-10 px-4 opacity-60 hover:opacity-100 transition-opacity"> <span class="text-xl font-bold tracking-tight">Hooli</span> </div> <div class="flex items-center justify-center h-10 px-4 opacity-60 hover:opacity-100 transition-opacity"> <span class="text-xl font-bold tracking-tight">Pied Piper</span> </div> <div class="flex items-center justify-center h-10 px-4 opacity-60 hover:opacity-100 transition-opacity"> <span class="text-xl font-bold tracking-tight">Vehement</span> </div> <div class="flex items-center justify-center h-10 px-4 opacity-60 hover:opacity-100 transition-opacity"> <span class="text-xl font-bold tracking-tight">Massive</span> </div> </div> </div> |
Tarjetas de testimonios
Desplácese por las tarjetas de testimonios con una sutil pausa al pasar el mouse para facilitar la lectura.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 | <div class="marquee marquee-fade marquee-pause [--marquee--gap:1rem] [--marquee--duration:40s]"> <div class="marquee-track items-stretch"> <div class="card card-outline w-72 shrink-0"> <div class="card-content"> <p class="text-sm">"Absolutely love the component library. Saves us hours every sprint."</p> <div class="flex items-center gap-2 mt-3"> <div class="avatar avatar-sm avatar-circle avatar-primary">A</div> <div> <p class="text-sm font-medium">Alex Morgan</p> <p class="text-xs text-body">Frontend Engineer</p> </div> </div> </div> </div> <div class="card card-outline w-72 shrink-0"> <div class="card-content"> <p class="text-sm">"The best Tailwind UI kit I've used. Clean, accessible, and easy to customize."</p> <div class="flex items-center gap-2 mt-3"> <div class="avatar avatar-sm avatar-circle avatar-secondary">J</div> <div> <p class="text-sm font-medium">Jamie Lee</p> <p class="text-xs text-body">Product Designer</p> </div> </div> </div> </div> <div class="card card-outline w-72 shrink-0"> <div class="card-content"> <p class="text-sm">"Shipped our design system 3× faster thanks to Frutjam. Highly recommend."</p> <div class="flex items-center gap-2 mt-3"> <div class="avatar avatar-sm avatar-circle avatar-accent">S</div> <div> <p class="text-sm font-medium">Sam Rivera</p> <p class="text-xs text-body">Tech Lead</p> </div> </div> </div> </div> <div class="card card-outline w-72 shrink-0"> <div class="card-content"> <p class="text-sm">"Great DX, thoughtful defaults, and the dark mode just works out of the box."</p> <div class="flex items-center gap-2 mt-3"> <div class="avatar avatar-sm avatar-circle avatar-info">R</div> <div> <p class="text-sm font-medium">Riley Chen</p> <p class="text-xs text-body">Full Stack Developer</p> </div> </div> </div> </div> </div> <div class="marquee-track items-stretch" aria-hidden="true"> <div class="card card-outline w-72 shrink-0"> <div class="card-content"> <p class="text-sm">"Absolutely love the component library. Saves us hours every sprint."</p> <div class="flex items-center gap-2 mt-3"> <div class="avatar avatar-sm avatar-circle avatar-primary">A</div> <div> <p class="text-sm font-medium">Alex Morgan</p> <p class="text-xs text-body">Frontend Engineer</p> </div> </div> </div> </div> <div class="card card-outline w-72 shrink-0"> <div class="card-content"> <p class="text-sm">"The best Tailwind UI kit I've used. Clean, accessible, and easy to customize."</p> <div class="flex items-center gap-2 mt-3"> <div class="avatar avatar-sm avatar-circle avatar-secondary">J</div> <div> <p class="text-sm font-medium">Jamie Lee</p> <p class="text-xs text-body">Product Designer</p> </div> </div> </div> </div> <div class="card card-outline w-72 shrink-0"> <div class="card-content"> <p class="text-sm">"Shipped our design system 3× faster thanks to Frutjam. Highly recommend."</p> <div class="flex items-center gap-2 mt-3"> <div class="avatar avatar-sm avatar-circle avatar-accent">S</div> <div> <p class="text-sm font-medium">Sam Rivera</p> <p class="text-xs text-body">Tech Lead</p> </div> </div> </div> </div> <div class="card card-outline w-72 shrink-0"> <div class="card-content"> <p class="text-sm">"Great DX, thoughtful defaults, and the dark mode just works out of the box."</p> <div class="flex items-center gap-2 mt-3"> <div class="avatar avatar-sm avatar-circle avatar-info">R</div> <div> <p class="text-sm font-medium">Riley Chen</p> <p class="text-xs text-body">Full Stack Developer</p> </div> </div> </div> </div> </div> </div> |
¿Usando Claude Code, Cursor u otro editor de IA?
Cherry MCP le brinda a su editor de IA la estructura y los nombres exactos de las clases Marquesina según sea necesario. No más clases alucinadas.