コンテンツにスキップ

ScrollArea

カスタムのクロスブラウザスタイリングのために、ネイティブスクロール機能を拡張します。
タグ
v1.2.0-beta.50
v1.2.0-beta.49
v1.2.0-beta.48
v1.2.0-beta.47
v1.2.0-beta.46
v1.2.0-beta.45
v1.2.0-beta.44
v1.2.0-beta.43
v1.2.0-beta.42
v1.2.0-beta.41
v1.2.0-beta.40
v1.2.0-beta.39
v1.2.0-beta.38
v1.2.0-beta.37
v1.2.0-beta.36
v1.2.0-beta.35
v1.2.0-beta.34
v1.2.0-beta.33
v1.2.0-beta.32
v1.2.0-beta.31
v1.2.0-beta.30
v1.2.0-beta.29
v1.2.0-beta.28
v1.2.0-beta.27
v1.2.0-beta.26
v1.2.0-beta.25
v1.2.0-beta.24
v1.2.0-beta.23
v1.2.0-beta.22
v1.2.0-beta.21
v1.2.0-beta.20
v1.2.0-beta.19
v1.2.0-beta.18
v1.2.0-beta.17
v1.2.0-beta.16
v1.2.0-beta.15
v1.2.0-beta.14
v1.2.0-beta.13
v1.2.0-beta.12
v1.2.0-beta.11
v1.2.0-beta.10
v1.2.0-beta.9
v1.2.0-beta.8
v1.2.0-beta.7
v1.2.0-beta.6
v1.2.0-beta.5
v1.2.0-beta.4
v1.2.0-beta.3
v1.2.0-beta.2
v1.2.0-beta.1
vue
<script setup lang="ts">
import { ScrollAreaRoot, ScrollAreaScrollbar, ScrollAreaThumb, ScrollAreaViewport } from 'radix-vue'

const tags = Array.from({ length: 50 }).map((_, i, a) => `v1.2.0-beta.${a.length - i}`)
</script>

<template>
  <ScrollAreaRoot
    class="w-[200px] h-[225px] rounded overflow-hidden shadow-[0_2px_10px] shadow-blackA7 bg-white"
    style="--scrollbar-size: 10px"
  >
    <ScrollAreaViewport class="w-full h-full rounded">
      <div class="py-[15px] px-5">
        <div class="text-grass11 text-[15px] leading-[18px] font-semibold">
          Tags
        </div>
        <div
          v-for="tag in tags"
          :key="tag"
          class="text-mauve12 text-[13px] leading-[18px] mt-2.5 pt-2.5 border-t border-t-mauve6"
        >
          {{ tag }}
        </div>
      </div>
    </ScrollAreaViewport>
    <ScrollAreaScrollbar
      class="flex select-none touch-none p-0.5 bg-blackA6 transition-colors duration-[160ms] ease-out hover:bg-blackA8 data-[orientation=vertical]:w-2.5 data-[orientation=horizontal]:flex-col data-[orientation=horizontal]:h-2.5"
      orientation="vertical"
    >
      <ScrollAreaThumb
        class="flex-1 bg-mauve10 rounded-[10px] relative before:content-[''] before:absolute before:top-1/2 before:left-1/2 before:-translate-x-1/2 before:-translate-y-1/2 before:w-full before:h-full before:min-w-[44px] before:min-h-[44px]"
      />
    </ScrollAreaScrollbar>
    <ScrollAreaScrollbar
      class="flex select-none touch-none p-0.5 bg-blackA6 transition-colors duration-[160ms] ease-out hover:bg-blackA8 data-[orientation=vertical]:w-2.5 data-[orientation=horizontal]:flex-col data-[orientation=horizontal]:h-2.5"
      orientation="horizontal"
    >
      <ScrollAreaThumb
        class="flex-1 bg-mauve10 rounded-[10px] relative before:content-[''] before:absolute before:top-1/2 before:left-1/2 before:-translate-x-1/2 before:-translate-y-1/2 before:w-full before:h-full before:min-w-[44px] before:min-h-[44px]"
      />
    </ScrollAreaScrollbar>
  </ScrollAreaRoot>
</template>

機能

  • スクロールバーはスクロール可能なコンテンツの上に配置され、スペースを占有しません。
  • スクロールはネイティブです。CSS変換による位置の移動はありません。
  • コントロール操作時のみポインターの動作をシミュレートするため、キーボード操作には影響しません。
  • 右から左への方向をサポートします。

インストール

コマンドラインからコンポーネントをインストールします。

sh
$ npm add radix-vue

構造

すべてのパーツをインポートして組み立てます。

vue
<script setup>
import { ScrollAreaRoot, ScrollAreaScrollbar, ScrollAreaThumb, ScrollAreaViewport } from 'radix-vue'
</script>

<template>
  <ScrollAreaRoot>
    <ScrollAreaViewport />
    <ScrollAreaScrollbar orientation="horizontal">
      <ScrollAreaThumb />
    </ScrollAreaScrollbar>
    <ScrollAreaScrollbar orientation="vertical">
      <ScrollAreaThumb />
    </ScrollAreaScrollbar>
    <ScrollAreaCorner />
  </ScrollAreaRoot>
</template>

APIリファレンス

ルート

スクロールエリアのすべてのパーツが含まれています。

プロパティデフォルト
as
'div'
AsTag | Component

このコンポーネントがレンダリングされる要素またはコンポーネント。`asChild` で上書きできます。

asChild
boolean

デフォルトのレンダリング要素を子として渡された要素に変更し、それらのプロパティと動作をマージします。

詳細については、コンポジションガイドをお読みください。

dir
'ltr' | 'rtl'

該当する場合のコンボボックスの読み取り方向。
省略した場合、`ConfigProvider` からグローバルに継承するか、LTR(左から右)読み取りモードと見なされます。

scrollHideDelay
600
number

型が `scroll` または `hover` に設定されている場合、このプロパティは、ユーザーがスクロールバーの操作を停止した後にスクロールバーが非表示になるまでの時間(ミリ秒単位)を決定します。

type
'hover'
'always' | 'scroll' | 'hover' | 'auto'

MacOSのスクロールバー設定がネイティブスクロールバーの表示を制御する方法と同様に、スクロールバーの表示方法を指定します。

`auto` - コンテンツが対応する方向にオーバーフローしている場合にスクロールバーが表示されます。
`always` - コンテンツがオーバーフローしているかどうかに関係なく、スクロールバーが常に表示されます。
`scroll` - ユーザーが対応する方向にスクロールしているときにスクロールバーが表示されます。
`hover` - ユーザーが対応する方向にスクロールしているとき、およびユーザーがスクロールエリアにカーソルを合わせているときにスクロールバーが表示されます。

メソッド
scrollTop
() => void

ビューポートを一番上にスクロールします

scrollTopLeft
() => void

ビューポートを左上にスクロールします

ビューポート

スクロールエリアのビューポート領域。

プロパティデフォルト
as
'div'
AsTag | Component

このコンポーネントがレンダリングされる要素またはコンポーネント。`asChild` で上書きできます。

asChild
boolean

デフォルトのレンダリング要素を子として渡された要素に変更し、それらのプロパティと動作をマージします。

詳細については、コンポジションガイドをお読みください。

nonce
string

スタイルタグに `nonce` 属性を追加します。これは、コンテンツセキュリティポリシーで使用できます。
省略した場合、`ConfigProvider` からグローバルに継承されます。

スクロールバー

垂直スクロールバー。`orientation` プロパティを持つ2つ目の `Scrollbar` を追加して、水平スクロールを有効にします。

プロパティデフォルト
as
'div'
AsTag | Component

このコンポーネントがレンダリングされる要素またはコンポーネント。`asChild` で上書きできます。

asChild
boolean

デフォルトのレンダリング要素を子として渡された要素に変更し、それらのプロパティと動作をマージします。

詳細については、コンポジションガイドをお読みください。

forceMount
boolean

より詳細な制御が必要な場合にマウントを強制するために使用されます。Vueアニメーションライブラリでアニメーションを制御する場合に役立ちます。

orientation
'vertical'
'vertical' | 'horizontal'

スクロールバーの方向

データ属性
[data-state]"visible" | "hidden"
[data-orientation]"vertical" | "horizontal"

つまみ

`ScrollAreaScrollbar` で使用されるつまみ。

プロパティデフォルト
as
'div'
AsTag | Component

このコンポーネントがレンダリングされる要素またはコンポーネント。`asChild` で上書きできます。

asChild
boolean

デフォルトのレンダリング要素を子として渡された要素に変更し、それらのプロパティと動作をマージします。

詳細については、コンポジションガイドをお読みください。

データ属性
[data-state]"visible" | "hidden"

コーナー

垂直スクロールバーと水平スクロールバーが交わるコーナー。

プロパティデフォルト
as
'div'
AsTag | Component

このコンポーネントがレンダリングされる要素またはコンポーネント。`asChild` で上書きできます。

asChild
boolean

デフォルトのレンダリング要素を子として渡された要素に変更し、それらのプロパティと動作をマージします。

詳細については、コンポジションガイドをお読みください。

アクセシビリティ

ほとんどの場合、ネイティブスクロールに依存し、CSSで使用可能なカスタマイズオプションを使用するのが最適です。それが不十分な場合、`ScrollArea` はブラウザのネイティブスクロール動作(およびキーボードスクロールなどのアクセシビリティ機能)を維持しながら、追加のカスタマイズ可能性を提供します。

キーボード操作

コンポーネントはネイティブスクロールに依存しているため、キーボードによるスクロールはデフォルトでサポートされています。特定のキーボード操作はプラットフォームによって異なる場合があるため、ここではそれらを指定したり、キーイベントによるスクロールを処理するための特定のイベントリスナーを追加したりしません。