跳到主要內容
+

如何自訂

了解如何利用針對特定使用情境的不同策略來自訂 Material UI 元件。

Material UI 提供了幾種不同的方式來自訂元件的樣式。您的特定情境將決定哪一種最為理想。以下選項從最窄到最廣的使用情境排列

  1. 單次自訂
  2. 可重複使用的元件
  3. 全域主題覆寫
  4. 全域 CSS 覆寫

1. 單次自訂

若要變更單一實例元件的樣式,您可以使用以下選項之一

sx 屬性

sx 屬性是在大多數情況下,將樣式覆寫新增至單一元件實例的最佳選項。它可以用於所有 Material UI 元件。

按下 Enter 鍵開始編輯

覆寫巢狀元件樣式

若要自訂元件的特定部分,您可以使用 Material UI 提供的類別名稱在 sx 屬性內。舉例來說,假設您想要將 Slider 元件的滑桿圓點從圓形變更為方形。

首先,使用瀏覽器的開發者工具來識別您想要覆寫的元件插槽的類別。

Material UI 注入到 DOM 中的樣式依賴於所有遵循標準模式的類別名稱:[hash]-Mui[元件名稱]-[插槽名稱]

在本例中,樣式是使用 .css-ae2u5c-MuiSlider-thumb 套用的,但您實際上只需要鎖定 .MuiSlider-thumb,其中 Slider 是元件,而 thumb 是插槽。使用此類別名稱在 sx 屬性 (& .MuiSlider-thumb) 中編寫 CSS 選擇器,並新增您的覆寫。

dev-tools
按下 Enter 鍵開始編輯

使用類別名稱覆寫樣式

如果您想要使用自訂類別來覆寫元件的樣式,您可以使用每個元件上都可用的 className 屬性。若要覆寫元件特定部分的樣式,請使用 Material UI 提供的全域類別,如前一節「覆寫巢狀元件樣式」sx 屬性章節所述。

請造訪樣式庫互操作性指南,以尋找使用不同樣式庫的此方法的範例。

狀態類別

hoverfocusdisabledselected 等狀態的樣式具有較高的 CSS 權重。若要自訂它們,您需要增加權重

以下是使用偽類別 (:disabled) 的 disabled 狀態和 Button 元件的範例

.Button {
  color: black;
}

/* Increase the specificity */
.Button:disabled {
  color: white;
}
<Button disabled className="Button">

您不一定總是可以使用 CSS 偽類別,因為該狀態在網路規範中不存在。讓我們以 MenuItem 元件及其 selected 狀態為例。在這種情況下,您可以使用 Material UI 的狀態類別,其作用就像 CSS 偽類別。鎖定 .Mui-selected 全域類別名稱以自訂 MenuItem 元件的特殊狀態

.MenuItem {
  color: black;
}

/* Increase the specificity */
.MenuItem.Mui-selected {
  color: blue;
}
<MenuItem selected className="MenuItem">

如果您想了解更多關於此主題的資訊,我們建議您查看 MDN Web Docs 上關於 CSS 權重的文件

為什麼我需要增加權重才能覆寫一個元件狀態?

CSS 偽類別具有很高的權重。為了與原生元素保持一致性,Material UI 的狀態類別具有與 CSS 偽類別相同的權重,使其可以鎖定個別元件的狀態。

Material UI 中有哪些可用的自訂狀態類別?

您可以依賴 Material UI 產生的以下全域類別名稱

狀態 全域類別名稱
active .Mui-active
checked .Mui-checked
completed .Mui-completed
disabled .Mui-disabled
error .Mui-error
expanded .Mui-expanded
focus visible .Mui-focusVisible
focused .Mui-focused
readOnly .Mui-readOnly
required .Mui-required
selected .Mui-selected
/* ❌ NOT OK */
.Mui-error {
  color: red;
}

/* ✅ OK */
.MuiOutlinedInput-root.Mui-error {
  color: red;
}

2. 可重複使用的元件

若要在應用程式中的不同位置重複使用相同的覆寫,請使用 styled() 工具函式建立可重複使用的元件

按下 Enter 鍵開始編輯

動態覆寫

styled() 工具函式可讓您根據元件的 props 新增動態樣式。您可以使用動態 CSSCSS 變數來執行此操作。

動態 CSS

import * as React from 'react';
import { styled } from '@mui/material/styles';
import Slider, { SliderProps } from '@mui/material/Slider';

interface StyledSliderProps extends SliderProps {
  success?: boolean;
}

const StyledSlider = styled(Slider, {
  shouldForwardProp: (prop) => prop !== 'success',
})<StyledSliderProps>(({ success, theme }) => ({
  ...(success &&
    {
      // the overrides added when the new prop is used
    }),
}));

CSS 變數

按下 Enter 鍵開始編輯

3. 全域主題覆寫

Material UI 提供了主題工具,用於管理整個使用者介面中所有元件之間的樣式一致性。請造訪元件主題客製化頁面以取得更多詳細資訊。

4. 全域 CSS 覆寫

若要為某些 HTML 元素新增全域基準樣式,請使用 GlobalStyles 元件。以下範例說明如何覆寫 h1 元素的樣式

按下 Enter 鍵開始編輯

GlobalStyles 元件中的 styles 屬性支援回呼函式,以防您需要存取主題。

按下 Enter 鍵開始編輯

如果您已經在使用 CssBaseline 元件來設定基準樣式,您也可以將這些全域樣式新增為此元件的覆寫。以下說明如何使用此方法達到相同的效果。

按下 Enter 鍵開始編輯

MuiCssBaseline 元件插槽中的 styleOverrides 鍵也支援您可以從中存取主題的回呼函式。以下說明如何使用此方法達到相同的效果。

按下 Enter 鍵開始編輯
 import * as React from 'react';
 import GlobalStyles from '@mui/material/GlobalStyles';

+const inputGlobalStyles = <GlobalStyles styles={...} />;

 function Input(props) {
   return (
     <React.Fragment>
-      <GlobalStyles styles={...} />
+      {inputGlobalStyles}
       <input {...props} />
     </React.Fragment>
   )
 }

API

請參閱以下文件,以取得此處提及的元件可用的所有 props 和類別的完整參考。