我有以下index.css文件:
//Index.css
...
@font-face {
font-family: "My Font";
font-style: normal;
font-display: swap;
font-weight: 400;
src: url(/public/fonts/my-font.eot);
src: url(/public/fonts/my-font.eot#iefix) format("embedded-opentype"),
url(/public/fonts/my-font.otf) format("otf"),
url(/public/fonts/my-font.svg) format("svg"),
url(/public/fonts/my-font.woff) format("woff"),
url(/public/fonts/my-font.woff2) format("woff2");
}
...
然后我有 GlobalStyles.jsx 和 CustomThemeProvider.jsx 文件用于创建我的 MUI 主题,如下所示:
// GlobalStyles.jsx
import GlobalStyles from "@mui/material/GlobalStyles";
const importGlobalStyles = (
<GlobalStyles
styles={{
body: {
backgroundImage: `url(${window.theme.backgroundLink})`,
backgroundColor: `${window.theme.colors.pageBackground}`,
color: `${window.theme.colors.font}`,
fontFamily: `-apple-system, ${window.theme.fontFamilyName}, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu",
"Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;`,
},
}}
/>
);
export default importGlobalStyles;
还有
//CustomeThemeProvider.jsx
import React from "react";
import { createTheme, ThemeProvider } from "@mui/material/styles";
export const appTheme = createTheme({
palette: {
primary: {
main: window.theme.colors.primary,
},
error: {
main: window.theme.colors.error,
},
},
typography: {
allVariants: {
fontFamily: `-apple-system, ${window.theme.fonts.fontFamilyName}, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif`,
},
fontFamily: `-apple-system, ${window.theme.fonts.fontFamilyName}, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif`,
h1: {
fontWeight: 500,
fontSize: "30pt",
lineHeight: "40pt",
color: window.theme.colors.primary,
},
},
});
const CustomThemeProvider = (props) => {
const { children } = props;
return <ThemeProvider theme={appTheme}>{children}</ThemeProvider>;
};
export default CustomThemeProvider;
这一切都工作正常,允许我通过在公共 config.js 文件中设置 window.xxx 主题变量来自定义主题,然后我可以将其传递到主题中(您可以在下面看到它们使用 window.theme.xxx 传递) .
我遇到的问题是,我无法弄清楚如何从index.css中提取@font-face并将其移动到我拥有的主题设置中,因此我可以将主题链接设置为要传入的变量。这样,我可以在重建此应用程序等时使用白色标签字体。
关于如何最好地实现这一目标有什么想法吗?我已通读 MUI 文档,但没有发现任何超级有用的内容。我们不使用 CSSBaseline,也不想特别实现其中任何一个,因为它在我们当前的实现中是不必要的。关于如何执行此操作有什么建议吗?
您可以将字体 URL 定义为主题变量,然后 使用 @font-face 声明中定义的主题变量,然后 在您的 MUI 主题中导入并应用 @font-face 样式。
例如-
//CustomThemeProvider.jsx:
import React from "react";
import { createTheme, ThemeProvider } from "@mui/material/styles";
export const appTheme = createTheme({
palette: {
primary: {
main: window.theme.colors.primary,
},
error: {
main: window.theme.colors.error,
},
},
typography: {
allVariants: {
fontFamily: `-apple-system, ${window.theme.fonts.fontFamilyName}, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif`,
},
fontFamily: `-apple-system, ${window.theme.fonts.fontFamilyName}, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif`,
h1: {
fontWeight: 500,
fontSize: "30pt",
lineHeight: "40pt",
color: window.theme.colors.primary,
},
},
// Add font URLs as theme variables
fonts: {
myFont: {
eot: "/public/fonts/my-font.eot",
otf: "/public/fonts/my-font.otf",
svg: "/public/fonts/my-font.svg",
woff: "/public/fonts/my-font.woff",
woff2: "/public/fonts/my-font.woff2",
},
},
});
const CustomThemeProvider = (props) => {
const { children } = props;
return <ThemeProvider theme={appTheme}>{children}</ThemeProvider>;
};
export default CustomThemeProvider;
//GlobalStyles.jsx
import React from "react";
import { GlobalStyles as MuiGlobalStyles } from "@mui/material";
import { appTheme } from "./CustomThemeProvider";
const GlobalStyles = (
<MuiGlobalStyles
styles={{
body: {
backgroundImage: `url(${window.theme.backgroundLink})`,
backgroundColor: `${window.theme.colors.pageBackground}`,
color: `${window.theme.colors.font}`,
fontFamily: appTheme.typography.allVariants.fontFamily,
// Other styles...
},
// Add @font-face styles using theme variables
'@font-face': {
fontFamily: 'My Font',
fontStyle: 'normal',
fontDisplay: 'swap',
fontWeight: 400,
src: `
url(${appTheme.fonts.myFont.eot}),
url(${appTheme.fonts.myFont.eot}#iefix) format("embedded-opentype"),
url(${appTheme.fonts.myFont.otf}) format("otf"),
url(${appTheme.fonts.myFont.svg}) format("svg"),
url(${appTheme.fonts.myFont.woff}) format("woff"),
url(${appTheme.fonts.myFont.woff2}) format("woff2")
`,
},
}}
/>
);
export default GlobalStyles;
让我知道这是否有效。
将字体 URL 定义为
CustomThemeProvider.jsx
或单独的配置文件(例如 fontConfig.js
)中的变量。
// fontConfig.js
const fontUrls = {
eot: "/public/fonts/my-font.eot",
otf: "/public/fonts/my-font.otf",
svg: "/public/fonts/my-font.svg",
woff: "/public/fonts/my-font.woff",
woff2: "/public/fonts/my-font.woff2",
};
export default fontUrls;
fontUrls
对象导入到您的 CustomThemeProvider.jsx
中。// CustomThemeProvider.jsx
import React from "react";
import { createTheme, ThemeProvider } from "@mui/material/styles";
import fontUrls from "./fontConfig"; // Import the fontUrls object
export const appTheme = createTheme({
// ... Your existing theme configuration ...
// Add the font URLs using the imported fontUrls object
typography: {
// ... Your existing typography configuration ...
fontFamily: `-apple-system, ${window.theme.fonts.fontFamilyName}, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif`,
},
overrides: {
MuiCssBaseline: {
// Include the font URLs as variables
"@font-face": {
fontFamily: "My Font",
fontDisplay: "swap",
fontWeight: 400,
src: `
url(${fontUrls.eot}) format("embedded-opentype"),
url(${fontUrls.woff2}) format("woff2"),
url(${fontUrls.woff}) format("woff"),
url(${fontUrls.ttf}) format("truetype"),
url(${fontUrls.svg}) format("svg");
`,
},
},
},
});
const CustomThemeProvider = (props) => {
const { children } = props;
return <ThemeProvider theme={appTheme}>{children}</ThemeProvider>;
};
export default CustomThemeProvider;
通过执行这些步骤,您已将
@font-face
声明移至您的 MUI 主题设置中,使其更易于管理和自定义。