Components
Marquee

Marquee

A continuous scrolling component for displaying content in a seamless loop.

Loading...

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.RootProvider component, you don't need to use the Marquee.Root component.

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 pauseOnInteraction to allow users to pause animations on hover or focus, improving accessibility and readability
  • Use descriptive labels: Provide meaningful aria-label values 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.

PropDefaultType
asChild
boolean

Use the provided child element as the default rendered element, combining their props and behavior.

For more details, read our Composition guide.
autoFillfalse
boolean

Whether to automatically duplicate content to fill the container.

defaultPausedfalse
boolean

Whether the marquee is paused by default.

delay0
number

The 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.

loopCount0
number

The number of times to loop the animation (0 = infinite).

onComplete
() => void

Function called when the marquee completes all loops and stops. Only fires for finite loops (loopCount > 0).

onLoopComplete
() => void

Function called when the marquee completes one loop iteration.

onPauseChange
(details: PauseStatusDetails) => void

Function called when the pause status changes.

paused
boolean

Whether the marquee is paused.

pauseOnInteractionfalse
boolean

Whether to pause the marquee on user interaction (hover, focus).

reversefalse
boolean

Whether to reverse the animation direction.

side'start'
Side

The side/direction the marquee scrolls towards.

spacing'1rem'
string

The spacing between marquee items.

speed50
number

The speed of the marquee animation in pixels per second.

translations
IntlTranslations

The localized messages to use.

AttributeDescription
[data-scope]marquee
[data-part]root
[data-state]"paused" | "idle"
[data-orientation]The orientation of the marquee
[data-paused]Present when paused
CSS VariableDescription
--marquee-durationThe marquee duration value for the Root
--marquee-spacingThe marquee spacing value for the Root
--marquee-delayThe marquee delay value for the Root
--marquee-loop-countThe marquee loop count value for the Root
--marquee-translateThe marquee translate value for the Root

Content

Renders a <div> element.

PropDefaultType
asChild
boolean

Use the provided child element as the default rendered element, combining their props and behavior.

For more details, read our Composition guide.
AttributeDescription
[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.

PropDefaultType
side
Side

The side where the edge gradient should appear.

asChild
boolean

Use the provided child element as the default rendered element, combining their props and behavior.

For more details, read our Composition guide.
AttributeDescription
[data-scope]marquee
[data-part]
[data-side]
[data-orientation]The orientation of the edge

Item

Renders a <div> element.

PropDefaultType
asChild
boolean

Use 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.

PropDefaultType
value
UseMarqueeReturn

asChild
boolean

Use 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.

PropDefaultType
asChild
boolean

Use the provided child element as the default rendered element, combining their props and behavior.

For more details, read our Composition guide.
AttributeDescription
[data-scope]marquee
[data-part]
[data-orientation]The orientation of the viewport
[data-side]

Context

API

PropertyType
paused
boolean

Whether the marquee is currently paused.

orientation
"horizontal" | "vertical"

The current orientation of the marquee.

side
Side

The current side/direction of the marquee.

multiplier
number

The 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
number

The total number of content elements to render (original + clones). Use this value when rendering your content in a loop.

pause
VoidFunction

Pause the marquee animation.

resume
VoidFunction

Resume the marquee animation.

togglePause
VoidFunction

Toggle the pause state.

restart
VoidFunction

Restart the marquee animation from the beginning.