【React UI 庫比較 - 2】MUI 主題客製化 + Tailwind 協作

更新 發佈閱讀 12 分鐘

上篇介紹 MUI 基本安裝與使用方法,但我們不太可能用 MUI 完成整個網站的切版對吧?所以此篇將聚焦:

  • MUI 與 Tailwind 協作
  • 元件與主題客製化
    這篇文章會更貼近實務應用情境作介紹
raw-image

在 MUI 元件使用 Tailwind CSS v4

MUI 元件設定客製化有兩種方式

  • 透過 sx 傳入 props,<Box sx={{ width: 1024 }}>這是容器</Box>
  • 透過 Tailwind 設定,如果你是 Vite,可參考此篇官方文章。GlobalStyles styles 注入的樣式順序請按照官方文章指示,Tailwind 會使用 utilties layer 注入,如果 utilies 在 mui layer 前面會無法蓋過。
    設定完畢後,就可以在 MUI component 使用 <Box className="w-[1024px]">這是容器</Box>
// main.tsx
import { StyledEngineProvider } from '@mui/material/styles';
import GlobalStyles from '@mui/material/GlobalStyles';

ReactDOM.createRoot(document.getElementById('root')!).render(
<React.StrictMode>
<StyledEngineProvider enableCssLayer>
<GlobalStyles styles="@layer theme, base, mui, components, utilities;" />
{/* Your app */}
</StyledEngineProvider>
</React.StrictMode>,
);
raw-image

讓 Tailwind 也能使用 MUI 樣式

  1. 官方文件上的程式碼貼到你的全域 CSS 上,視每個專案結構,貼在 index.css 或創立新的 css 檔案都可以。
  2. 使用 createTheme 將 MUI 原生的主題套用進全域設定,className 也可以使用 MUI 設定了。
import './index.css'
import { StyledEngineProvider, ThemeProvider, createTheme } from '@mui/material/styles'
import GlobalStyles from '@mui/material/GlobalStyles'

// 使用預設主題並啟用 CSS 變數
const defaultTheme = createTheme({
cssVariables: true, // 關鍵設定,讓 index.css 的 MUI 變數生效
})

createRoot(document.getElementById('root')!).render(
<StrictMode>
<StyledEngineProvider enableCssLayer>
<ThemeProvider theme={defaultTheme}>
<GlobalStyles styles="@layer theme, base, mui, components, utilities;" />
<App />
</ThemeProvider>
</StyledEngineProvider>
</StrictMode>
)
raw-image

客製 MUI 主題

通常網站都會有自己的一套 Design Guideline

如果你是設計師

  • 推薦你下載 MUI 社群發表的 Figma UI Kit,幫助,在既有基礎上修改樣式,保留更多時間設計與組裝畫面。
  • 也可以使用 MUI 提供的主題編輯器預覽你的色彩設定,加速溝通。
raw-image

如果你是工程師

我們可以使用 createTheme 覆蓋或擴充 MUI 原生樣式。

  1. 建立一個 muiTheme 檔案和資料夾,如果你是用的是 TypeScript 並且想擴充色票,這個資料夾還需要多新增一個 theme.d.ts。
raw-image
  1. 如果只是要覆蓋原生色票是使用 palette,覆蓋字級則是 typography
// muiTheme.tsx
import { createTheme } from '@mui/material/styles';

// MUI 主題配置
export const muiTheme = createTheme({
cssVariables: true, // 啟用 CSS 變數
palette: {
primary: {
main: '#2e7d32', // 綠色
},
},
typography: {
fontFamily: '"Roboto", "Helvetica", "Arial", sans-serif',
h1: {
fontSize: '1rem',
fontWeight: 300,
}
}
})

export default muiTheme

將客製主題使用 ThemeProvider 注入在全域

// main.tsx
import { StyledEngineProvider, ThemeProvider } from '@mui/material/styles'
import GlobalStyles from '@mui/material/GlobalStyles';
import { muiTheme } from './muiTheme/muiTheme'

createRoot(document.getElementById('root')!).render(
<StrictMode>
<StyledEngineProvider enableCssLayer>
<ThemeProvider theme={muiTheme}>
<GlobalStyles styles="@layer theme, base, mui, components, utilities;" />
<App />
</ThemeProvider>
</StyledEngineProvider>
</StrictMode>
)
  1. 自訂色票可以分為自訂「自訂色票」和「既有色票的輔助色」兩種辦法
  • 既有色票輔助色:
    PrimarySecondary 是既有色票,原生的輔助色有 mainlightdark 等。假設我們今天想新增輔助色 extraDark
    // muiTheme.tsx const theme = createTheme({ colorSchemes: { light: { palette: { primary: { main: '#2e7d32', // 覆蓋色票 extraDark: "#541437", // 新增色票 }, }, } }, }); export default theme;
  • 自訂色票:
    新增 PrimarySecondary 以外名稱的色票,假設名稱為 background.default
// muiTheme.tsx
const theme = createTheme({
colorSchemes: {
light: {
palette: {
background: {
extraLight: "#F7F7F7",
},
},
}
},
});
export default theme;

不管是擴充輔助色或是色票,如果有設定同步給 Tailwind 使用,別忘了要回到 CSS 檔案手動擴充呦!

raw-image
  1. 直接客製主題中的元件樣式

依照文件中的示範,createTheme 中可以直接設定元件樣式。以下面設定 Button 樣式說明,我們可以看到像是&.Mui-disabled的樣式,這些樣式來源可以透過每個元件頁面,最下面的 API 文件中 CSS classes 段落找到。

const theme = createTheme({
components: {
MuiButton: {
styleOverrides: {
root: ({ theme }) => ({
'&.Mui-disabled': {
color: theme.palette.text.disabled,
},
}),
contained: ({ theme }) => ({
'&.MuiButton-containedPrimary:hover': {
backgroundColor: theme.palette.primary.dark,
},
}),
outlined: ({ theme }) => ({
'&.MuiButton-outlinedPrimary:hover': {
backgroundColor: theme.palette.primary.dark,
},
}),
},
},
},
});

擴充色票需要額外設定 TypeScript 型別

如果使用 TypeScript,我們需要用上剛才新建的 theme.d.ts 檔案定義型別來避免報錯。更多設定請參考文件

// theme.d.ts
import {} from "@mui/material";

declare module "@mui/material/styles" {
// 擴充 MUI Palette 中的輔助色
interface PaletteColor {
extraLight?: string;
extraDark?: string;
}
// 擴充 createTheme MUI Palette 中的輔助色
interface SimplePaletteColorOptions {
extraLight?: string;
extraDark?: string;
}
// 建立新 Palette
interface TypeBackground {
extraLight?: string;
}
}


相同文章發布於我的部落格




留言
avatar-img
留言分享你的想法!
avatar-img
Ann Chou的沙龍
17會員
32內容數
從藝術領域轉職到前端工程師,喜歡書寫學習歷程和技術文件,掌握經驗與隨時提取的感覺很好。
Ann Chou的沙龍的其他內容
2025/09/28
本篇文章介紹 MUI(原 Material UI)這個強大的 React UI 元件庫,涵蓋其核心元件、不同產品線、安裝與匯入元件的方式,以及如何在專案中套用樣式與主題。幫助開發者快速建立一致且具有品牌風格的介面。結論將引導讀者瞭解如何進一步自訂 MUI 的樣式主題。
Thumbnail
2025/09/28
本篇文章介紹 MUI(原 Material UI)這個強大的 React UI 元件庫,涵蓋其核心元件、不同產品線、安裝與匯入元件的方式,以及如何在專案中套用樣式與主題。幫助開發者快速建立一致且具有品牌風格的介面。結論將引導讀者瞭解如何進一步自訂 MUI 的樣式主題。
Thumbnail
2025/01/28
最近工作上可能要用 React + Tailwind 了,剛好正巧遇到 React 19 和 Tailwind 4.0 剛推出,尤其是 Tailwind 做了大改版,對我這樣剛好是這兩項技術的新手小白來說,還沒有更多文章可以參考,光是安裝也是摸索了一陣子。以下以 Vite 6 + React 18.
Thumbnail
2025/01/28
最近工作上可能要用 React + Tailwind 了,剛好正巧遇到 React 19 和 Tailwind 4.0 剛推出,尤其是 Tailwind 做了大改版,對我這樣剛好是這兩項技術的新手小白來說,還沒有更多文章可以參考,光是安裝也是摸索了一陣子。以下以 Vite 6 + React 18.
Thumbnail
2024/04/08
Swiper.js 是一個功能齊全的輪播套件,除了輪播外,也可以客製化導航按鈕和頁碼等細項。目前支持 JS、React、Vue。但是 Swiper.js Vue 版本主要由 Composition API 風格構成,此篇文章將介紹 Options API 的撰寫方式,以及如何做樣式客製化。
Thumbnail
2024/04/08
Swiper.js 是一個功能齊全的輪播套件,除了輪播外,也可以客製化導航按鈕和頁碼等細項。目前支持 JS、React、Vue。但是 Swiper.js Vue 版本主要由 Composition API 風格構成,此篇文章將介紹 Options API 的撰寫方式,以及如何做樣式客製化。
Thumbnail
看更多
你可能也想看
Thumbnail
還在煩惱平凡日常該如何增添一點小驚喜嗎?全家便利商店這次聯手超萌的馬來貘,推出黑白配色的馬來貘雪糕,不僅外觀吸睛,層次豐富的雙層口味更是讓人一口接一口!本文將帶你探索馬來貘雪糕的多種創意吃法,從簡單的豆漿燕麥碗、藍莓果昔,到大人系的奇亞籽布丁下午茶,讓可愛的馬來貘陪你度過每一餐,增添生活中的小確幸!
Thumbnail
還在煩惱平凡日常該如何增添一點小驚喜嗎?全家便利商店這次聯手超萌的馬來貘,推出黑白配色的馬來貘雪糕,不僅外觀吸睛,層次豐富的雙層口味更是讓人一口接一口!本文將帶你探索馬來貘雪糕的多種創意吃法,從簡單的豆漿燕麥碗、藍莓果昔,到大人系的奇亞籽布丁下午茶,讓可愛的馬來貘陪你度過每一餐,增添生活中的小確幸!
Thumbnail
先從react開始: 其實市面上有許多前端框架像是react,angular,vue... 至於為什麼我會選擇react…
Thumbnail
先從react開始: 其實市面上有許多前端框架像是react,angular,vue... 至於為什麼我會選擇react…
Thumbnail
Anytype主要分為四區塊:目錄欄(Widget組成)、主編輯畫面、導航選單、設定區。
Thumbnail
Anytype主要分為四區塊:目錄欄(Widget組成)、主編輯畫面、導航選單、設定區。
Thumbnail
在程式任何地方都能修改各種react組件狀態的做法分享
Thumbnail
在程式任何地方都能修改各種react組件狀態的做法分享
Thumbnail
實時繪圖(一)-安裝ComfyUI+krita心得與教學繼這一篇安裝完畢後,就是開始挑戰電商產品圖製作,意外的簡單,基本上素材找好,在調整個2分鐘,就完成了 接下來我就把我做的方法與步驟分享給大家巴 首先先找好的你的透明素材產品,那麼免費的素材網站我已經幫你找好了,可以商用,請注意一定要用去背的
Thumbnail
實時繪圖(一)-安裝ComfyUI+krita心得與教學繼這一篇安裝完畢後,就是開始挑戰電商產品圖製作,意外的簡單,基本上素材找好,在調整個2分鐘,就完成了 接下來我就把我做的方法與步驟分享給大家巴 首先先找好的你的透明素材產品,那麼免費的素材網站我已經幫你找好了,可以商用,請注意一定要用去背的
Thumbnail
React Marquee是一個輕量級的React library,可以在網頁上創建流暢的跑馬燈效果。本文提供快速教學和講解,教大家如何安裝、使用React跑馬燈library官方網站。另外,也分享了額外的資源和相關教學文章。希望透過以上講解和影片教學,能幫助大家瞭解這個library。
Thumbnail
React Marquee是一個輕量級的React library,可以在網頁上創建流暢的跑馬燈效果。本文提供快速教學和講解,教大家如何安裝、使用React跑馬燈library官方網站。另外,也分享了額外的資源和相關教學文章。希望透過以上講解和影片教學,能幫助大家瞭解這個library。
Thumbnail
這篇要搭建製作透明背景素材的工作流。
Thumbnail
這篇要搭建製作透明背景素材的工作流。
Thumbnail
這是一個介紹React Text Wrap Balancer套件的文章,主要內容包括套件的使用方式,常見的實作方式和一些注意事項。文章內容較長,內容大概是在介紹套件的使用方法、使用技巧和注意事項。
Thumbnail
這是一個介紹React Text Wrap Balancer套件的文章,主要內容包括套件的使用方式,常見的實作方式和一些注意事項。文章內容較長,內容大概是在介紹套件的使用方法、使用技巧和注意事項。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News