【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
Ann Chou的沙龍
19會員
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
在 vocus 與你一起探索內容、發掘靈感的路上,我們又將啟動新的冒險——vocus App 正式推出! 現在起,你可以在 iOS App Store 下載全新上架的 vocus App。 無論是在通勤路上、日常空檔,或一天結束後的放鬆時刻,都能自在沈浸在內容宇宙中。
Thumbnail
在 vocus 與你一起探索內容、發掘靈感的路上,我們又將啟動新的冒險——vocus App 正式推出! 現在起,你可以在 iOS App Store 下載全新上架的 vocus App。 無論是在通勤路上、日常空檔,或一天結束後的放鬆時刻,都能自在沈浸在內容宇宙中。
Thumbnail
vocus 慶祝推出 App,舉辦 2026 全站慶。推出精選內容與數位商品折扣,訂單免費與紅包抽獎、新註冊會員專屬活動、Boba Boost 贊助抽紅包,以及全站徵文,並邀請你一起來回顧過去的一年, vocus 與創作者共同留下了哪些精彩創作。
Thumbnail
vocus 慶祝推出 App,舉辦 2026 全站慶。推出精選內容與數位商品折扣,訂單免費與紅包抽獎、新註冊會員專屬活動、Boba Boost 贊助抽紅包,以及全站徵文,並邀請你一起來回顧過去的一年, vocus 與創作者共同留下了哪些精彩創作。
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套件的文章,主要內容包括套件的使用方式,常見的實作方式和一些注意事項。文章內容較長,內容大概是在介紹套件的使用方法、使用技巧和注意事項。
Thumbnail
這篇是以預設工作流為基礎,加入提示詞去控制畫面,目的是控制生成圖像的主題跟提升品質。
Thumbnail
這篇是以預設工作流為基礎,加入提示詞去控制畫面,目的是控制生成圖像的主題跟提升品質。
Thumbnail
這是為了搭建自己想要的工作流而開始的研究工作。
Thumbnail
這是為了搭建自己想要的工作流而開始的研究工作。
Thumbnail
前言 create react app 是一個可以快速設定 react 專案的一個工具,在建立專案時已經把 babel,webpack 都已經預先封裝設置好,如果我們要修改 webpack alias 設定該如何設定呢 什麼是 alias alias 在 webpack 設定意義叫做,檔案路徑
Thumbnail
前言 create react app 是一個可以快速設定 react 專案的一個工具,在建立專案時已經把 babel,webpack 都已經預先封裝設置好,如果我們要修改 webpack alias 設定該如何設定呢 什麼是 alias alias 在 webpack 設定意義叫做,檔案路徑
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News