GSAP Marquee Demo

Requires GSAP. Hover or click to pause depending on settings. Multiple marquees are supported.

Example 1: Text Marquee (Pause on Hover)

🍔 Burger
🍕 Pizza
🍣 Sushi
🌯 Burrito
🍜 Ramen

Example 2: Pause on Click + Variable Speed

News 1
Breaking 2
Update 3
Analysis 4
Insight 5

Example 3: Image Marquee

Photo 1 Photo 2 Photo 3 Photo 4

Example 4: Paragraph Marquee (long text blocks)

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed non risus. Suspendisse lectus tortor, dignissim sit amet, adipiscing nec, ultricies sed, dolor.
Cras elementum ultrices diam. Maecenas ligula massa, varius a, semper congue, euismod non, mi.
Proin porttitor, orci nec nonummy molestie, enim est eleifend mi, non fermentum diam nisl sit amet erat.
Duis arcu massa, scelerisque vitae, consequat in, pretium a, enim. Pellentesque congue Rupash.

Documentation

Features

Options

Pass an options object to gsapMarquee(selector, options) or use the jQuery plugin API.

OptionTypeDefaultDescription
speednumber100Pixels per second.
directionstring'ltr''ltr' or 'rtl'. Controls movement direction.
pauseOnHoverbooleantruePause when mouse enters the marquee.
pauseOnClickbooleanfalseToggle pause when marquee is clicked.
variableSpeedbooleanfalseOn hover, slow down instead of pausing. (pauseOnHover must be true to variableSpeed work.)
startPausedbooleanfalseStart the marquee paused.
responsivebooleantrueRebuild clones and widths on window resize.
loopbooleantrueContinuous looping (set false to run once).
containerSelectorstring'.customMarquee'Selector for the inner wrapper containing items.
itemsSelectorstring'.marquee-item'Selector for item nodes within the container.
onCompletefunctionnullCallback when a non-looping marquee completes a cycle. Receives cycle count.

API / Methods

Each initialized marquee instance exposes the following methods:

MethodArgsDescription
pause()Pause animation.
resume()Resume animation.
isPaused()Returns true if paused.
rebuild()Recalculate widths and clones (call after DOM/content changes).
reverse()Toggle direction between ltr and rtl.
destroy()Cleanup event listeners and stop ticker for that instance.

1. Initialize a Marquee with jQuery

$('#yourMarquee').gsapMarquee({
	speed: 100,                   // pixels per second
	direction: "ltr",           // "ltr" or "rtl"
	pauseOnHover: true,          // pause on hover
	pauseOnClick: false,         // pause/resume on click
	variableSpeed: false,        // on hover, slow instead of pause
	startPaused: false,          // start paused
	responsive: true,            // auto recalc on resize
	loop: true,                  // infinite loop
	containerSelector: '.marqueeInner',
	itemsSelector: '.marquee-item',
	onComplete: function(cycle){   // callback each loop
		console.log("Cycle:", cycle);
	}
});

1. Initialize a Marquee with Vanilla

let instance = gsapMarquee('#m1', {
    speed: 140,
    direction: 'ltr',
    pauseOnHover: true,
    pauseOnClick: false,
    variableSpeed: false,
    startPaused: false,
    responsive: true,
    loop: true,
    containerSelector: '.marqueeInner',
    itemsSelector: '.marquee-item',
    onComplete: function(cycle) { console.log('cycle', cycle); }
});

3. Instance API

let instance = $('#yourMarquee').gsapMarquee();

// Pause / Resume
instance.pause();
instance.resume();

// Reverse direction at runtime
instance.reverse();

// Rebuild (recalculate widths, clones)
instance.rebuild();

// Destroy (cleanup)
instance.destroy();

4. Image Marquee (imagesLoaded + setTimeout)

Important: Always ensure images are fully loaded before initializing image marquees — use imagesLoaded and a short setTimeout to guarantee correct widths.

imagesLoaded('#imageMarquee', function() {
    setTimeout(function() {
        $('#imageMarquee').gsapMarquee({
            speed: 100,
            containerSelector: '.marqueeInner',
            itemsSelector: '.marquee-img-item'
        });
    }, 0);
});
					

Notes

Practical snippets

Copy and paste these small helpers into your project where appropriate.

Respect prefers-reduced-motion

if (window.matchMedia && window.matchMedia('(prefers-reduced-motion: reduce)').matches) {
	// honor reduced motion: start paused or reduce speed
	opts = opts || {};
	opts.startPaused = true; // or opts.speed = 0
}
let instance = gsapMarquee('#m', opts);

Pause on focus (keyboard accessibility)

// Pause when any item receives keyboard focus
instance.items.forEach(function(el){
	el.addEventListener('focus', function(){ instance.pause(); }, true);
	el.addEventListener('blur',  function(){ instance.resume(); }, true);
});

Rebuild after dynamic content changes


// Instance must be in scope
let instance = gsapMarquee('#m1', {speed: 140});

// After images or content change, give layout a moment then rebuild
setTimeout(function(){
	instance.rebuild();
}, 50);