React + Material UI(MUI)で開発していると、必ず目にするのがsx
prop(sx
プロップ)というスタイル指定方法が頻繁に登場します。
このsx
propを正しく使えるようになると、スタイル記述がシンプルで効率的になります。
この記事では、Material UI(MUI)のsx
propについて、以下の内容をサンプルコードを用いてわかりやすく解説します。
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 のように、テーマの色や余白を簡単に使える |
クラス不要 | makeStyles やstyled を使わなくても、すぐにテーマに沿ったスタイルが書ける |
擬似要素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: 2
はtheme.spacing(2)
を意味し、MUIのテーマに従った余白(通常は16px)が適用されます。
sx propとインラインスタイル(style属性)の違い
Material UIでは、スタイルを指定する方法として「sx
prop」と「style
属性」の2つがありますが、それぞれに特徴があります。
比較項目 | sx prop | style属性 |
---|---|---|
書き方 | オブジェクト形式 | オブジェクト形式 |
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: 2 | padding: theme.spacing(2) に相当。通常16px(spacingは8px単位) |
bgcolor: 'primary.main' | テーマのprimary カラーを背景色に適用 |
border: 1 | 1px solid の枠線を適用(デフォルトは黒) |
borderColor: 'secondary.light' | テーマのsecondary.light を枠線の色として使用 |
boxShadow: 1 | theme.shadows[1] に対応するシャドウを適用 |
borderRadius: 2 | theme.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
によって、fontSize
・lineHeight
・fontFamily
などを一括で適用できます。このように、関数形式を使えばテーマ定義をそのまま再利用でき、一貫性のある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()
は、color
やpadding
を引数として受け取り、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)のsx
propについて、以下の内容を説明しました。
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について、詳しく知りたい方は以下の公式ページを参考にしてください。