Marquee
A continuous scrolling component for displaying content in a seamless loop.
Anatomy
<Marquee.Root>
<Marquee.Edge />
<Marquee.Viewport>
<Marquee.Content>
<Marquee.Item />
</Marquee.Content>
</Marquee.Viewport>
</Marquee.Root>
Examples
Auto Fill
Use the autoFill prop to automatically duplicate content to fill the viewport. The spacing prop controls the gap
between duplicated content instances:
Reverse
Set the reverse prop to reverse the scroll direction:
Vertical
Set side="bottom" (or side="top") to create a vertical marquee:
Speed
Control the animation speed using the speed prop, which accepts values in pixels per second:
Pause on Interaction
Enable pauseOnInteraction to pause the marquee when users hover or focus on it, improving accessibility:
Programmatic Control
Use the useMarquee hook with Marquee.RootProvider to access the marquee API and control playback programmatically:
If you're using the
Marquee.RootProvidercomponent, you don't need to use theMarquee.Rootcomponent.
Loops
Set the loopCount prop to run the marquee a specific number of times. Use onLoopComplete to track each loop
iteration and onComplete to know when all loops finish:
Edges
Add Marquee.Edge components to create fade effects at the start and end of the scrolling area:
Guides
Content Animation
The Marquee component requires CSS keyframe animations to function properly. You'll need to define animations for both horizontal and vertical scrolling:
@keyframes marqueeX {
from {
transform: translateX(0);
}
to {
transform: translateX(var(--marquee-translate));
}
}
@keyframes marqueeY {
from {
transform: translateY(0);
}
to {
transform: translateY(var(--marquee-translate));
}
}
The component automatically applies the appropriate animation (marqueeX or marqueeY) based on the scroll direction
and uses the --marquee-translate CSS variable for seamless looping.
You can target specific parts of the marquee using data-part attributes for custom styling:
[data-part="root"]- The root container[data-part="viewport"]- The scrolling viewport[data-part="content"]- The content wrapper (receives animation)[data-part="item"]- Individual marquee items[data-part="edge"]- Edge gradient overlays
Best Practices
- Enable pause-on-interaction: Use
pauseOnInteractionto allow users to pause animations on hover or focus, improving accessibility and readability - Use descriptive labels: Provide meaningful
aria-labelvalues that describe the marquee content (e.g., "Partner logos", "Latest announcements") - Avoid for critical information: Don't use marquees for essential content that users must read, as continuously moving text can be difficult to process. Consider static displays for important information
API Reference
Props
Root
Renders a <div> element.
| Prop | Default | Type |
|---|---|---|
asChild | booleanUse the provided child element as the default rendered element, combining their props and behavior. For more details, read our Composition guide. | |
autoFill | false | booleanWhether to automatically duplicate content to fill the container. |
defaultPaused | false | booleanWhether the marquee is paused by default. |
delay | 0 | numberThe delay before the animation starts (in seconds). |
ids | Partial<{ root: string; viewport: string; content: (index: number) => string }>The ids of the elements in the marquee. Useful for composition. | |
loopCount | 0 | numberThe number of times to loop the animation (0 = infinite). |
onComplete | () => voidFunction called when the marquee completes all loops and stops. Only fires for finite loops (loopCount > 0). | |
onLoopComplete | () => voidFunction called when the marquee completes one loop iteration. | |
onPauseChange | (details: PauseStatusDetails) => voidFunction called when the pause status changes. | |
paused | booleanWhether the marquee is paused. | |
pauseOnInteraction | false | booleanWhether to pause the marquee on user interaction (hover, focus). |
reverse | false | booleanWhether to reverse the animation direction. |
side | 'start' | SideThe side/direction the marquee scrolls towards. |
spacing | '1rem' | stringThe spacing between marquee items. |
speed | 50 | numberThe speed of the marquee animation in pixels per second. |
translations | IntlTranslationsThe localized messages to use. |
| Attribute | Description |
|---|---|
[data-scope] | marquee |
[data-part] | root |
[data-state] | "paused" | "idle" |
[data-orientation] | The orientation of the marquee |
[data-paused] | Present when paused |
| CSS Variable | Description |
|---|---|
--marquee-duration | The marquee duration value for the Root |
--marquee-spacing | The marquee spacing value for the Root |
--marquee-delay | The marquee delay value for the Root |
--marquee-loop-count | The marquee loop count value for the Root |
--marquee-translate | The marquee translate value for the Root |
Content
Renders a <div> element.
| Prop | Default | Type |
|---|---|---|
asChild | booleanUse the provided child element as the default rendered element, combining their props and behavior. For more details, read our Composition guide. |
| Attribute | Description |
|---|---|
[data-scope] | marquee |
[data-part] | |
[data-index] | The index of the item |
[data-orientation] | The orientation of the content |
[data-side] | |
[data-reverse] | |
[data-clone] |
Edge
Renders a <div> element.
| Prop | Default | Type |
|---|---|---|
side | SideThe side where the edge gradient should appear. | |
asChild | booleanUse the provided child element as the default rendered element, combining their props and behavior. For more details, read our Composition guide. |
| Attribute | Description |
|---|---|
[data-scope] | marquee |
[data-part] | |
[data-side] | |
[data-orientation] | The orientation of the edge |
Item
Renders a <div> element.
| Prop | Default | Type |
|---|---|---|
asChild | booleanUse the provided child element as the default rendered element, combining their props and behavior. For more details, read our Composition guide. |
RootProvider
Renders a <div> element.
| Prop | Default | Type |
|---|---|---|
value | UseMarqueeReturn | |
asChild | booleanUse the provided child element as the default rendered element, combining their props and behavior. For more details, read our Composition guide. |
Viewport
Renders a <div> element.
| Prop | Default | Type |
|---|---|---|
asChild | booleanUse the provided child element as the default rendered element, combining their props and behavior. For more details, read our Composition guide. |
| Attribute | Description |
|---|---|
[data-scope] | marquee |
[data-part] | |
[data-orientation] | The orientation of the viewport |
[data-side] |
Context
API
| Property | Type |
|---|---|
paused | booleanWhether the marquee is currently paused. |
orientation | "horizontal" | "vertical"The current orientation of the marquee. |
side | SideThe current side/direction of the marquee. |
multiplier | numberThe multiplier for auto-fill. Indicates how many times to duplicate content. When autoFill is enabled and content is smaller than container, this returns the number of additional copies needed. Otherwise returns 1. |
contentCount | numberThe total number of content elements to render (original + clones). Use this value when rendering your content in a loop. |
pause | VoidFunctionPause the marquee animation. |
resume | VoidFunctionResume the marquee animation. |
togglePause | VoidFunctionToggle the pause state. |
restart | VoidFunctionRestart the marquee animation from the beginning. |