【React】Material UI(MUI)の「sx prop」とは?書き方や使い方を解説!

React + Material UI(MUI)で開発していると、必ず目にするのがsx prop(sxプロップ)というスタイル指定方法が頻繁に登場します。

このsx propを正しく使えるようになると、スタイル記述がシンプルで効率的になります。

この記事では、Material UI(MUI)のsxpropについて、以下の内容をサンプルコードを用いてわかりやすく解説します。

  • sx propとは
  • sx propの「書き方」と「使い方」
    • sx propとインラインスタイル(style属性)の違い
    • sx propのよく使う記述例
    • テーマとの連携方法(themeオブジェクトの活用)
    • レスポンシブ対応の書き方
    • 配列による複数スタイルの切り替え方法
    • 関数の返り値をsxに渡す
    • よくあるミスと対処法
    • TypeScriptでの型エラー対策

sx propとは

sx propは、Material UI(MUI)が提供する「スタイルを記述するための専用のプロップ(props)」です。

通常のインラインスタイル( style={{ ... }})とは違い、MUIのテーマ機能と密接に連携できます。以下に特徴を示します。

特徴説明
オブジェクト形式で記述できるsx={{ padding: 2 }}のようにCSSをオブジェクト形式で記述できる
テーマと連携できるtheme.palette.primary.mainのように、テーマの色や余白を簡単に使える
クラス不要makeStylesstyledを使わなくても、すぐにテーマに沿ったスタイルが書ける
擬似要素OK&:hoverなどの擬似クラスが使える
レスポンシブ対応xs, sm, mdなど、画面サイズに応じたスタイルも指定できる
型安全で直感的型安全で、補完が効くのでコードが書きやすい

sx propの「書き方」と「使い方」

以下のサンプルコードでは、Material UIのBoxコンポーネントに対して、sx propを使ってスタイルを指定しています。

import { Box } from '@mui/material';

function App() {
  return (
    <Box sx={{ backgroundColor: 'skyblue', padding: 2 }}>
      これはBoxの中身です
    </Box>
  );
}

export default App;

sx propを使うと、オブジェクト形式で書けるため、見た目がすっきりします。また、padding: 2theme.spacing(2)を意味し、MUIのテーマに従った余白(通常は16px)が適用されます。

sx propとインラインスタイル(style属性)の違い

Material UIでは、スタイルを指定する方法として「sx prop」と「style 属性」の2つがありますが、それぞれに特徴があります。

比較項目sx propstyle属性
書き方オブジェクト形式オブジェクト形式
CSSプロパティキャメルケースキャメルケース
theme参照✅ 可能❌ 不可
レスポンシブ対応✅ 可能❌ 不可
擬似要素対応✅ 可能❌ 不可

上記の違いが分かるサンプルコードを以下に示します。

import { Box } from '@mui/material';

function App() {
  return (
    <div style={{ display: 'flex', gap: '20px' }}>
      {/* sx prop を使用した Box コンポーネント */}
      <Box
        sx={{
          width: 150,
          height: 100,
          bgcolor: 'primary.main', // テーマの色(theme.palette.primary.main)を参照
          color: 'white',
          p: 2, // padding: theme.spacing(2)(通常は16px)として解釈される
          '&:hover': {
            bgcolor: 'primary.dark', // ホバー時のスタイルを指定できる(擬似要素対応)
          },
          fontSize: {
            // 画面サイズごとのレスポンシブ指定が可能
            xs: '0.8rem', // 画面幅が xs のとき
            sm: '1rem', // sm のとき
            md: '1.2rem', // md のとき
          },
        }}
      >
        sx prop
      </Box>

      {/* style 属性を使用した div 要素 */}
      <div
        style={{
          width: 150,
          height: 100,
          backgroundColor: '#1976d2', // テーマとは関係ない固定色
          color: 'white',
          padding: '16px', // px単位の静的指定。テーマの spacing に連動しない
          fontSize: '1rem', // 固定サイズで、画面サイズによる変化はできない
          // :hover などの擬似要素は style 属性では記述できない
        }}
      >
        style属性
      </div>
    </div>
  );
}

export default App;

sx propのよく使う記述例

sx propでは、Material UIのテーマ機能を活かしたスタイルを簡潔に記述できます。以下は、レイアウト・カラー・余白・枠線・シャドウなど、よく使われるスタイルを組み合わせた例です。

import { Box } from '@mui/material';

function App() {
  return (
    <Box
      sx={{
        width: 300,
        height: 100,
        bgcolor: 'primary.main',
        color: 'white',
        p: 2,
        border: 1,
        borderColor: 'secondary.light',
        boxShadow: 1,
        borderRadius: 2,
      }}
    >
      スタイリングされたBox
    </Box>
  );
}

export default App;

このように、複数のスタイルをsx prop内にまとめて記述できるため、クラス定義や外部CSSを使わずに柔軟なデザインを実現できます。以下は、それぞれのプロパティの意味と効果です。

プロパティ説明
p: 2padding: theme.spacing(2)に相当。通常16px(spacingは8px単位)
bgcolor: 'primary.main'テーマのprimaryカラーを背景色に適用
border: 11px solidの枠線を適用(デフォルトは黒)
borderColor: 'secondary.light'テーマのsecondary.lightを枠線の色として使用
boxShadow: 1theme.shadows[1]に対応するシャドウを適用
borderRadius: 2theme.shape.borderRadius × 2(デフォルトでは8px × 2 = 16px)

テーマとの連携方法(themeオブジェクトの活用)

Material UI(MUI)では、sx propを使って theme(テーマオブジェクト)を簡単に参照できます。これにより、アプリ全体で統一感のあるザインを維持しながらスタイルを記述できます。

オブジェクト形式でテーマを参照する

sx propにオブジェクトを渡す場合でも、文字列でテーマのキー(例:primary.main)を指定することで、テーマの色や余白を簡単に利用できます。

<Box
  sx={{
    color: 'primary.main', // theme.palette.primary.main を参照
    bgcolor: 'grey.100', // theme.palette.grey[100] を参照
    p: 2, // padding: theme.spacing(2)(通常は16px)
    borderRadius: 1, // theme.shape.borderRadius(通常4px)
    fontSize: '1rem',
    lineHeight: 1.5,
    fontFamily: 'Roboto, Helvetica, Arial, sans-serif',
  }}
>
  オブジェクト形式のBox
</Box>

このように、特別な構文なしでテーマの値を参照できるのがsx propの便利なところです。

関数形式でスタイル定義(themeを使いたいとき)

themeをより柔軟に使いたい場合、sx propに関数を渡すことでthemeオブジェクトを直接参照できます。

<Box
  sx={(theme) => ({
    color: theme.palette.primary.main,
    backgroundColor: theme.palette.grey[100],
    padding: theme.spacing(2), // spacing単位に変換(16px)
    borderRadius: theme.shape.borderRadius, // デフォルトは4px
    fontSize: theme.typography.body1.fontSize,
    lineHeight: theme.typography.body1.lineHeight,
    fontFamily: theme.typography.body1.fontFamily,
  })}
>
  関数形式(パレット・spacing)のBox
</Box>

関数形式を使うことで、数値計算や動的スタイルの定義が可能になり、theme.spacing()theme.paletteなども柔軟に扱えます。

関数形式でtypographyを一括適用する

theme.typography.body1のように、MUIに定義されたタイポグラフィスタイルをそのまま展開して使うこともできます。

<Box
  sx={(theme) => ({
    color: theme.palette.primary.main,
    backgroundColor: theme.palette.grey[100],
    padding: theme.spacing(2),
    borderRadius: theme.shape.borderRadius,
    ...theme.typography.body1,
  })}
>
  関数形式(typography適用)のBox
</Box>

...theme.typography.body1によって、fontSizelineHeightfontFamilyなどを一括で適用できます。このように、関数形式を使えばテーマ定義をそのまま再利用でき、一貫性のあるUIが簡単に実現できます。

レスポンシブ対応の書き方

Material UI(MUI)のsx propを使えば、画面サイズごとに異なるスタイルを簡単に設定できます。これは、theme.breakpointsに基づいて自動で切り替わるため、CSSのメディアクエリを書く必要がありません。

<Box
  sx={{
    fontSize: {
      xs: '0.8rem', // スマホなどの狭い画面(最小サイズ)
      sm: '1rem', // タブレット程度の画面幅
      md: '1.2rem', // ノートPCやデスクトップ
    },
  }}
>
  レスポンシブ対応のテキスト
</Box>

fontSizeの値にオブジェクトを渡すことで、画面幅に応じたスタイルを自動適用できます。fontSizeの他にも、width, padding, margin, displayなどにも同様に使えます。

配列による複数スタイルの切り替え方法

Material UI(MUI)のsx propでは、スタイルを配列形式で渡すことができます。これにより、複数のスタイルを順番に適用したり、条件によってスタイルを切り替えたりすることが簡単にできます。

<Box
  sx={[
    { color: 'red' }, // ベースのスタイル
    true && { fontWeight: 'bold' }, // 条件付きで追加されるスタイル
    (theme) => ({
      '&:hover': {
        backgroundColor: theme.palette.grey[200], // ホバー時のスタイル(関数形式)
      },
    }),
  ]}
>
  配列による複数スタイルの切り替え
</Box>

sx propに配列を渡すと、前から順にスタイルが適用されていき、後ろのスタイルほど優先されます

falseなどのfalsyな値は自動でスキップされるため、isActive && { ... }のような条件付き記述を書くことができます。

関数形式((theme) => ({ ... }))も配列の中で使えます。

関数の返り値をsxに渡す

sx propには、関数の返り値として得られたスタイルオブジェクトをそのまま渡すこともできます。これにより、スタイルのロジックを外部の関数に切り出して管理することが可能になり、スタイルの再利用性や保守性が向上します。

import { Box } from '@mui/material';

function createBoxStyle(color, paddingUnit) {
  return {
    bgcolor: color,
    p: paddingUnit,
    borderRadius: 2,
    '&:hover': {
      bgcolor: 'secondary.main',
    },
  };
}

function App() {
  return (
    <Box sx={createBoxStyle('primary.main', 2)}>
      関数で生成されたsxスタイル
    </Box>
  );
}

export default App;

createBoxStyle()は、colorpaddingを引数として受け取り、sxで使用可能なスタイルオブジェクトを返す関数です。このように関数でスタイルを返すことで、スタイル定義を共通化・パラメータ化することができます。動的な条件に基づいてスタイルを切り替える際にも便利です。

よくあるミスと対処法

sx propを使うときにありがちなミスと、その修正方法をまとめました。

間違い例修正方法
sx={{ background-color: 'red' }}backgroundColorのようにキャメルケース(小文字+大文字)で書く
sx="color: red"スタイルは文字列ではなくオブジェクト形式で書く
sx={{ padding: '16px' }}直接書くよりもp: 2のようにテーマのspacing単位で書くと統一感が出る

TypeScriptでの型エラー対策

TypeScriptでsx propに変数を渡す場合、オブジェクトの扱い方によっては型エラーになることがあります。

const style = { flexDirection: 'column' };
<Box sx={style} /> // エラーになることがある

この場合、TypeScriptがstyleの中身を具体的なCSSプロパティとして認識できないため、エラーになります。

as constを付けることで、オブジェクトの型がリテラル型(固定の値)として扱われ、MUIが正しく解釈できます。

const style = { flexDirection: 'column' } as const;
<Box sx={style} />

もっとも確実なのは、sx propにオブジェクトを直接記述する方法です。小規模なスタイルならこの方法が推奨されます。

<Box sx={{ flexDirection: 'column' }} />

本記事のまとめ

この記事では、Material UI(MUI)のsxpropについて、以下の内容を説明しました。

  • sx propとは
  • sx propの「使い方」と「書き方」
    • sx propとインラインスタイル(style属性)の違い
    • sx propのよく使う記述例
    • テーマとの連携方法(themeオブジェクトの活用)
    • レスポンシブ対応の書き方
    • 配列による複数スタイルの切り替え方法
    • 関数の返り値をsxに渡す
    • よくあるミスと対処法
    • TypeScriptでの型エラー対策

Material UI(MUI)のsx propを使うことで、シンプルかつ直感的にスタイルを記述できるようになります。テーマと連携したデザインや、レスポンシブ対応、擬似要素の指定まで、幅広い表現がこの1つのプロップで完結するのは大きな魅力です。

特に、sx={{ padding: 2 }}bgcolor: 'primary.main'のように、テーマベースで統一感のあるUIを保ちつつ開発できるのは、MUIならではの強みです。

最初は少し独特に感じるかもしれませんが、慣れてくるととても効率的です。ぜひ実際のプロジェクトでもsx propを積極的に活用してみてください!

お読み頂きありがとうございました。

公式ページ

Material UIのsx propについて、詳しく知りたい方は以下の公式ページを参考にしてください。

スポンサーリンク