英文:
Mui theme breakpoints not working as expected
问题
我已经为我的基于 MUI React 的应用程序设置了断点,如下所示:
export const lighttheme = createTheme({
palette: palette,
typography: typography,
breakpoints: {
values: {
xs: 0,
sm: 600,
md: 900,
lg: 1200,
xl: 1536,
xxl: 2160,
},
},
components: {
MuiTooltip: LightMuiTooltip,
MuiDrawer: {
styleOverrides: {
root: {
display: "flex",
minHeight: "100vh",
zIndex: 1,
overflow: "hidden",
},
},
},
},
});
在我的组件中,我这样说:
const InnerNavBox = styled(Box)(() => ({
justifyContent: "space-between",
alignItems: "center",
display: "flex",
flexDirection: "column",
gap: theme.breakpoints.between("lg", "xxl") ? "4rem" : "2rem", // "2rem",
}));
我正在检查屏幕尺寸,屏幕 1 - 1194x834 和屏幕 2 - 1728x1117。我期望屏幕 1 的间距为 2rem,屏幕 2 的间距为 4rem。然而,现在两个屏幕都变成了 4rem。我不确定我做错了什么。有人可以帮忙吗?
英文:
I have set breakpoints for my mui react based app as follows
export const lighttheme = createTheme({
palette: palette,
typography: typography,
breakpoints: {
values: {
xs: 0,
sm: 600,
md: 900,
lg: 1200,
xl: 1536,
xxl: 2160,
},
},
components: {
MuiTooltip: LightMuiTooltip,
MuiDrawer: {
styleOverrides: {
root: {
display: "flex",
minHeight: "100vh",
zIndex: 1,
overflow: "hidden",
},
},
},
},
});
In my component I am saying
const InnerNavBox = styled(Box)(() => ({
justifyContent: "space-between",
alignItems: "center",
display: "flex",
flexDirection: "column",
gap: theme.breakpoints.between("lg", "xxl") ? "4rem" : "2rem", //"2rem",
}));
I am checking on screen sizes screen 1 - 1194x834 and screen 2 - 1728x1117. I am expecting the gap to be 2rem for screen 1 and 4rem for screen 2. However, both screens have become 4rem now. I am not sure what I am doing wrong. Can anyone help please.
答案1
得分: 2
theme.breakpoints.between(start, end)
返回一个媒体查询的**字符串
**,而不是一个布尔值
。你在示例中的使用方式会始终评估为true
(因为between()
的返回值是一个非空的字符串
) - 因此你的三元操作符将始终返回'4rem'
。
你尝试使用的正确方式应该是:
const InnerNavBox = styled(Box)(({ theme }) => ({
justifyContent: "space-between",
alignItems: "center",
display: "flex",
flexDirection: "column",
gap: "2rem", // 定义默认行为
[theme.breakpoints.between("lg", "xxl")]: { // 在这些断点范围内(包括)重写默认行为
gap: "4rem",
}
}));
但我想,在这个特定情况下(假设你不会有比xxl
更大的断点),你真正想要的是theme.breakpoints.up(key)
:
const InnerNavBox = styled(Box)(({ theme }) => ({
justifyContent: "space-between",
alignItems: "center",
display: "flex",
flexDirection: "column",
gap: "2rem", // 定义默认行为
[theme.breakpoints.up("lg")]: { // 注意`up()`而不是`between()` - 如果在定义的断点或更高的断点范围内,重写默认行为
gap: "4rem"
}
}));
工作的 CodeSandbox: https://codesandbox.io/s/theme-breakpoints-pvyhjd?file=/demo.tsx
英文:
theme.breakpoints.between(start, end)
returns a media query string
, not a boolean
. The way you're using it in your example will always evaluate to true
(because the return value of between()
is a non-empty string
) -- so your ternary will always return '4rem'
.
The correct usage for the way you're trying to use it would be:
const InnerNavBox = styled(Box)(({ theme }) => ({
justifyContent: "space-between",
alignItems: "center",
display: "flex",
flexDirection: "column",
gap: "2rem", // define a default behavior
[theme.breakpoints.between("lg", "xxl")]: { // override the default behavior if within these breakpoints (inclusive)
gap: "4rem",
}
}));
But I imagine, for this particular case (assuming you won't have any larger breakpoint than xxl
), what you really want is theme.breakpoints.up(key)
:
const InnerNavBox = styled(Box)(({ theme }) => ({
justifyContent: "space-between",
alignItems: "center",
display: "flex",
flexDirection: "column",
gap: "2rem", // define a default behavior
[theme.breakpoints.up("lg")]: { // Notice `up()`, not `between()` -- override the default behavior if within the defined breakpoint or higher
gap: "4rem"
}
}));
Working CodeSandbox: https://codesandbox.io/s/theme-breakpoints-pvyhjd?file=/demo.tsx
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论