Features
- No dependencies
- Only scrolls when content actually overflows
- Horizontal or vertical
- Configurable speed, in either direction
- Smooth ease in/out on pause and resume
- Pause on hover, on click, or both
- Drag-to-scrub with momentum, on mouse and touch
- Auto recalculates on resize and when images finish loading
- Auto pauses when scrolled off-screen
- Programmatic API for pause, resume, and item management
Basic Usage
Wrap your items in a fluid-marquee container and tag each item with fluid-marquee-item:
<div class="fluid-marquee" data-fluid-marquee-infinite> <div class="fluid-marquee-item">Free shipping over $50</div> <div class="fluid-marquee-item">New arrivals every week</div> <div class="fluid-marquee-item">Sign up for 10% off</div> </div>
Only scrolls when needed
Without data-fluid-marquee-infinite, the marquee only animates when the contents overflow the container. If they fit, items stay static and centered:
Squish your browser narrower until the four items no longer fit, and the marquee automatically starts scrolling. Widen it again and it stops and re-centers.
<div class="fluid-marquee"> <div class="fluid-marquee-item">First</div> <div class="fluid-marquee-item">Second</div> <div class="fluid-marquee-item">Third</div> </div>
All examples below use data-fluid-marquee-infinite so they always scroll regardless of viewport width. The snippets omit it for clarity.
Speed and direction
Set scroll speed in pixels per second with data-fluid-marquee-speed. Negative values scroll in reverse:
<div class="fluid-marquee" data-fluid-marquee-speed="32">…</div> <div class="fluid-marquee" data-fluid-marquee-speed="200">…</div> <div class="fluid-marquee" data-fluid-marquee-speed="-96">…</div>
Pause on hover, click, or both
Add data-fluid-marquee-pausable for both behaviors, or pick a single one with data-fluid-marquee-pause-hover or data-fluid-marquee-pause-click. Hover auto resumes on mouse leave. Click locks pause until you click anywhere outside the marquee:
<div class="fluid-marquee" data-fluid-marquee-pausable>…</div> <div class="fluid-marquee" data-fluid-marquee-pause-hover>…</div> <div class="fluid-marquee" data-fluid-marquee-pause-click>…</div>
Drag to scrub
Add data-fluid-marquee-draggable to let users grab and scrub through the marquee. Flicking on release applies momentum that decays smoothly back into the normal scroll.
<div class="fluid-marquee" data-fluid-marquee-draggable>…</div>
Vertical
Add data-fluid-marquee-vertical and give the container a height:
<div class="fluid-marquee"
data-fluid-marquee-vertical
data-fluid-marquee-draggable
style="height: 280px;">
…
</div>
Images
The marquee automatically re-measures after images finish loading, so you don't need to wait for them yourself:
Programmatic API
Get the instance via el.marquee (or FluidMarquee.get(el)) and drive it from JavaScript. Add and remove items, pause and resume, query current state:
const el = document.querySelector(".fluid-marquee")
const m = FluidMarquee.init(el)
// Pause / resume
m.pause()
m.resume()
// Item management
m.add(itemEl)
m.remove(itemEl)
m.setItems([a, b, c])
m.items // current items
// State
m.paused, m.apiPaused, m.userPaused
m.hoverPaused, m.clickPaused, m.dragPaused