Scroll area
最小限のスクロールバーを備えたネイティブスクロールです。端は続きがある側だけフェードし、最後の項目を半分で切って見せるピークも任意で使えます。
pnpm dlx shadcn@latest add https://hextaui.com/r/scroll-area.jsonコンポーネント、HextaUIのテーマトークン、依存するHextaUIコンポーネントを追加します。
まだ追加していない場合は、グローバルCSSにテーマトークンを追加してください。
依存関係をインストールします。
pnpm add @base-ui/react class-variance-authority cn次のコードをコピーしてプロジェクトに貼り付けてください。
components/ui/scroll-area.tsx インポートパスは、お使いのプロジェクト構成に合わせて更新してください。
スクロール領域に固定の高さまたは幅を指定します。それを超えるコンテンツはネイティブのスクロール動作でスクロールし、ホバー中やスクロール中は細いスクロールバーが現れます。
Peek
どちらのリストも同じ高さです。右側の peek では、最後に見える項目が途中で切れるようにボックスが自動で高さを詰め、誰かが試す前にスクロールできることを示します。ボックスの高さを半分未満には詰めません。
テキスト
フェードは、スクロール先にさらにコンテンツがある端にのみ付きます。上端にいる間は下端だけがフェードし、端から離れるほどフェードが強くなります。
下端から開始
viewportRef はスクロールする要素を返します。その scrollTop を設定してチャットを最新のメッセージから始めると、上端だけがフェードします。
水平
scrollbars="horizontal" を設定し、コンテンツがボックスを超えて伸びられるよう w-max を指定します。
両方の軸
scrollbars="both" は両方のスクロールバーとその交点のコーナーを表示し、四辺すべてをフェードします。
動的なコンテンツ
Peek とフェードは、項目の追加や削除に応じて更新されます。スクロールするには項目が少なすぎる場合、ボックスは高さを保ち、何もフェードしません。
色付きの面の上
フェードはオーバーレイの色ではなくコンテンツへのマスクなので、どんな背景でも機能します。
シートの中
flex の列の内側では、min-h-0 flex-1 を付けた要素で囲み、スクロール領域に h-full を指定して、残りの空間を埋めます。
フェードなし
fade={false} で端のフェードをオフにします。
右から左
コンテンツは右端から始まり、スクロールバーとフェードは文字の読み方向に従い、方向はページから取得されます。
ビューポートは、スクロールできるものがあるときにだけタブ順に入ります。フォーカスされると、ブラウザーのネイティブのキーでスクロールします。
| キー | アクション |
|---|---|
| Tab | コンテンツがあふれているとき、ビューポートにフォーカスします。 |
| ↑↓ | 縦にスクロールします。 |
| ←→ | 横にスクロールします。 |
| Page UpPage DownSpace | 1ページ分スクロールします。 |
| HomeEnd | 先頭または末尾へジャンプします。 |
- チャットの例の「Messages」ラベルのように、周囲のコンテンツから用途が明確でない場合は、スクロール領域に
aria-labelを付けてください。 - フォーカスリングはスクロール領域自体に描画されるため、フェードした端の上でも見え続けます。
Base UI の scroll area 上に構築されています。ScrollArea は、ルート、ビューポート、コンテンツ、スクロールバーをまとめて描画します。
| プロパティ | 型 | デフォルト |
|---|---|---|
scrollbars | "vertical" | "horizontal" | "both" | "vertical" |
fadeさらにコンテンツがある端をフェードします。 | boolean | true |
peek最後に見える項目が途中で切れるように高さを詰めます。data-scroll-area-item を付けた項目が対象になるため、どの要素を数えるか選べます。 | boolean | false |
viewportRefスクロールする要素。 | Ref<HTMLDivElement> | – |
overflowEdgeThreshold端があふれているとみなすまでにスクロールするピクセル数。 | number | { xStart, xEnd, yStart, yEnd } | 0 |
className | string | (state) => string | – |
render | ReactElement | (props, state) => ReactElement | <div> |
| 属性 | 説明 |
|---|---|
data-slot="scroll-area" | ルート。 |
data-slot="scroll-area-viewport" | スクロールする要素。 |
data-slot="scroll-area-content" | コンテンツをビューポートの内側で囲みます。 |
data-peek | peek が有効なときに付きます。 |
data-peeking | peek が高さを詰めている間付きます。 |
data-scrolling | ユーザーがスクロールしている間付きます。 |
data-has-overflow-x | コンテンツがビューポートより広いときに付きます。 |
data-has-overflow-y | コンテンツがビューポートより高いときに付きます。 |
data-overflow-y-start | 上にさらにコンテンツがあるときに付きます。他の端には、-y-end、-x-start、-x-end の対応する属性があります。 |
--scroll-area-fade | 端のフェードのサイズ。デフォルトは 2.5rem です。 |
--scroll-area-overflow-y-start | 上端からの距離(ピクセル)。-y-end、-x-start、-x-end の対応する変数もあります。 |
ScrollArea が自動で描画します。Base UI のパーツを自分で組み立てる場合にのみエクスポートしてください。
| プロパティ | 型 | デフォルト |
|---|---|---|
orientation | "vertical" | "horizontal" | "vertical" |
render | ReactElement | (props, state) => ReactElement | <div> |
| 属性 | 説明 |
|---|---|
data-slot="scroll-area-scrollbar" | スクロールバーのトラック。 |
data-slot="scroll-area-thumb" | ドラッグ可能なつまみ。 |
data-orientation | vertical または horizontal。 |
data-hovering | ポインターが領域上にある間付きます。 |
data-scrolling | ユーザーがスクロールしている間付きます。 |
--scroll-area-thumb-height | つまみの高さ。 |
--scroll-area-thumb-width | つまみの幅。 |
- Accordionそれぞれがパネルを表示する見出しの積み重ねです。途中で反転できる高さのモーションを持ち、閉じている間もパネルの内容を検索できます。
- Aspect ratioメディアの読み込み前も形を保ち、読み込み中はシマー表示になり、メディアをフェードインさせ、失敗時はフォールバックを表示するボックスです。
- Carouselネイティブのスクロールスナップによるスライドです。タッチでの慣性、マウスドラッグ、矢印キー、ドット、サムネイル、適切なタイミングで一時停止する自動再生に対応します。
- Collapsible高さのモーションで表示と非表示を切り替えるパネルです。途中で反転でき、レイアウトが跳ねません。
- Resizableドラッグで分割できるパネルです。ホバーで目覚める控えめな区切り線、リセットや折りたたみで滑らかに動くサイズ、永続化されるレイアウトに対応します。
- Separatorコンテンツを水平または垂直に区切る細線です。ラベルを付けたり、見た目だけの線として装飾モードにしたりできます。