強力なUIコンポーネントライブラリ「MUI(Material-UI)」について《テーマ・スタイリング編》

MUIのテーマカスタマイズ

MUI(Material-UI)はデフォルトのテーマをベースに、簡単にテーマをカスタマイズできる柔軟なシステムを提供しています。これにより、アプリケーションのデザインをブランドや要件に合わせて調整可能です。

ここでは、デフォルトテーマの理解から、カスタムテーマの作成、色やフォントのカスタマイズ、ダークモードの実装方法までを解説します。

デフォルトテーマの理解

MUIでは、アプリケーション全体にわたるスタイル設定が可能なテーマが用意されています。このテーマは、色、タイポグラフィ、スペーシング、ブレークポイントなどの設定を含んでいます。MUIのデフォルトテーマにアクセスするには、createTheme関数を使用します。

import { createTheme } from '@mui/material/styles';

const defaultTheme = createTheme();
console.log(defaultTheme);

defaultThemeオブジェクトには、色、フォントサイズ、ブレークポイントなどの設定が含まれています。デフォルトテーマは基本的な設定としてそのまま利用できますが、これをカスタマイズすることでアプリケーションに特化したデザインを適用できます。

カスタムテーマの作成

カスタムテーマを作成するためには、createTheme関数を使用して、デフォルトテーマを上書きします。その後、ThemeProviderでアプリケーション全体にカスタムテーマを適用します。

import { createTheme, ThemeProvider } from '@mui/material/styles';
import { CssBaseline, Button } from '@mui/material';
import React from 'react';

const customTheme = createTheme({
  palette: {
    primary: {
      main: '#1976d2',
    },
    secondary: {
      main: '#ff4081',
    },
  },
  typography: {
    fontFamily: 'Arial',
  },
});

function App() {
  return (
    <ThemeProvider theme={customTheme}>
      <CssBaseline />
      <Button variant="contained" color="primary">
        カスタムテーマボタン
      </Button>
    </ThemeProvider>
  );
}

export default App;

この例では、paletteオプションを使って、テーマの主要な色をカスタマイズし、typographyオプションでフォントを変更しています。ThemeProvidercustomThemeを渡すことで、アプリ全体にカスタムテーマが適用されます。

色やフォントのカスタマイズ

MUIでは、色やフォントのカスタマイズが非常に柔軟です。色のカスタマイズは、paletteオブジェクト内で指定します。主な設定は以下のとおりです。

  • primary: 主要な色
  • secondary: 補助的な色
  • error: エラー表示用の色
  • background: 背景色
const customTheme = createTheme({
  palette: {
    primary: {
      main: '#4caf50',
    },
    secondary: {
      main: '#ff5722',
    },
    background: {
      default: '#f5f5f5',
    },
  },
  typography: {
    fontFamily: 'Roboto, Arial',
    fontSize: 14,
  },
});

また、フォントのサイズや行の高さ、文字の太さもtypographyで細かく指定できます。

ダークモードの実装

MUIでは、ダークモードを簡単に実装できます。palette.mode'dark'を指定することで、ダークモードのカスタムテーマを作成できます。

const darkTheme = createTheme({
  palette: {
    mode: 'dark',
  },
});

function App() {
  return (
    <ThemeProvider theme={darkTheme}>
      <CssBaseline />
      <Button variant="contained" color="primary">
        ダークモードボタン
      </Button>
    </ThemeProvider>
  );
}

この設定により、MUIの全てのコンポーネントがダークモード用にスタイル調整されます。CssBaselineコンポーネントを使用することで、全体のスタイルがリセットされ、ダークモードの外観が整います。

スタイリングとカスタムCSS

MUIでは、さまざまな方法でコンポーネントのスタイリングが可能です。sxプロップ、makeStylesstyled APIなどを使用して、柔軟にカスタムスタイルを適用できます。ここでは、それぞれのスタイル適用方法について詳しく説明します。

MUIのsxプロップの使用

sxプロップは、MUIで簡単にインラインスタイルを適用するための強力なツールです。シンプルかつ直感的にスタイルを指定できるため、特にレスポンシブデザインやテーマに依存したスタイリングに適しています。

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

function StyledBox() {
  return (
    <Box
      sx={{
        bgcolor: 'primary.main',
        color: 'white',
        padding: 2,
        borderRadius: 1,
      }}
    >
      スタイルが適用されたBox
    </Box>
  );
}

sxプロップは、MUIのテーマに依存しており、theme内のプロパティを簡単に参照できるのが特徴です。たとえば、上記の例では、primary.mainとしてテーマのメインカラーが指定されています。

makeStylesの使用

makeStylesは、CSS-in-JSのアプローチでスタイルを定義するためのフックです。テーマにアクセスしやすく、カスタマイズが柔軟に行えます。

import { makeStyles } from '@mui/styles';
import { Button } from '@mui/material';

const useStyles = makeStyles((theme) => ({
  customButton: {
    backgroundColor: theme.palette.primary.main,
    color: 'white',
    '&:hover': {
      backgroundColor: theme.palette.primary.dark,
    },
  },
}));

function StyledButton() {
  const classes = useStyles();

  return <Button className={classes.customButton}>カスタムボタン</Button>;
}

この例では、makeStylesで作成したスタイルをButtonコンポーネントに適用しています。themeオブジェクトを使用することで、テーマに基づいたカスタムスタイルが簡単に指定できます。

styled APIの使用

styled APIを使うと、コンポーネント自体に直接スタイルを付与することができます。styledはよりコンポーネント志向で、スタイルをコンポーネントにネストさせたい場合に便利です。

import { styled } from '@mui/material/styles';
import { Button } from '@mui/material';

const CustomButton = styled(Button)(({ theme }) => ({
  backgroundColor: theme.palette.secondary.main,
  color: theme.palette.common.white,
  padding: theme.spacing(2),
  '&:hover': {
    backgroundColor: theme.palette.secondary.dark,
  },
}));

function App() {
  return <CustomButton>スタイル付きボタン</CustomButton>;
}

styled APIでは、スタイルのオブジェクトをコンポーネントに直接渡し、そのコンポーネントにネストされたスタイルを適用できます。

MUIコンポーネントにカスタムクラスを追加する方法

MUIでは、標準的なCSSクラスを使ってカスタムスタイルを追加することも可能です。classNameプロップを使用して、コンポーネントにカスタムCSSクラスを適用します。

import './CustomStyles.css';
import { Button } from '@mui/material';

function CustomClassButton() {
  return <Button className="custom-button">カスタムクラスボタン</Button>;
}

CustomStyles.css内にクラスを定義し、それをclassNameプロップで適用するだけで、従来のCSSスタイルも利用可能です。

.custom-button {
  background-color: #ff5722;
  color: white;
  padding: 10px;
  border-radius: 5px;
}

このようにして、従来のCSSアプローチとMUIの強力なスタイル管理システムを組み合わせることが可能です。

関連記事

【React】React イチから学習《発展編》
# データフェッチングとパフォーマンス最適化 ## useSWRフック: データのキャッシングと再検証の最適化 `useSWR`は、Next.jsチームが開発したデータ取得ライブラリで、キャッシュ戦略とリアルタイムデータ更新のバランスを取り [...]
2024年10月21日 17:02
【React】React イチから学習《基礎編》
# Reactの基本 ## Reactとは? Reactは、Facebookによって2013年にリリースされたフロントエンドライブラリで、主にユーザーインターフェース (UI) の構築に使われます。Reactの特徴は、「コンポーネント指向の [...]
2024年10月21日 16:43
強力なUIコンポーネントライブラリ「MUI(Material-UI)」について《トラブルシューティング編》
# よくある質問とトラブルシューティング MUI(Material-UI)を使用していると、初心者でも経験者でも共通して直面しやすいエラーや問題がいくつか存在します。この章では、よく発生するエラーとその解決方法、ドキュメントでは見つけにくい設定の [...]
2024年10月15日 13:41
強力なUIコンポーネントライブラリ「MUI(Material-UI)」について《コンポーネント編》
# 基本的なコンポーネントの使用方法 MUIは、豊富なUIコンポーネントを提供しており、それを使うことでReactアプリケーションの開発を迅速に進められます。 ここでは、MUIでよく使用される基本的なコンポーネントであるボタン、テキストフィ [...]
2024年10月15日 10:32
強力なUIコンポーネントライブラリ「MUI(Material-UI)」について《概要編》
# はじめに ウェブアプリケーションの開発において、デザインと使いやすさを両立することは非常に重要です。MUI(Material-UI)は、Reactと組み合わせて簡単に洗練されたユーザーインターフェースを構築できる強力なUIコンポーネントライブ [...]
2024年10月15日 10:10
【React】React-ToastifyのカラーテーマとPCの外観モードを連動させる方法【TypeScript】
# はじめに Webアプリでユーザー情報の変更などを行った際、処理が正常に完了したことをユーザーに伝えるために、画面の端に一時的にメッセージを表示する機能のことを「トースト」といいます。 >トーストとは、主にデスクトップアプリケーションの機 [...]
2022年7月31日 21:24
RailsアプリにおけるReactの使い方や注意点など
# はじめに [こちらのページ](https://qiita.com/TsutomuNakamura/items/72d8cf9f07a5a30be048)でReactの基本について勉強しました。 Railsアプリの中でReactを利用するとい [...]
2019年12月13日 12:37
【Rails】Railsアプリにreact-railsを追加する手順
# はじめに JavaScriptフレームワークといえば長らくjQuery一強でした。しかし、ここ数年はAngularJSやReact、Vue.jsといった新しいフレームワークがどんどんと登場しています。過去5年間の検索回数の推移を見てみると、2 [...]
2019年12月11日 15:21