Biến chủ đề CSS - Cấu hình
Hướng dẫn cấu hình biến chủ đề CSS trong Material UI.
Mẫu cao cấp . Bắt đầu dự án của bạn với các mẫu tốt nhất dành cho quản trị viên, bảng điều khiển, v.v.quảng cáo của MUI
Tùy chỉnh tiền tố biến
Để thay đổi tiền tố biến mặc định ( --mui), hãy cung cấp một chuỗi cho cssVarPrefixthuộc tính, như được hiển thị bên dưới:
createTheme({ cssVariables: { cssVarPrefix: 'any' } });
// generated stylesheet:
// --any-palette-primary-main: ...;
Sao chép
Để xóa tiền tố, hãy sử dụng một chuỗi rỗng làm giá trị:
createTheme({ cssVariables: { cssVarPrefix: '' } });
// generated stylesheet:
// --palette-primary-main: ...;
Sao chép
Chuyển đổi chế độ tối theo cách thủ công
Để chuyển đổi giữa các chế độ theo cách thủ công, hãy thiết lập colorSchemeSelectorbằng một trong các bộ chọn sau:
lớp họcdữ liệusợi dây
Sao chép
createTheme({
colorSchemes: { light: true, dark: true },
cssVariables: {
colorSchemeSelector: 'class'
}
});
// CSS Result
.light { ... }
.dark { ... }
Sau đó, sử dụng useColorSchemehook để chuyển đổi giữa các chế độ:
import { useColorScheme } from '@mui/material/styles';
function ModeSwitcher() {
const { mode, setMode } = useColorScheme();
if (!mode) {
return null;
}
return (
<select
value={mode}
onChange={(event) => {
setMode(event.target.value);
// For TypeScript, cast `event.target.value as 'light' | 'dark' | 'system'`:
}}
>
<option value="system">System</option>
<option value="light">Light</option>
<option value="dark">Dark</option>
</select>
);
}
Sao chép
Sau khi React hydrat hóa cây, chế độ sẽ được thiết lập để systemtuân theo sở thích của người dùng.
Xác định chế độ hệ thống
Để xác định chế độ hệ thống là lighthay dark, hãy sử dụng systemModethuộc tính:
const { mode, systemMode } = useColorScheme();
console.log(mode); // 'system'
console.log(systemMode); // 'light' | 'dark'
Sao chép
Tuy nhiên, nếu chế độ không phải là system , thì systemModesẽ là undefined.
const { mode, systemMode } = useColorScheme();
console.log(mode); // 'light' | 'dark'
console.log(systemMode); // undefined
Sao chép
Ngăn chặn nhấp nháy SSR
Đối với các ứng dụng SSR (kết xuất phía máy chủ), Material UI không thể phát hiện chế độ do người dùng chọn trên máy chủ, khiến màn hình nhấp nháy từ sáng sang tối trong giai đoạn hydrat hóa trên máy khách.
Để ngăn ngừa sự cố này, bạn cần đảm bảo rằng không có lệnh nào được sử dụng theme.palette.mode === 'dark'trong cơ sở mã của bạn.
Nếu bạn gặp tình trạng như vậy, hãy thay thế nó bằng theme.applyStyleshàm:
import Card from '@mui/material/Card';
function App() {
return (
<Card
sx={(theme) => ({
- backgroundColor: theme.palette.mode === 'dark' ? '#000' : '#fff',
- '&:hover': {
- backgroundColor: theme.palette.mode === 'dark' ? '#333' : '#f5f5f5',
- },
+ backgroundColor: '#fff',
+ '&:hover': {
+ backgroundColor: '#f5f5f5',
+ ...theme.applyStyles('dark', {
+ backgroundColor: '#333',
+ }),
+ },
+ ...theme.applyStyles('dark', {
+ backgroundColor: '#000',
+ }),
})}
/>
);
}
Sao chép
Tiếp theo, nếu bạn có bộ chọn tùy chỉnh chưa được thêm vào media , hãy thêm InitColorSchemeScriptthành phần dựa trên khuôn khổ mà bạn đang sử dụng:
Giá trị này attributephải giống với giá trị bạn thiết lập trong colorSchemeSelectorthuộc tính:
createTheme({
cssVariables: {
colorSchemeSelector: 'class'
}
})
<InitColorSchemeScript attribute="class" />
Sao chép
Bộ định tuyến ứng dụng Next.js
Thêm đoạn mã sau vào tệp bố cục gốc :
ứng dụng/layout.js
import InitColorSchemeScript from '@mui/material/InitColorSchemeScript';
export default function RootLayout(props) {
return (
<html lang="en" suppressHydrationWarning>
<body>
{/* must come before the <main> element */}
<InitColorSchemeScript attribute="class" />
<main>{children}</main>
</body>
</html>
);
}
Sao chép
Nếu bạn không thêm suppressHydrationWarningvào <html>thẻ của mình, bạn sẽ thấy cảnh báo về "Extra attributes from the server"việc InitColorSchemeScriptcập nhật phần tử đó.
Bộ định tuyến trang Next.js
Thêm đoạn mã sau vào pages/_document.jstệp tùy chỉnh:
trang/_document.js
import Document, { Html, Head, Main, NextScript } from 'next/document';
import InitColorSchemeScript from '@mui/material/InitColorSchemeScript';
export default class MyDocument extends Document {
render() {
return (
<Html>
<Head>...</Head>
<body>
{/* must come before the <Main> element */}
<InitColorSchemeScript attribute="class" />
<Main />
<NextScript />
</body>
</Html>
);
}
}
Sao chép
Gatsby
Đặt tập lệnh vào gatsby-ssr.jstệp của bạn:
import * as React from 'react';
import InitColorSchemeScript from '@mui/material/InitColorSchemeScript';
export function onRenderBody({ setPreBodyComponents }) {
setPreBodyComponents([<InitColorSchemeScript attribute="class" />]);
}
Sao chép
Buộc áp dụng một bảng màu cụ thể
Để áp dụng một bảng màu cụ thể cho một phần nào đó của ứng dụng, hãy đặt bộ chọn trực tiếp vào thành phần hoặc phần tử HTML.
Trong ví dụ dưới đây, tất cả các thành phần bên trong divsẽ luôn tối:
lớp họcthuộc tính dữ liệu
Sao chép
// if the selector is '.mode-%s'
<div className=".mode-dark">
<Paper sx={{ p: 2 }}>
<TextField label="Email" type="email" margin="normal" />
<TextField label="Password" type="password" margin="normal" />
<Button>Sign in</Button>
</Paper>
{/* other components */}
</div>
Vô hiệu hóa bảng màu CSS
Theo mặc định, createThemeđính kèm một thuộc tính CSScolor-scheme dựa trên chế độ bảng màu. Bạn có thể vô hiệu hóa điều này bằng cách thiết lập disableCssColorSchemethành true:
createTheme({
cssVariables: { disableCssColorScheme: true },
});
Sao chép
Mã CSS được tạo ra sẽ không bao gồm color-schemethuộc tính:
@media (prefers-color-scheme: dark) {
:root {
- color-scheme: dark;
--mui-palette-primary-main: #90caf9;
...
}
}
Sao chép
Chuyển đổi tức thời giữa các bảng màu
Để vô hiệu hóa hiệu ứng chuyển tiếp CSS khi chuyển đổi giữa các chế độ, hãy áp dụng thuộc disableTransitionOnChangetính:
<ThemeProvider disableTransitionOnChange />