AppBar 与其他元素重叠
AppBar overlaps with other elements
我开始使用 React/Material-UI,也是 CSS 的新手等等...
我有一个带有 APPBar 的简单页面布局。不幸的是,此 AppBar 与本应位于其下方的元素重叠。
我找到了这个答案:
但这感觉完全不对。如果我的 AppBar 具有可变高度,具体取决于图标、显示模式等,该怎么办...?
我尝试创建一个垂直网格,将元素包装在不同的项目中,将顶部容器设为弹性容器并尝试使用弹性设置,但似乎没有任何效果,应用栏始终位于文本之上.
代码很简单:
import React from 'react';
import { AppBar, Typography, Box } from '@material-ui/core';
function App() {
return (
<div>
<AppBar>
<Typography variant='h3'>
AppBar
</Typography>
</AppBar>
<Box>
<Typography variant='h1' style={{ border: '1px solid black' }}>
Hello
</Typography>
</Box>
</div>
)
}
export default App;
"Hello" 文本块只有一半可见:
发生这种情况是因为 MaterialUI 应用栏默认为 position="fixed"
。这将它与标准 DOM 的布局分开,以允许内容在其下方滚动,但结果是页面上没有为它创建 space。
您可以通过将其下方的所有内容包装在 div 中并指定足够的边距来解决此问题,或者通过更改 <AppBar>
的 position
属性 使其成为不再 "fixed"
。在您的示例中,如果这是 <AppBar>
.
下方的唯一内容,您也可以将样式应用于 <Box>
例如
import React from 'react';
import { AppBar, Typography, Box } from '@material-ui/core';
function App() {
return (
<div>
<AppBar>
<Typography variant='h3'>
AppBar
</Typography>
</AppBar>
<div style={{marginTop: 80}}>
<Box>
<Typography variant='h1' style={{ border: '1px solid black' }}>
Hello
</Typography>
</Box>
</div>
</div>
)
}
export default App;
MaterialUI 为 AppBar 提供了一个可以提供帮助的主题混合。不确定您是否使用推荐的 JSS 设置,但您可以这样做:
import withStyles from '@material-ui/core/styles/withStyles';
const styles = theme => ({
appBarSpacer: theme.mixins.toolbar
});
const style = withStyles(styles)
function MyScreen ({ classes }) {
<AppBar></AppBar>
<div className={classes.appBarSpacer}></div>
<Box></Box>
}
export default style(MyScreen)
mixin 会给 div 与您的 AppBar 相同的高度,将其他内容向下推。
我认为有一个好的应用程序设置是有意见的,但我会推荐以下内容
import React from "react";
import ReactDOM from "react-dom";
import {
AppBar,
Typography,
Box,
CssBaseline,
makeStyles,
Container,
Grid,
Toolbar
} from "@material-ui/core";
const useStyles = makeStyles(theme => ({
content: {
flexGrow: 1,
height: "100vh",
overflow: "auto"
},
appBarSpacer: theme.mixins.toolbar,
title: {
flexGrow: 1
},
container: {
paddingTop: theme.spacing(4),
paddingBottom: theme.spacing(4)
}
}));
function App() {
const classes = useStyles();
return (
<div className={classes.root}>
<CssBaseline />
<AppBar position="absolute">
<Toolbar className={classes.toolbar}>
<Typography
component="h1"
variant="h6"
color="inherit"
noWrap
className={classes.title}
>
AppBar
</Typography>
</Toolbar>
</AppBar>
<main className={classes.content}>
<div className={classes.appBarSpacer} />
<Container maxWidth="lg" className={classes.container}>
<Grid container spacing={3}>
<Grid item xs={12}>
<Box>
<Typography variant="h1" style={{ border: "1px solid black" }}>
Hello
</Typography>
</Box>
</Grid>
</Grid>
</Container>
</main>
</div>
);
}
根据Material-ui,这个问题有3种解决方法。
https://material-ui.com/components/app-bar/#fixed-placement
- You can use position="sticky" instead of fixed. ⚠️ sticky is not supported by IE 11.
- You can render a second component
- You can use theme.mixins.toolbar CSS
我个人喜欢这样使用第二种解决方案。
return (
<>
<AppBar position="fixed">
<Toolbar>{/* content */}</Toolbar>
</AppBar>
<Toolbar />
</>
);
试试这个!
const useStyles = makeStyles((theme) => ({
root: {
flexGrow: 1,
[theme.breakpoints.down('sm')]: {
marginBottom: 56,
},
[theme.breakpoints.up('sm')]: {
marginBottom: 64,
},
},
menuButton: {
marginRight: theme.spacing(1),
},
title: {
flexGrow: 1,
}, }))
您可以像这样将以上内容添加到您的代码中
const Navbar = () => {
const classes = useStyles()
return (
<div className={classes.root}>
<AppBar position='fixed' color='primary'>
<Toolbar>
<IconButton
edge='start'
className={classes.menuButton}
color='inherit'
aria-label='menu'>
<MenuIcon />
</IconButton>
<Typography variant='h6' className={classes.title}>
News
</Typography>
<Button color='inherit'>Login</Button>
</Toolbar>
</AppBar>
</div>
)}
有关更多文档,请访问 material-ui breakpoint customization
<AppBar position='static'>
使用它就可以了,内容不会隐藏在 Appear
下
我开始使用 React/Material-UI,也是 CSS 的新手等等... 我有一个带有 APPBar 的简单页面布局。不幸的是,此 AppBar 与本应位于其下方的元素重叠。
我找到了这个答案:
但这感觉完全不对。如果我的 AppBar 具有可变高度,具体取决于图标、显示模式等,该怎么办...?
我尝试创建一个垂直网格,将元素包装在不同的项目中,将顶部容器设为弹性容器并尝试使用弹性设置,但似乎没有任何效果,应用栏始终位于文本之上.
代码很简单:
import React from 'react';
import { AppBar, Typography, Box } from '@material-ui/core';
function App() {
return (
<div>
<AppBar>
<Typography variant='h3'>
AppBar
</Typography>
</AppBar>
<Box>
<Typography variant='h1' style={{ border: '1px solid black' }}>
Hello
</Typography>
</Box>
</div>
)
}
export default App;
"Hello" 文本块只有一半可见:
发生这种情况是因为 MaterialUI 应用栏默认为 position="fixed"
。这将它与标准 DOM 的布局分开,以允许内容在其下方滚动,但结果是页面上没有为它创建 space。
您可以通过将其下方的所有内容包装在 div 中并指定足够的边距来解决此问题,或者通过更改 <AppBar>
的 position
属性 使其成为不再 "fixed"
。在您的示例中,如果这是 <AppBar>
.
<Box>
例如
import React from 'react';
import { AppBar, Typography, Box } from '@material-ui/core';
function App() {
return (
<div>
<AppBar>
<Typography variant='h3'>
AppBar
</Typography>
</AppBar>
<div style={{marginTop: 80}}>
<Box>
<Typography variant='h1' style={{ border: '1px solid black' }}>
Hello
</Typography>
</Box>
</div>
</div>
)
}
export default App;
MaterialUI 为 AppBar 提供了一个可以提供帮助的主题混合。不确定您是否使用推荐的 JSS 设置,但您可以这样做:
import withStyles from '@material-ui/core/styles/withStyles';
const styles = theme => ({
appBarSpacer: theme.mixins.toolbar
});
const style = withStyles(styles)
function MyScreen ({ classes }) {
<AppBar></AppBar>
<div className={classes.appBarSpacer}></div>
<Box></Box>
}
export default style(MyScreen)
mixin 会给 div 与您的 AppBar 相同的高度,将其他内容向下推。
我认为有一个好的应用程序设置是有意见的,但我会推荐以下内容
import React from "react";
import ReactDOM from "react-dom";
import {
AppBar,
Typography,
Box,
CssBaseline,
makeStyles,
Container,
Grid,
Toolbar
} from "@material-ui/core";
const useStyles = makeStyles(theme => ({
content: {
flexGrow: 1,
height: "100vh",
overflow: "auto"
},
appBarSpacer: theme.mixins.toolbar,
title: {
flexGrow: 1
},
container: {
paddingTop: theme.spacing(4),
paddingBottom: theme.spacing(4)
}
}));
function App() {
const classes = useStyles();
return (
<div className={classes.root}>
<CssBaseline />
<AppBar position="absolute">
<Toolbar className={classes.toolbar}>
<Typography
component="h1"
variant="h6"
color="inherit"
noWrap
className={classes.title}
>
AppBar
</Typography>
</Toolbar>
</AppBar>
<main className={classes.content}>
<div className={classes.appBarSpacer} />
<Container maxWidth="lg" className={classes.container}>
<Grid container spacing={3}>
<Grid item xs={12}>
<Box>
<Typography variant="h1" style={{ border: "1px solid black" }}>
Hello
</Typography>
</Box>
</Grid>
</Grid>
</Container>
</main>
</div>
);
}
根据Material-ui,这个问题有3种解决方法。
https://material-ui.com/components/app-bar/#fixed-placement
- You can use position="sticky" instead of fixed. ⚠️ sticky is not supported by IE 11.
- You can render a second component
- You can use theme.mixins.toolbar CSS
我个人喜欢这样使用第二种解决方案。
return (
<>
<AppBar position="fixed">
<Toolbar>{/* content */}</Toolbar>
</AppBar>
<Toolbar />
</>
);
试试这个!
const useStyles = makeStyles((theme) => ({
root: {
flexGrow: 1,
[theme.breakpoints.down('sm')]: {
marginBottom: 56,
},
[theme.breakpoints.up('sm')]: {
marginBottom: 64,
},
},
menuButton: {
marginRight: theme.spacing(1),
},
title: {
flexGrow: 1,
}, }))
您可以像这样将以上内容添加到您的代码中
const Navbar = () => {
const classes = useStyles()
return (
<div className={classes.root}>
<AppBar position='fixed' color='primary'>
<Toolbar>
<IconButton
edge='start'
className={classes.menuButton}
color='inherit'
aria-label='menu'>
<MenuIcon />
</IconButton>
<Typography variant='h6' className={classes.title}>
News
</Typography>
<Button color='inherit'>Login</Button>
</Toolbar>
</AppBar>
</div>
)}
有关更多文档,请访问 material-ui breakpoint customization
<AppBar position='static'>
使用它就可以了,内容不会隐藏在 Appear
下