【Tailwind CSS】属性セレクタやカスタム修飾子について

TailwindCSSでは`area-*`や`data-*`やopenなどの属性をもとにスタイルを付与する方法があります。

:::note
覚えておくことで複雑なスタイリングも可能になるのでドキュメントの方も一読してみてください！
:::

https://tailwindcss.com/docs/hover-focus-and-other-states#attribute-selectors

## [ARIA属性を利用する](https://tailwindcss.com/docs/hover-focus-and-other-states#aria-states)

```jsx
<div class="aria-checked:bg-sky-700">
```

デフォルトで使える修飾子
- aria-busy
- aria-checked
- aria-disabled
- aria-expanded
- aria-hidden
- aria-pressed
- aria-readonly
- aria-required
- aria-selected

`tailwind.config`を編集することで追加できます。

```jsx
module.exports = {
  theme: {
    extend: {
      aria: {
        asc: 'sort="ascending"',
        desc: 'sort="descending"',
      },
    },
  },
};
```

その場限りで使いたい場合は`[]`を利用して定義します。

```jsx
area-[sort=ascending]:****
```

擬似クラスや擬似要素と同じように親や兄弟要素を起点にしてスタイルを適用させることもできます。

```jsx:見やすいように改行しています
<th aria-sort="ascending" class="group">
  <svg
    className="
      group-aria-[sort=ascending]:rotate-0
      group-aria-[sort=descending]:rotate-180"
  >
  </svg>
</th>
```

## [データ属性を利用する](https://tailwindcss.com/docs/hover-focus-and-other-states#data-attributes)

ARIA属性とは異なり`data-*`は任意の値のみがサポートされています。

```jsx
<div data-ui="checked" className="data-[ui=checked]:p-8">
```

`tailwind.config`を編集しショートカットを設定できます。

```jsx
module.exports = {
  theme: {
    data: {
      checked: 'ui~="checked"',
    },
  },
};
```

```diff_jsx:data-ui="checked" は省略
- <div className="data-[ui=checked]:p-8">
+ <div className="data-checked:p-8">
```

## [RTLのサポート](https://tailwindcss.com/docs/hover-focus-and-other-states#rtl-support)
テキストの方向を右からと左からで指定できます。

```jsx
<div class="ltr:ml-3 rtl:mr-3">
```

注意点として方向を明示的に指定しない限りスタイルが有効になりません。
常にデフォルトの方向を指定する場合はHTMLタグに`dir`属性で指定できます。

```jsx:左から右がデフォルトの場合
<html dir="ltr">
```

上記の設定は単一方向のみ対応するサイトには必要ありません。



## [要素が開いている状態`open`に基づくスタイル適用](https://tailwindcss.com/docs/hover-focus-and-other-states#open-closed-state)

`<details>`や`<dialog>`の要素が開いている状態に対してスタイルを適用させます。

```jsx
<details className="open:bg-white">
```

## [任意のバリアントの利用](https://tailwindcss.com/docs/hover-focus-and-other-states#custom-modifiers)

任意のバリアントとは、角括弧で囲まれたセレクターを表す書式文字列のこと。
下記の記述は3番目の子である場合にスタイルを適用させます。

```jsx
<li className="[&:nth-child(3)]:underline">{item}</li>
```

`&`は変更されるセレクターを表します。
`:hover`と組み合わせることも可能です！

```jsx
<li className="lg:[&:nth-child(3)]:hover:underline">{item}</li>
```

セレクターにスペースが必要な場合はアンダースコアを利用します。
下記は、クラスを付与した要素内にある`p`タグに対してスタイルを適用させます。

```jsx
<div className="[&_p]:mt-4">
```

`@media`のような＠ルールも下記のように利用できます！

```jsx
<div className="[@supports(display:grid)]:grid">
```

@ルールの後`{}`で通常のセレクターを組み合わせることも可能。

```jsx
<div class="[@media(any-hover:hover){&:hover}]:opacity-100">
```

任意の修飾子を複数回利用するTailwindCSSのAPIを利用してプラグインを作ることもできます。

```jsx
// tailwind.config.jsに記述します
let plugin = require('tailwindcss/plugin')

module.exports = {
  plugins: [
    plugin(function ({ addVariant }) {
      addVariant('third', '&:nth-child(3)')
    })
  ]
}

// コンポーネントでの呼び出し
<div className="third:bg-blue-600">
```

## [独自のクラスを使う](https://tailwindcss.com/docs/hover-focus-and-other-states#using-with-your-own-classes)

独自でクラスを作ることも可能です。

```css
@layer utilities {
  .content-auto {
    content-visibility: auto;
  }
}
```

```html
<div class="content-auto">
```

## [スタックされた修飾子の順序](https://tailwindcss.com/docs/hover-focus-and-other-states#ordering-stacked-modifiers)

使用する順序によって実際に意味のある異なるCSSが生成されることに注意してください。

```css
/* dark:group-hover:opacity-100 */
.dark .group:hover .dark\:group-hover\:opacity-100 {
  opacity: 1;
}

/* group-hover:dark:opacity-100 */
.group:hover .dark .group-hover\:dark\:opacity-100 {
  opacity: 1;
}
```