在移动设计中,常见的设计是使用较小的标题字体。
Material UI 是否有一种机制可以使排版具有响应性?
我看到默认主题中定义了以 rems 为单位的字体大小 - 这是否意味着只需减小基础字体大小即可?(这似乎行不通,如果您想以不同的比率减小标题字体怎么办)。
在移动设计中,常见的设计是使用较小的标题字体。
Material UI 是否有一种机制可以使排版具有响应性?
我看到默认主题中定义了以 rems 为单位的字体大小 - 这是否意味着只需减小基础字体大小即可?(这似乎行不通,如果您想以不同的比率减小标题字体怎么办)。
更新
MUI v4内置响应式字体!详情请查看此处。
旧回答
@Luke的回答很好。我想添加一些细节,以使其在实际中起作用,因为断点和pxToRem都可以通过主题对象访问... 这导致了鸡生蛋的问题! 我的方法是:
import { createMuiTheme } from "@material-ui/core"
const defaultTheme = createMuiTheme({ ... customisations that don’t rely on theme properties... })
const { breakpoints, typography: { pxToRem } } = defaultTheme
const theme = {
...defaultTheme,
overrides: {
MuiTypography: {
h1: {
fontSize: "5rem",
[breakpoints.down("xs")]: {
fontSize: "3rem"
}
}
}
}
}
export default theme
其他答案都没有使用variant
预设。
MUI v5的最佳方式是使用variant
:
<Typography sx={{ typography: { sm: 'body1', xs: 'body2' } }} >
Hello world!
</Typography>
如文档中描述的,您可以使用responsiveFontSizes()
助手使主题中的Typography字体大小响应。
import { createMuiTheme, responsiveFontSizes } from '@material-ui/core/styles';
let theme = createMuiTheme();
theme = responsiveFontSizes(theme);
更新
最新版本的Material UI(v4)完全支持响应式字体。详情请参见官方文档。
翻译后的答案
从1.x版本开始,Material UI没有专门处理响应式字体的机制。
您可以通过更改<html>
元素的font-size
来缩放所有MUI Typography
的大小,正如您所提到的一样。(文档)
const styles = theme => ({
"@global": {
html: {
[theme.breakpoints.up("sm")]: {
fontSize: 18
}
}
}
}
主题覆盖
据我所知,另一种选择是使用主题覆盖为每个Typography
变体定义自定义样式。
这需要复制一些createTypography.js中的逻辑(即设置行高以保持垂直韵律)。
const theme = createMuiTheme({
overrides: {
MuiTypography: {
headline: {
fontSize: pxToRem(24),
[breakpoints.up("md")]: {
fontSize: pxToRem(32)
}
}
}
}
breakpoints
变量是从哪里来的?我知道它应该来自一个主题,但这正是你正在创建的东西,在你使用 breakpoints
的时候还没有被创建。 - Christiaan WesterbeekMUI v5增加了sx
属性到所有支持响应式值的MUI组件中,你可以传递一个对象来定义不同断点处的值:
<Typography
sx={{
fontSize: {
lg: 30,
md: 20,
sm: 15,
xs: 10
}
}}
>
This text is resized on different screen breakpoints
</Typography>
与Box
类似,Typography
也支持系统属性,因此您可以跳过sx
属性,直接传递fontSize
属性。以下代码与上面的代码相同,只是写法更简洁:
<Typography
fontSize={{
lg: 30,
md: 20,
sm: 15,
xs: 10
}}
>
This text is resized on different screen breakpoints
</Typography>
import { createTheme } from "@mui/material";
let theme = createTheme({
// ...
});
theme = createTheme(theme, {
typography: {
h1: {
fontSize: 53,
[theme.breakpoints.only("sm")]: {
fontSize: 71,
},
},
},
});
export default theme;
这对我来说似乎是有效的 v5
在 App.js 文件中
...
import {
createTheme,
responsiveFontSizes,
ThemeProvider,
} from '@mui/material/styles';
let theme = createTheme();
theme = responsiveFontSizes(theme);
...
function App() {
return (
<ThemeProvider theme={theme}>
<Router>
.....
</Router>
</ThemeProvider>
);
}