タブ
堅牢なフォーカス管理とキーボードナビゲーションサポートにより、アクセシビリティが高く、完全にカスタマイズ可能なタブインターフェースを簡単に作成できます。
開始するには、npm を介して Headless UI をインストールします。
npm install @headlessui/vue
タブは、TabGroup
、TabList
、Tab
、TabPanels
、およびTabPanel
コンポーネントを使用して構築されています。デフォルトでは最初のタブが選択され、任意のタブをクリックするか、キーボードで選択すると、対応するパネルがアクティブになります。
<template> <TabGroup> <TabList> <Tab>Tab 1</Tab> <Tab>Tab 2</Tab> <Tab>Tab 3</Tab> </TabList> <TabPanels> <TabPanel>Content 1</TabPanel> <TabPanel>Content 2</TabPanel> <TabPanel>Content 3</TabPanel> </TabPanels> </TabGroup> </template> <script setup> import { TabGroup, TabList, Tab, TabPanels, TabPanel } from '@headlessui/vue' </script>
Headless UI は、現在チェックされているタブオプション、ポッパーが開いているか閉じているか、メニューのどのアイテムが現在キーボードでアクティブになっているかなど、各コンポーネントに関する多くの状態をトラッキングします。
しかし、コンポーネントはヘッドレスであり、すぐに使える状態では完全にスタイルが適用されていないため、各状態に必要なスタイルを自分で提供するまで、UIでこの情報を見ることはできません。
各コンポーネントは、スロットプロップを介して現在の状態に関する情報を公開しており、これを使用して条件付きで異なるスタイルを適用したり、異なるコンテンツをレンダリングしたりできます。
たとえば、Tab
コンポーネントはselected
状態を公開しており、タブが現在選択されているかどうかを示します。
<template> <TabGroup> <TabList> <!-- Use the `selected` state to conditionally style the selected tab. -->
<Tab as="template" v-slot="{ selected }"><button:class="{ 'bg-blue-500 text-white': selected, 'bg-white text-black': !selected }"> Tab 1 </button> </Tab> <!-- ... --> </TabList> <TabPanels> <TabPanel>Content 1</TabPanel> <!-- ... --> </TabPanels> </TabGroup> </template> <script setup> import { TabGroup, TabList, Tab, TabPanels, TabPanel } from '@headlessui/vue' </script>
各コンポーネントのスロットプロップAPIの完全なリストについては、コンポーネントAPIドキュメントを参照してください。
各コンポーネントは、条件付きで異なるスタイルを適用するために使用できるdata-headlessui-state
属性を介して、現在の状態に関する情報を公開します。
スロットプロップAPIのいずれかの状態がtrue
の場合、それらはスペース区切りの文字列としてこの属性にリストされます。そのため、[attr~=value]
形式のCSS属性セレクターを使用してターゲットにすることができます。
たとえば、2番目のタブがselected
の場合、いくつかの子Tab
コンポーネントを含むTabGroup
コンポーネントは次のようにレンダリングされます。
<!-- Rendered `TabGroup` --> <div> <button data-headlessui-state="">Tab 1</button> <button data-headlessui-state="selected">Tab 2</button> <button data-headlessui-state="">Tab 3</button> </div> <div> <div data-headlessui-state="">Content 1</div> <div data-headlessui-state="selected">Content 2</div> <div data-headlessui-state="">Content 3</div> </div>
Tailwind CSSを使用している場合は、@headlessui/tailwindcssプラグインを使用して、ui-open:*
などの修飾子でこの属性をターゲットにすることができます。
<template> <TabGroup> <TabList> <Tab
class="ui-selected:bg-blue-500 ui-selected:text-white ui-not-selected:bg-white ui-not-selected:text-black"> Tab 1 </Tab> <!-- ... --> </TabList> <TabPanels> <TabPanel>Content 1</TabPanel> <!-- ... --> </TabPanels> </TabGroup> </template> <script setup> import { TabGroup, TabList, Tab, TabPanels, TabPanel } from '@headlessui/vue' </script>
タブを無効にするには、Tab
コンポーネントでdisabled
プロップを使用します。無効なタブはマウスで選択できず、キーボードを使用してタブリストをナビゲートするときにもスキップされます。
<template> <TabGroup> <TabList> <Tab>Tab 1</Tab>
<Tab disabled>Tab 2</Tab><Tab>Tab 3</Tab> </TabList> <TabPanels> <TabPanel>Content 1</TabPanel> <TabPanel>Content 2</TabPanel> <TabPanel>Content 3</TabPanel> </TabPanels> </TabGroup> </template> <script setup> import { TabGroup, TabList, Tab, TabPanels, TabPanel } from '@headlessui/vue' </script>
デフォルトでは、ユーザーが矢印キーを使用してタブを移動すると、タブが自動的に選択されます。
ユーザーがEnter
キーまたはSpace
キーを押すまで現在のタブを変更しないようにするには、TabGroup
コンポーネントでmanual
プロップを使用します。これは、タブの選択が高価な操作を実行し、不要に実行したくない場合に役立ちます。
<template>
<TabGroup manual><TabList> <Tab>Tab 1</Tab> <Tab>Tab 2</Tab> <Tab>Tab 3</Tab> </TabList> <TabPanels> <TabPanel>Content 1</TabPanel> <TabPanel>Content 2</TabPanel> <TabPanel>Content 3</TabPanel> </TabPanels> </TabGroup> </template> <script setup> import { TabGroup, TabList, Tab, TabPanels, TabPanel } from '@headlessui/vue' </script>
manual
プロップはマウス操作には影響しません。タブはクリックされるとすぐに選択されます。
TabList
を垂直に表示するようにスタイル設定した場合は、vertical
プロップを使用して、左右の矢印キーではなく上下の矢印キーでナビゲートし、補助技術のためにaria-orientation
属性を更新します。
<template>
<TabGroup vertical><TabList> <Tab>Tab 1</Tab> <Tab>Tab 2</Tab> <Tab>Tab 3</Tab> </TabList> <TabPanels> <TabPanel>Content 1</TabPanel> <TabPanel>Content 2</TabPanel> <TabPanel>Content 3</TabPanel> </TabPanels> </TabGroup> </template> <script setup> import { TabGroup, TabList, Tab, TabPanels, TabPanel } from '@headlessui/vue' </script>
デフォルトで選択されているタブを変更するには、TabGroup
コンポーネントで:defaultIndex="number"
プロップを使用します。
<template>
<TabGroup :defaultIndex="1"><TabList> <Tab>Tab 1</Tab><!-- Selects this tab by default --><Tab>Tab 2</Tab><Tab>Tab 3</Tab> </TabList> <TabPanels> <TabPanel>Content 1</TabPanel><!-- Displays this tab by default --><TabPanel>Content 2</TabPanel><TabPanel>Content 3</TabPanel> </TabPanels> </TabGroup> </template> <script setup> import { TabGroup, TabList, Tab, TabPanels, TabPanel } from '@headlessui/vue' </script>
範囲外のインデックスを指定した場合、最初のレンダリング時に最後の無効でないタブが選択されます。(たとえば、上記の例では、<TabGroup :defaultIndex="5"
は3番目のパネルを選択してレンダリングします。)
選択されたタブが変更されるたびに関数を実行するには、TabGroup
コンポーネントで@change
イベントを使用します。
<template>
<TabGroup @change="changeTab"><TabList> <Tab>Tab 1</Tab> <Tab>Tab 2</Tab> <Tab>Tab 3</Tab> </TabList> <TabPanels> <TabPanel>Content 1</TabPanel> <TabPanel>Content 2</TabPanel> <TabPanel>Content 3</TabPanel> </TabPanels> </TabGroup> </template> <script setup> import { TabGroup, TabList, Tab, TabPanels, TabPanel } from '@headlessui/vue'function changeTab(index) {console.log('Changed active tab to:', index)}</script>
タブコンポーネントは、制御されたコンポーネントとしても使用できます。これを行うには、selectedIndex
を提供し、自分で状態を管理します。
<template>
<TabGroup :selectedIndex="selectedTab" @change="changeTab"><TabList> <Tab>Tab 1</Tab> <Tab>Tab 2</Tab> <Tab>Tab 3</Tab> </TabList> <TabPanels> <TabPanel>Content 1</TabPanel> <TabPanel>Content 2</TabPanel> <TabPanel>Content 3</TabPanel> </TabPanels> </TabGroup> </template> <script setup> import { ref } from 'vue' import { TabGroup, TabList, Tab, TabPanels, TabPanel } from '@headlessui/vue'const selectedTab = ref(0)function changeTab(index) {selectedTab.value = index}</script>
Tab
をクリックすると、そのタブが選択され、対応するTabPanel
が表示されます。
Tab
コンポーネントにフォーカスがある場合、すべての操作が適用されます。
コマンド | 説明 |
左矢印と右矢印 | 無効でない前の/次のタブを選択します。 |
上矢印と下矢印 | 無効でない前の/次のタブを選択します。 |
HomeまたはPageUp | 無効でない最初のタブを選択します。 |
EndまたはPageDown | 無効でない最後のタブを選択します。 |
EnterまたはSpace | 選択したタブをアクティブにします。 |
すべての関連するARIA属性が自動的に管理されます。
Tabs
に実装されているすべてのアクセシビリティ機能の完全なリファレンスについては、タブに関するARIA仕様を参照してください。
メインのTabGroupコンポーネント。
プロップ | デフォルト | 説明 |
as | テンプレート | 文字列 | コンポーネント
|
defaultIndex | 0 | 数値 デフォルトで選択されているインデックス |
selectedIndex | — | 数値 タブコンポーネントを制御されたコンポーネントとして使用する場合の選択インデックス。 |
vertical | false | ブール値 trueの場合、 |
manual | false | ブール値 trueの場合、ユーザーはキーボードを使用してパネルを表示するには、最初に矢印キーを使用してパネルに移動し、次に |
スロットプロップ | 説明 |
selectedIndex |
現在選択されているインデックス。 |
イベント | 説明 |
change | アクティブなタブが変更されるたびに呼び出される関数。 |
プロップ | デフォルト | 説明 |
as | div | 文字列 | コンポーネント
|
スロットプロップ | 説明 |
selectedIndex |
現在選択されているインデックス。 |
プロップ | デフォルト | 説明 |
as | button | 文字列 | コンポーネント
|
disabled | false | ブール値
|
スロットプロップ | 説明 |
selected |
|
プロップ | デフォルト | 説明 |
as | div | 文字列 | コンポーネント
|
スロットプロップ | 説明 |
selectedIndex |
現在選択されているインデックス。 |
プロップ | デフォルト | 説明 |
as | div | 文字列 | コンポーネント
|
静的 | false | ブール値 要素が選択インデックスを無視するかどうか。 _注記: |
アンマウント | true | ブール値 選択インデックスに基づいて、要素をアンマウントするか、非表示にするか。 _注記: |
スロットプロップ | 説明 |
selected |
|