MUI(Material-UI)v5のスタイリング

UIのスタイリングにはいくつかの方法があります。

  • 1回限りのカスタマイズ(sx props、クラス)
  • 再利用コンポーネント
  • グローバルtheme
  • グローバルCSS

1回限りのカスタマイズ

sx props

sx propsは、単一のUIに対してスタイルを変更する場合に使用します。
全てのUIで使用できます。

<Slider
  defaultValue={30}
  sx={{
    width: 300,
    color: 'success.main',
  }}
/>

ネストされたUIのスタイル変更
UIの特定部分のスタイルを変更するには、Material UIに既に付属しているクラス名をsx propsを使用して、変更します。

たとえば、Sliderのつまみを円から四角に変更する場合。
まず、ブラウザの開発ツール(F12)を使用して、スタイル変更するクラス名を特定します。
クラス名は、以下のように決まったパターンになっています。
[ハッシュ]-Mui[コンポーネント名]-[スロット名]

以下のように、スタイルは.css-ae2u5c-MuiSlider-thumbで適用されていますが、実際には.MuiSlider-thumbのみをターゲットにする必要があります。
ここで、Sliderはコンポーネントで、thumbはスロットです。
このクラス名を使用して、sx prop(&.MuiSlider-thumb)内にCSSセレクターを記述します。

<Slider
  defaultValue={30}
  sx={{
    width: 300,
    color: 'success.main',
    '& .MuiSlider-thumb': {
      borderRadius: '1px',
    },
  }}
/>

Theming(テーマ)

MUIのUIはテーマでカスタマイズし、コンポーネントの色、表面の暗さ、影のレベル、不透明度などを指定できます。
テーマを使用すると、アプリに一貫性を保つことが出来ます。
アプリ間の一貫性を高めるために、ライトとダークのテーマタイプから選択できます。
※デフォルトではライトテーマタイプ

Theme provider

元々、MUIコンポーネントには既定のテーマが付属しています。
このテーマをカスタマイズする場合、ThemeProviderコンポーネントを使用する必要があります。
Theme providerはReactのコンテキスト機能に依存して、テーマをコンポーネントに渡します。そのため、Theme providerを使用する場所はコンポーネントの親である必要があります。

Theme configuration variables

変更できるテーマの内容として、テーマ構成変数があります。
テーマ変数下記になります。

  • .palette
  • .typography
  • .spacing
  • .breakpoints
  • .zIndex
  • .transitions
  • .components
Cutom variables

MUI Systemまたは、その他のスタイリングソリューションでMUIのテーマを使用する場合、テーマに変数を追加するとどこでも使用できます。

const theme = createTheme({
  status: {
    danger: orange[500],
  },
});

注意
varsは、CSS変数のサポートに使用されるプライベートフィールドです。使用しようとすると、エラーが出なくなります。

createTheme({
  vars: { ... },
})

TypeScriptを使用している場合、上記の値を受け入れるには、テーマのモジュール拡張も使用する必要があります。

declare module '@mui/material/styles' {
  interface Theme {
    status: {
      danger: string;
    };
  }
  // allow configuration using `createTheme`
  interface ThemeOptions {
    status?: {
      danger?: string;
    };
  }
}
Nesting the theme

複数のテーマをネスト(入れ子)することができます。

<ThemeProvider theme={outerTheme}>
  <Checkbox defaultChecked />
  <ThemeProvider theme={innerTheme}>
    <Checkbox defaultChecked />
  </ThemeProvider>
</ThemeProvider>

タイトルとURLをコピーしました