コンポーネント

(コンポーネント一覧の翻訳、以下同様)... アコーディオン ... アラートダイアログ ... アスペクト比 ... アバター ... チェックボックス ... 折りたたみ可能 ... コンテキストメニュー ... ダイアログ ... ドロップダウンメニュー ... フォーム(プレビュー) ... ホバーカード ... ラベル ... メニューバー ... ナビゲーションメニュー ... ポップオーバー ... 進捗 ... ラジオグループ ... スクロール領域 ... 選択 ... セパレータ ... スライダー ... スイッチ ... タブ ... トースト ... トグル ... トグルグループ ... ツールバー ... ツールチップ

ユーティリティ

(ユーティリティ一覧の翻訳、以下同様)... アクセシブルアイコン ... アナウンス(非推奨) ... 方向プロバイダー ... IDプロバイダー(非推奨) ... ポリモーフィック(非推奨) ... ポータル ... スロット ... 視覚的に非表示
コンポーネント

選択

ユーザーが選択できるオプションのリストを表示します。ボタンによってトリガーされます。

import React from 'react';
import * as Select from '@radix-ui/react-select';
import classnames from 'classnames';
import { CheckIcon, ChevronDownIcon, ChevronUpIcon } from '@radix-ui/react-icons';
import './styles.css';
const SelectDemo = () => (
<Select.Root>
<Select.Trigger className="SelectTrigger" aria-label="Food">
<Select.Value placeholder="Select a fruit…" />
<Select.Icon className="SelectIcon">
<ChevronDownIcon />
</Select.Icon>
</Select.Trigger>
<Select.Portal>
<Select.Content className="SelectContent">
<Select.ScrollUpButton className="SelectScrollButton">
<ChevronUpIcon />
</Select.ScrollUpButton>
<Select.Viewport className="SelectViewport">
<Select.Group>
<Select.Label className="SelectLabel">Fruits</Select.Label>
<SelectItem value="apple">Apple</SelectItem>
<SelectItem value="banana">Banana</SelectItem>
<SelectItem value="blueberry">Blueberry</SelectItem>
<SelectItem value="grapes">Grapes</SelectItem>
<SelectItem value="pineapple">Pineapple</SelectItem>
</Select.Group>
<Select.Separator className="SelectSeparator" />
<Select.Group>
<Select.Label className="SelectLabel">Vegetables</Select.Label>
<SelectItem value="aubergine">Aubergine</SelectItem>
<SelectItem value="broccoli">Broccoli</SelectItem>
<SelectItem value="carrot" disabled>
Carrot
</SelectItem>
<SelectItem value="courgette">Courgette</SelectItem>
<SelectItem value="leek">Leek</SelectItem>
</Select.Group>
<Select.Separator className="SelectSeparator" />
<Select.Group>
<Select.Label className="SelectLabel">Meat</Select.Label>
<SelectItem value="beef">Beef</SelectItem>
<SelectItem value="chicken">Chicken</SelectItem>
<SelectItem value="lamb">Lamb</SelectItem>
<SelectItem value="pork">Pork</SelectItem>
</Select.Group>
</Select.Viewport>
<Select.ScrollDownButton className="SelectScrollButton">
<ChevronDownIcon />
</Select.ScrollDownButton>
</Select.Content>
</Select.Portal>
</Select.Root>
);
const SelectItem = React.forwardRef(({ children, className, ...props }, forwardedRef) => {
return (
<Select.Item className={classnames('SelectItem', className)} {...props} ref={forwardedRef}>
<Select.ItemText>{children}</Select.ItemText>
<Select.ItemIndicator className="SelectItemIndicator">
<CheckIcon />
</Select.ItemIndicator>
</Select.Item>
);
});
export default SelectDemo;

機能

    制御することも、制御しないこともできます。

    2つの配置モードを提供します。

    アイテム、ラベル、アイテムのグループをサポートします。

    フォーカスは完全に管理されます。

    完全なキーボードナビゲーション。

    カスタムプレースホルダーをサポートします。

    先行入力のサポート。

    右から左への方向をサポートします。

インストール

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

npm install @radix-ui/react-select

構造

すべてのパーツをインポートして、それらをまとめて組み立てます。

import * as Select from '@radix-ui/react-select';
export default () => (
<Select.Root>
<Select.Trigger>
<Select.Value />
<Select.Icon />
</Select.Trigger>
<Select.Portal>
<Select.Content>
<Select.ScrollUpButton />
<Select.Viewport>
<Select.Item>
<Select.ItemText />
<Select.ItemIndicator />
</Select.Item>
<Select.Group>
<Select.Label />
<Select.Item>
<Select.ItemText />
<Select.ItemIndicator />
</Select.Item>
</Select.Group>
<Select.Separator />
</Select.Viewport>
<Select.ScrollDownButton />
<Select.Arrow />
</Select.Content>
</Select.Portal>
</Select.Root>
);

API リファレンス

ルート

選択のすべてのパーツが含まれています。

プロパティタイプデフォルト
defaultValue
文字列
デフォルト値なし
value
文字列
デフォルト値なし
onValueChange
関数
デフォルト値なし
defaultOpen
真偽値
デフォルト値なし
open
真偽値
デフォルト値なし
onOpenChange
関数
デフォルト値なし
dir
列挙型
デフォルト値なし
name
文字列
デフォルト値なし
disabled
真偽値
デフォルト値なし
required
真偽値
デフォルト値なし

トリガー

選択を切り替えるボタン。Select.Content は、トリガーに揃えて配置されます。

プロパティタイプデフォルト
asChild
真偽値
false
データ属性
[data-state]"open" |"closed"
[data-disabled]

無効になっている場合に存在

[data-placeholder]

プレースホルダーがある場合に存在

選択された値を反映する部分です。デフォルトでは、選択された項目のテキストが表示されます。より詳細な制御が必要な場合は、代わりにselectを制御し、独自の children を渡すことができます。正しい位置を確保するために、スタイルを設定しないでください。 selectに値がない場合は、オプションの placeholder propも使用できます。

プロパティタイプデフォルト
asChild
真偽値
false
プレースホルダー
ReactNode
デフォルト値なし

アイコン

値の横に表示される小さなアイコンで、開くことができることを視覚的に示します。デフォルトでは▼が表示されますが、 asChild を使用して独自のアイコンを使用するか、 children を使用できます。

プロパティタイプデフォルト
asChild
真偽値
false

ポータル

使用すると、コンテンツ部分を body にポータルします。

プロパティタイプデフォルト
コンテナ
HTMLElement
document.body

コンテンツ

選択が開いたときにポップアウトするコンポーネントです。

プロパティタイプデフォルト
asChild
真偽値
false
onCloseAutoFocus
関数
デフォルト値なし
onEscapeKeyDown
関数
デフォルト値なし
onPointerDownOutside
関数
デフォルト値なし
位置
列挙型
"item-aligned" (アイテムに揃える)
列挙型
"bottom" (下)
sideOffset (側オフセット)
数値
0
align (整列)
列挙型
"start" (開始)
alignOffset (整列オフセット)
数値
0
avoidCollisions (衝突回避)
真偽値
true (真)
collisionBoundary (衝突境界)
境界
[]
collisionPadding (衝突パディング)
数値 | パディング
10
arrowPadding (矢印パディング)
数値
0
sticky (スティッキー)
列挙型
"partial" (部分的)
hideWhenDetached (デタッチ時に非表示)
真偽値
false
データ属性
[data-state]"open" |"closed"
[data-side]"left" (左) |"right" (右) |"bottom" (下) |"top" (上)
[data-align]"start" (開始) |"end" (終了) |"center" (中央)
CSS変数説明
--radix-select-content-transform-originコンテンツと矢印の位置/オフセットから計算された transform-origin です。 position="popper" の場合にのみ存在します。
--radix-select-content-available-widthトリガーと境界線の端の間の残りの幅です。 position="popper" の場合にのみ存在します。
--radix-select-content-available-heightトリガーと境界線の端の間の残りの高さです。 position="popper" の場合にのみ存在します。
--radix-select-trigger-widthトリガーの幅です。以下の場合にのみ存在します。 position="popper".
--radix-select-trigger-heightトリガーの高さです。以下の場合にのみ存在します。 position="popper".

ビューポート

すべてのアイテムを含むスクロール可能なビューポートです。

プロパティタイプデフォルト
asChild
真偽値
false

アイテム

選択項目を含むコンポーネントです。

プロパティタイプデフォルト
asChild
真偽値
false
value*
文字列
デフォルト値なし
disabled
真偽値
デフォルト値なし
textValue (テキスト値)
文字列
デフォルト値なし
データ属性
[data-state]"checked" (チェック済み) |"unchecked" (チェックなし)
[data-highlighted]

ハイライトされている場合に存在します

[data-disabled]

無効になっている場合に存在

ItemText (アイテムテキスト)

アイテムのテキスト部分です。そのアイテムが選択されたときにトリガーに表示したいテキストのみを含める必要があります。正しい位置を確保するために、スタイルを設定しないでください。

プロパティタイプデフォルト
asChild
真偽値
false

ItemIndicator (アイテムインジケーター)

アイテムが選択されているときにレンダリングされます。この要素を直接スタイル設定するか、アイコンを入れるためのラッパーとして使用するか、または両方を行うことができます。

プロパティタイプデフォルト
asChild
真偽値
false

ScrollUpButton (上スクロールボタン)

ビューポートのオーバーフローを表示するためのアフォーダンスとして使用されるオプションのボタンで、機能的に上方向へのスクロールを有効にします。

プロパティタイプデフォルト
asChild
真偽値
false

ScrollDownButton (下スクロールボタン)

ビューポートのオーバーフローを表示するためのアフォーダンスとして使用されるオプションのボタンで、機能的に下方向へのスクロールを有効にします。

プロパティタイプデフォルト
asChild
真偽値
false

グループ

複数のアイテムをグループ化するために使用します。 Select.Label と組み合わせて使用​​すると、自動ラベル付けによりアクセシビリティが向上します。

プロパティタイプデフォルト
asChild
真偽値
false

ラベル

グループのラベルをレンダリングするために使用します。矢印キーを使用してフォーカスすることはできません。

プロパティタイプデフォルト
asChild
真偽値
false

セパレータ

選択項目を視覚的に区切るために使用します。

プロパティタイプデフォルト
asChild
真偽値
false

矢印

コンテンツと一緒にレンダリングするオプションの矢印要素です。これは、トリガーと Select.Content を視覚的にリンクするのに役立ちます。 Select.Content 内にレンダリングする必要があります。 positionpopper に設定されている場合にのみ使用できます。

プロパティタイプデフォルト
asChild
真偽値
false
数値
10
高さ
数値
5

配置モードの変更

デフォルトでは、 Select は、アクティブなアイテムを基準にして Select.Content を配置することにより、ネイティブのMacOSメニューと同様に動作します。 PopoverDropdownMenu に似た代替の配置方法が必要な場合は、 positionpopper に設定し、 sidesideOffset などの追加の配置オプションを使用できます。

// index.jsx
import * as Select from '@radix-ui/react-select';
export default () => (
<Select.Root>
<Select.Trigger></Select.Trigger>
<Select.Portal>
<Select.Content position="popper" sideOffset={5}>
</Select.Content>
</Select.Portal>
</Select.Root>
);

コンテンツサイズの制約

Select.Contentposition="popper" を使用する場合、コンテンツの幅がトリガーの幅と一致するように制約することができます。また、高さがビューポートを超えないように制約することもできます。

これをサポートするために、 --radix-select-trigger-width--radix-select-content-available-height などのいくつかのCSSカスタムプロパティを公開しています。これらを使用して、コンテンツの寸法を制約します。

// index.jsx
import * as Select from '@radix-ui/react-select';
import './styles.css';
export default () => (
<Select.Root>
<Select.Trigger></Select.Trigger>
<Select.Portal>
<Select.Content className="SelectContent" position="popper" sideOffset={5} >
</Select.Content>
</Select.Portal>
</Select.Root>
);
/* styles.css */
.SelectContent {
width: var(--radix-select-trigger-width);
max-height: var(--radix-select-content-available-height);
}

無効化されたアイテムを使用する場合

data-disabled 属性を使用して、無効化されたアイテムに特別なスタイルを追加できます。

// index.jsx
import * as Select from '@radix-ui/react-select';
import './styles.css';
export default () => (
<Select.Root>
<Select.Trigger></Select.Trigger>
<Select.Portal>
<Select.Content>
<Select.Viewport>
<Select.Item className="SelectItem" disabled>
</Select.Item>
<Select.Item></Select.Item>
<Select.Item></Select.Item>
</Select.Viewport>
</Select.Content>
</Select.Portal>
</Select.Root>
);
/* styles.css */
.SelectItem[data-disabled] {
color: 'gainsboro';
}

プレースホルダーを使用する場合

選択に値がない場合は、 Valueplaceholder propを使用できます。スタイル設定に役立つ Triggerdata-placeholder 属性もあります。

// index.jsx
import * as Select from '@radix-ui/react-select';
import './styles.css';
export default () => (
<Select.Root>
<Select.Trigger className="SelectTrigger">
<Select.Value placeholder="Pick an option" />
<Select.Icon />
</Select.Trigger>
<Select.Portal>
<Select.Content></Select.Content>
</Select.Portal>
</Select.Root>
);
/* styles.css */
.SelectTrigger[data-placeholder] {
color: 'gainsboro';
}

セパレータを使用する場合

Separator パートを使用して、アイテムの間にセパレータを追加します。

<Select.Root>
<Select.Trigger></Select.Trigger>
<Select.Portal>
<Select.Content>
<Select.Viewport>
<Select.Item></Select.Item>
<Select.Item></Select.Item>
<Select.Item></Select.Item>
<Select.Separator />
<Select.Item></Select.Item>
<Select.Item></Select.Item>
</Select.Viewport>
</Select.Content>
</Select.Portal>
</Select.Root>

グループ化されたアイテムを使用する場合

GroupLabel パートを使用して、アイテムをセクションにグループ化します。

<Select.Root>
<Select.Trigger></Select.Trigger>
<Select.Portal>
<Select.Content>
<Select.Viewport>
<Select.Group>
<Select.Label>Label</Select.Label>
<Select.Item></Select.Item>
<Select.Item></Select.Item>
<Select.Item></Select.Item>
</Select.Group>
</Select.Viewport>
</Select.Content>
</Select.Portal>
</Select.Root>

複雑なアイテムを使用する場合

アイテムにカスタムコンテンツを使用できます。

import * as Select from '@radix-ui/react-select';
export default () => (
<Select.Root>
<Select.Trigger></Select.Trigger>
<Select.Portal>
<Select.Content>
<Select.Viewport>
<Select.Item>
<Select.ItemText>
<img src="" />
Adolfo Hess
</Select.ItemText>
<Select.ItemIndicator></Select.ItemIndicator>
</Select.Item>
<Select.Item></Select.Item>
<Select.Item></Select.Item>
</Select.Viewport>
</Select.Content>
</Select.Portal>
</Select.Root>
);

トリガーに表示される値の制御

デフォルトでは、トリガーは選択されたアイテムの ItemText のコンテンツを自動的に表示します。 ItemText パートの内側/外側に配置することで、表示内容を制御できます。

より柔軟性が必要な場合は、 value / onValueChange propを使用してコンポーネントを制御し、 childrenSelectValue に渡すことができます。そこに配置するものがアクセス可能であることを確認してください。

const countries = { france: '🇫🇷', 'united-kingdom': '🇬🇧', spain: '🇪🇸' };
export default () => {
const [value, setValue] = React.useState('france');
return (
<Select.Root value={value} onValueChange={setValue}>
<Select.Trigger>
<Select.Value aria-label={value}>
{countries[value]}
</Select.Value>
<Select.Icon />
</Select.Trigger>
<Select.Portal>
<Select.Content>
<Select.Viewport>
<Select.Item value="france">
<Select.ItemText>France</Select.ItemText>
<Select.ItemIndicator></Select.ItemIndicator>
</Select.Item>
<Select.Item value="united-kingdom">
<Select.ItemText>United Kingdom</Select.ItemText>
<Select.ItemIndicator></Select.ItemIndicator>
</Select.Item>
<Select.Item value="spain">
<Select.ItemText>Spain</Select.ItemText>
<Select.ItemIndicator></Select.ItemIndicator>
</Select.Item>
</Select.Viewport>
</Select.Content>
</Select.Portal>
</Select.Root>
);
};

カスタムスクロールバーを使用する場合

最高のUXを実現するために、 ScrollUpButtonScrollDownButton パートを使用することをお勧めしているため、ネイティブのスクロールバーはデフォルトで非表示になっています。これらのパートを使用したくない場合は、 スクロールエリア プリミティブを使用して選択を作成します。

// index.jsx
import * as Select from '@radix-ui/react-select';
import * as ScrollArea from '@radix-ui/react-scroll-area';
import './styles.css';
export default () => (
<Select.Root>
<Select.Trigger></Select.Trigger>
<Select.Portal>
<Select.Content>
<ScrollArea.Root className="ScrollAreaRoot" type="auto">
<Select.Viewport asChild>
<ScrollArea.Viewport className="ScrollAreaViewport">
<StyledItem></StyledItem>
<StyledItem></StyledItem>
<StyledItem></StyledItem>
</ScrollArea.Viewport>
</Select.Viewport>
<ScrollArea.Scrollbar className="ScrollAreaScrollbar" orientation="vertical" >
<ScrollArea.Thumb className="ScrollAreaThumb" />
</ScrollArea.Scrollbar>
</ScrollArea.Root>
</Select.Content>
</Select.Portal>
</Select.Root>
);
/* styles.css */
.ScrollAreaRoot {
width: 100%;
height: 100%;
}
.ScrollAreaViewport {
width: 100%;
height: 100%;
}
.ScrollAreaScrollbar {
width: 4px;
padding: 5px 2px;
}
.ScrollAreaThumb {
background: rgba(0, 0, 0, 0.3);
border-radius: 3px;
}

アクセシビリティ

ListBox WAI-ARIA設計パターンに準拠しています。

W3Cの 選択専用コンボボックス の例を参照して、詳細を確認してください。

キーボード操作

キー説明
スペース
Select.Trigger にフォーカスがある場合、選択を開き、選択されたアイテムにフォーカスします。
アイテムにフォーカスがある場合、フォーカスされているアイテムを選択します。
Enter
Select.Trigger にフォーカスがある場合、選択を開き、最初のアイテムにフォーカスします。
アイテムにフォーカスがある場合、フォーカスされているアイテムを選択します。
下矢印
Select.Trigger にフォーカスがある場合、選択を開きます。
アイテムにフォーカスがある場合、フォーカスを次のアイテムに移動します。
上矢印
Select.Trigger にフォーカスがある場合、選択を開きます。
アイテムにフォーカスがある場合、フォーカスを前のアイテムに移動します。
Esc
選択を閉じ、フォーカスを Select.Trigger に移動します。

ラベル付け

視覚的にもアクセシブルにも優れたラベルを select に提供するために、Label コンポーネントを使用してください。

import * as Select from '@radix-ui/react-select';
import { Label } from '@radix-ui/react-label';
export default () => (
<>
<Label>
Country
<Select.Root></Select.Root>
</Label>
{/* or */}
<Label htmlFor="country">Country</Label>
<Select.Root>
<Select.Trigger id="country"></Select.Trigger>
<Select.Portal>
<Select.Content></Select.Content>
</Select.Portal>
</Select.Root>
</>
);

カスタムAPI

プリミティブな部分を独自のコンポーネントに抽象化することで、独自のAPIを作成できます。

SelectSelectItem に抽象化します。

この例では、ほとんどの部分を抽象化しています。

使用方法

import { Select, SelectItem } from './your-select';
export default () => (
<Select defaultValue="2">
<SelectItem value="1">Item 1</SelectItem>
<SelectItem value="2">Item 2</SelectItem>
<SelectItem value="3">Item 3</SelectItem>
</Select>
);

実装

// your-select.jsx
import React from 'react';
import * as SelectPrimitive from '@radix-ui/react-select';
import { CheckIcon, ChevronDownIcon, ChevronUpIcon, } from '@radix-ui/react-icons';
export const Select = React.forwardRef(
({ children, ...props }, forwardedRef) => {
return (
<SelectPrimitive.Root {...props}>
<SelectPrimitive.Trigger ref={forwardedRef}>
<SelectPrimitive.Value />
<SelectPrimitive.Icon>
<ChevronDownIcon />
</SelectPrimitive.Icon>
</SelectPrimitive.Trigger>
<SelectPrimitive.Portal>
<SelectPrimitive.Content>
<SelectPrimitive.ScrollUpButton>
<ChevronUpIcon />
</SelectPrimitive.ScrollUpButton>
<SelectPrimitive.Viewport>{children}</SelectPrimitive.Viewport>
<SelectPrimitive.ScrollDownButton>
<ChevronDownIcon />
</SelectPrimitive.ScrollDownButton>
</SelectPrimitive.Content>
</SelectPrimitive.Portal>
</SelectPrimitive.Root>
);
}
);
export const SelectItem = React.forwardRef(
({ children, ...props }, forwardedRef) => {
return (
<SelectPrimitive.Item {...props} ref={forwardedRef}>
<SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>
<SelectPrimitive.ItemIndicator>
<CheckIcon />
</SelectPrimitive.ItemIndicator>
</SelectPrimitive.Item>
);
}
);