MUI JSS 结合媒体查询不重复
MUI JSS combine media queries without repetition
我有一组 CSS 样式需要应用于多个媒体查询规则。有没有办法不重复地做到这一点?目前这样的事情似乎是唯一的垃圾方式:
[theme.breakpoints.up('xl')]: {
color: 'red',
backgroundColor: 'green',
border: '1px solid blue',
fontSize: 17,
marginTop: 3,
padding: 7,
display: 'flex',
flexDirecton: 'column',
},
[theme.breakpoints.only('md')]: {
color: 'red',
backgroundColor: 'green',
border: '1px solid blue',
fontSize: 17,
marginTop: 3,
padding: 7,
display: 'flex',
flexDirecton: 'column',
},
[theme.breakpoints.down('xs')]: {
color: 'red',
backgroundColor: 'green',
border: '1px solid blue',
fontSize: 17,
marginTop: 3,
padding: 7,
display: 'flex',
flexDirecton: 'column',
}
首先要认识到的是 theme.breakpoints
方法并没有做任何神奇的事情——它们只是生成媒体查询字符串的便捷方法。
例如 theme.breakpoints.down('xs')
(使用默认断点值时)计算为 @media (max-width:599.95px)
,theme.breakpoints.only('md')
计算为 @media (min-width:960px) and (max-width:1279.95px)
。您可以在 createBreakpoints function.
中找到 Material-UI 代码
下一步是了解在 CSS(和 JSS)中实现 objective 的语法。 Commas 可用于对多个媒体查询条件进行“或”运算,因此您要为问题中的示例生成的字符串如下:
@media (max-width:599.95px), (min-width:960px) and (max-width:1279.95px), (min-width:1920px)
为了避免对断点值进行硬编码,您可以通过将所需的函数调用串在一起(使用逗号)并删除无关的 @media
来生成上述字符串,因为这应该只发生一次在开头。
这是一个工作示例:
import React from "react";
import Button from "@material-ui/core/Button";
import { makeStyles } from "@material-ui/core/styles";
const useStyles = makeStyles((theme) => ({
button: {
color: "white",
backgroundColor: "purple",
[`${theme.breakpoints.down("xs")},${theme.breakpoints
.only("md")
.replace("@media", "")},${theme.breakpoints
.up("xl")
.replace("@media", "")}`]: {
color: "red",
backgroundColor: "green",
border: "1px solid blue",
fontSize: 17,
marginTop: 3,
padding: 7,
display: "flex",
flexDirecton: "column"
}
}
}));
export default function App() {
const classes = useStyles();
return (
<Button className={classes.button} variant="contained">
Hello World!
</Button>
);
}
相关回答:
我有一组 CSS 样式需要应用于多个媒体查询规则。有没有办法不重复地做到这一点?目前这样的事情似乎是唯一的垃圾方式:
[theme.breakpoints.up('xl')]: {
color: 'red',
backgroundColor: 'green',
border: '1px solid blue',
fontSize: 17,
marginTop: 3,
padding: 7,
display: 'flex',
flexDirecton: 'column',
},
[theme.breakpoints.only('md')]: {
color: 'red',
backgroundColor: 'green',
border: '1px solid blue',
fontSize: 17,
marginTop: 3,
padding: 7,
display: 'flex',
flexDirecton: 'column',
},
[theme.breakpoints.down('xs')]: {
color: 'red',
backgroundColor: 'green',
border: '1px solid blue',
fontSize: 17,
marginTop: 3,
padding: 7,
display: 'flex',
flexDirecton: 'column',
}
首先要认识到的是 theme.breakpoints
方法并没有做任何神奇的事情——它们只是生成媒体查询字符串的便捷方法。
例如 theme.breakpoints.down('xs')
(使用默认断点值时)计算为 @media (max-width:599.95px)
,theme.breakpoints.only('md')
计算为 @media (min-width:960px) and (max-width:1279.95px)
。您可以在 createBreakpoints function.
下一步是了解在 CSS(和 JSS)中实现 objective 的语法。 Commas 可用于对多个媒体查询条件进行“或”运算,因此您要为问题中的示例生成的字符串如下:
@media (max-width:599.95px), (min-width:960px) and (max-width:1279.95px), (min-width:1920px)
为了避免对断点值进行硬编码,您可以通过将所需的函数调用串在一起(使用逗号)并删除无关的 @media
来生成上述字符串,因为这应该只发生一次在开头。
这是一个工作示例:
import React from "react";
import Button from "@material-ui/core/Button";
import { makeStyles } from "@material-ui/core/styles";
const useStyles = makeStyles((theme) => ({
button: {
color: "white",
backgroundColor: "purple",
[`${theme.breakpoints.down("xs")},${theme.breakpoints
.only("md")
.replace("@media", "")},${theme.breakpoints
.up("xl")
.replace("@media", "")}`]: {
color: "red",
backgroundColor: "green",
border: "1px solid blue",
fontSize: 17,
marginTop: 3,
padding: 7,
display: "flex",
flexDirecton: "column"
}
}
}));
export default function App() {
const classes = useStyles();
return (
<Button className={classes.button} variant="contained">
Hello World!
</Button>
);
}
相关回答: