sashigane
コンポーネント

Tabs

タブ。同じ場所で中身を切り替える

依存は持ちません

素の HTML にタブはありませんが、作るのに要るのはブラウザが持っているものだけです—— button と、フォーカスの移動と、キーボードの操作。

Tab キーで止まるのは選択中のタブだけです

選択中のタブだけが Tab キーの移動先になります。全部が対象だと、 タブの数だけ Tab キーを押すことになります。

並びの中は矢印キーで移ります。Home で先頭、End で末尾。 端では折り返します——端から端へ戻るのに全部通らずに済みます。

矢印キーで移動すると、その場で中身が切り替わります

activation="manual" を渡すと、押して初めて開きます。

いつ
automatic(既定)中身がその場にあるとき。開くのに待ちがない
manual中身の読み込みに時間がかかるとき。すぐ開く形だと、矢印キーで通り過ぎるだけで毎回読み込むことになる

押せないタブは飛ばされます

矢印キーの移動先にもなりません。止まれるのに開けないのは筋が通りません。

名前は利用側が渡します

id から aria-controls と aria-labelledby を作ります。 同じ画面に2つ置くときは別の名前を渡してください。

Tabs が作って配る形にはしていません。利用側が中身を別の場所から指したいときに 名前が分からなくなるためです。

選択していないタブの中身も DOM に置かれます

表示していないだけで、すべてのタブの中身が最初から DOM にあります。 ブラウザのページ内検索で見つかり、印刷にも出ます。

重いコンポーネントを選ばれるまで描きたくない場合は、 中身の側で出し分けてください。 Tabs は出し分けを持ちません。

選択中のタブは、色以外でも見分けられます

下線と文字の濃さで示します。読み上げには aria-selected で伝わります。 色が見分けられない環境でも、どれが選ばれているか分かります。

3つの状態

通常・空・エッジケースの3つは、どのコンポーネントにも必ずあります。

通常default.tsx

通常。矢印キーで移ると、移った先がすぐ開く。

空empty.tsx

空。中身が無いとき。

エッジケースedge.tsx

エッジケース。押せないタブと、押して初めて開く形。

props

Prop

Type

型と説明はコンポーネントのソースから抽出しています。既定値は出していません——cva の defaultVariants は 署名に現れないので、表に出すと「引数のデフォルトが書かれているものだけ」になり、嘘になります。

On this page