Native Solid 2 fork. Original documentation and designs © WorkOS; historical posts retain their original context.

Scroll Area

Augments native scroll functionality for custom, cross-browser styling.

Download runnable sandbox
import { ScrollArea } from "@radix-solid/primitives";
import styles from "./styles.module.css";
const TAGS = Array.from({
length: 50
}).map((_, i, a) => `v1.2.0-beta.${a.length - i}`);
const ScrollAreaDemo = () => <ScrollArea.Root class={styles.Root}>
<ScrollArea.Viewport class={styles.Viewport}>
<div style={{ "padding": "15px 20px" }}>
<div class={styles.Text}>Tags</div>
{TAGS.map(tag => <div class={styles.Tag}>
{tag}
</div>)}
</div>
</ScrollArea.Viewport>
<ScrollArea.Scrollbar class={styles.Scrollbar} orientation="vertical">
<ScrollArea.Thumb class={styles.Thumb} />
</ScrollArea.Scrollbar>
<ScrollArea.Scrollbar class={styles.Scrollbar} orientation="horizontal">
<ScrollArea.Thumb class={styles.Thumb} />
</ScrollArea.Scrollbar>
<ScrollArea.Corner class={styles.Corner} />
</ScrollArea.Root>;
export default ScrollAreaDemo;

Features

  • Scrollbar sits on top of the scrollable content, taking up no space.

  • Scrolling is native; no underlying position movements via CSS transformations.

  • Shims pointer behaviors only when interacting with the controls, so keyboard controls are unaffected.

  • Supports Right to Left direction.

Anatomy

Import all parts and piece them together.

import { ScrollArea } from "@radix-solid/primitives";
export default () => <ScrollArea.Root>
<ScrollArea.Viewport />
<ScrollArea.Scrollbar orientation="horizontal">
<ScrollArea.Thumb />
</ScrollArea.Scrollbar>
<ScrollArea.Scrollbar orientation="vertical">
<ScrollArea.Thumb />
</ScrollArea.Scrollbar>
<ScrollArea.Corner />
</ScrollArea.Root>;

API Reference

Root

Contains all the parts of a scroll area.

PropTypeDefault
asChildbooleanfalse
typeenum"hover"
scrollHideDelaynumber600
direnum—
noncestring—

Viewport

The viewport area of the scroll area.

PropTypeDefault
asChildbooleanfalse

Scrollbar

The vertical scrollbar. Add a second Scrollbar with an orientation prop to enable horizontal scrolling.

PropTypeDefault
asChildbooleanfalse
forceMountboolean—
orientationenumvertical
Data attributeValues
[data-state]"visible" | "hidden"
[data-orientation]"vertical" | "horizontal"

Thumb

The thumb to be used in ScrollArea.Scrollbar.

PropTypeDefault
asChildbooleanfalse
Data attributeValues
[data-state]"visible" | "hidden"

Corner

The corner where both vertical and horizontal scrollbars meet.

PropTypeDefault
asChildbooleanfalse

Accessibility

In most cases, it's best to rely on native scrolling and work with the customization options available in CSS. When that isn't enough, ScrollArea provides additional customizability while maintaining the browser's native scroll behavior (as well as accessibility features, like keyboard scrolling).

Keyboard Interactions

Scrolling via keyboard is supported by default because the component relies on native scrolling. Specific keyboard interactions may differ between platforms, so we do not specify them here or add specific event listeners to handle scrolling via key events.