セレクト
ネイティブの select 要素を軽量にラップし、面倒なアクセシビリティの問題を処理し、ホバーやフォーカスなどの状態に関するより意見の強い状態を提供します。
まず、npm を使用して Headless UI をインストールします。
npm install @headlessui/react
セレクトコントロールは、Select
コンポーネントを使用して構築されます。
import { Select } from '@headlessui/react'
function Example() {
return (
<Select name="status" aria-label="Project status">
<option value="active">Active</option>
<option value="paused">Paused</option>
<option value="delayed">Delayed</option>
<option value="canceled">Canceled</option>
</Select>
)
}
通常のネイティブのselect
要素に渡すのと同じように、Select
に任意のプロップスを渡すことができます。
Headless UIは、セレクトがフォーカスされているかどうか、ポップオーバーが開いているか閉じているか、キーボードで現在フォーカスされているメニュー内の項目など、各コンポーネントに関する多くの状態を追跡します。
ただし、コンポーネントはヘッドレスで、箱から出して完全にスタイルが適用されていないため、各状態に必要なスタイルを自分で提供するまで、UIでこの情報を確認することはできません。
Headless UIコンポーネントのさまざまな状態をスタイルする最も簡単な方法は、各コンポーネントが公開するdata-*
属性を使用することです。
たとえば、Select
コンポーネントは、セレクトがキーボードで現在フォーカスされているかどうかを示すdata-focus
属性と、セレクトが現在マウスでホバーされているかどうかを示すdata-hover
属性を公開します。
<!-- Rendered `Select` -->
<select name="status" data-focus data-hover>
<option value="active">Active</option>
<option value="paused">Paused</option>
<option value="delayed">Delayed</option>
<option value="canceled">Canceled</option>
</select>
CSS属性セレクターを使用して、これらのデータ属性の存在に基づいて条件付きでスタイルを適用します。Tailwind CSSを使用している場合は、データ属性修飾子を使用すると簡単になります。
import { Select } from '@headlessui/react'
function Example() {
return (
<Select name="status" className="border data-[hover]:shadow data-[focus]:bg-blue-100" aria-label="Project status"> <option value="active">Active</option>
<option value="paused">Paused</option>
<option value="delayed">Delayed</option>
<option value="canceled">Canceled</option>
</Select>
)
}
利用可能なすべてのデータ属性のリストについては、コンポーネントAPIを参照してください。
各コンポーネントは、レンダープロップスを介して現在の状態に関する情報も公開します。これを使用して、異なるスタイルを条件付きで適用したり、異なるコンテンツをレンダリングしたりできます。
たとえば、Select
コンポーネントは、セレクトがキーボードで現在フォーカスされているかどうかを示すfocus
状態と、セレクトが現在マウスでホバーされているかどうかを示すhover
状態を公開します。
import { Select } from '@headlessui/react'
import clsx from 'clsx'
import { Fragment } from 'react'
function Example() {
return (
<Select name="status" as={Fragment}>
{({ focus, hover }) => ( <select className={clsx('border', focus && 'bg-blue-100', hover && 'shadow')} aria-label="Project status"> <option value="active">Active</option>
<option value="paused">Paused</option>
<option value="delayed">Delayed</option>
<option value="canceled">Canceled</option>
</select>
)} </Select>
)
}
利用可能なすべてのレンダープロップスのリストについては、コンポーネントAPIを参照してください。
Label
とSelect
をField
コンポーネントでラップして、生成されたIDを使用して自動的に関連付けます。
import { Field, Label, Select } from '@headlessui/react'
function Example() {
return (
<Field> <Label>Project status</Label> <Select name="status">
<option value="active">Active</option>
<option value="paused">Paused</option>
<option value="delayed">Delayed</option>
<option value="canceled">Canceled</option>
</Select>
</Field> )
}
Field
内でDescription
コンポーネントを使用して、aria-describedby
属性を使用してSelect
に自動的に関連付けます。
import { Description, Field, Label, Select } from '@headlessui/react'
function Example() {
return (
<Field> <Label>Project status</Label>
<Description>This will be visible to clients on the project.</Description> <Select name="status">
<option value="active">Active</option>
<option value="paused">Paused</option>
<option value="delayed">Delayed</option>
<option value="canceled">Canceled</option>
</Select>
</Field> )
}
Field
コンポーネントにdisabled
プロップを追加して、Select
とその関連付けられたLabel
およびDescription
を無効にします。
import { Description, Field, Label, Select } from '@headlessui/react'
function Example() {
return (
<Field disabled> <Label className="data-[disabled]:opacity-50">Project status</Label> <Description className="data-[disabled]:opacity-50">This will be visible to clients on the project.</Description> <Select name="status" className="data-[disabled]:bg-gray-100"> <option value="active">Active</option>
<option value="paused">Paused</option>
<option value="delayed">Delayed</option>
<option value="canceled">Canceled</option>
</Select>
</Field>
)
}
Select
自体に disabled プロップを直接追加することで、Field
の外でセレクトを無効にすることもできます。
ネイティブのselect
要素を薄くラップします。
プロップ | デフォルト | 説明 |
as | select | 文字列 | コンポーネント がレンダリングする要素またはコンポーネント。selectとして。 |
invalid | false | ブール値 が有効でないかどうか。select無効です。 |
disabled | false | ブール値 が有効でないかどうか。selectは無効になっています. |
autoFocus | false | ブール値 が有効でないかどうか。select最初にレンダリングされたときにフォーカスを受け取る必要があります。 |
データ属性 | レンダープロップ | 説明 |
data-invalid | invalid |
が有効でないかどうか。select無効です。 |
data-disabled | disabled |
が有効でないかどうか。selectは無効になっています。 |
data-focus | focus |
が有効でないかどうか。selectがフォーカスされています。 |
data-hover | hover |
が有効でないかどうか。selectがホバーされています。 |
data-active | active |
が有効でないかどうか。selectがアクティブまたは押された状態です。 |
data-autofocus | autofocus |
|
Label
、Description
、およびフォームコントロールをまとめてグループ化します。
プロップ | デフォルト | 説明 |
as | div | 文字列 | コンポーネント がレンダリングする要素またはコンポーネント。fieldとして。 |
disabled | false | ブール値 フィールドが無効になっているかどうか。 |
データ属性 | レンダープロップ | 説明 |
data-disabled | disabled |
フィールドが無効になっているかどうか。 |
Label
コンポーネントはフォームコントロールにラベルを付けます。
プロップ | デフォルト | 説明 |
as | label | 文字列 | コンポーネント がレンダリングする要素またはコンポーネント。labelとして。 |
passive | false | ブール値 true の場合、ラベルをクリックしても、関連付けられたフォームコントロールにフォーカスは設定されません。 |
データ属性 | レンダープロップ | 説明 |
data-disabled | disabled |
親の |
Description
コンポーネントはフォームコントロールを説明します。
プロップ | デフォルト | 説明 |
as | p | 文字列 | コンポーネント がレンダリングする要素またはコンポーネント。descriptionとして。 |
データ属性 | レンダープロップ | 説明 |
data-disabled | disabled |
親の |
事前設計されたTailwind CSSセレクトメニューの例に興味がある場合は、弊社が作成した美しくデザインされた、専門的に作られたコンポーネントのコレクションであるTailwind UIを確認してください。
これは、このようなオープンソースプロジェクトでの私たちの活動を支援する素晴らしい方法であり、それらを改善し、適切に保守し続けることを可能にします。