【发布时间】:2021-03-15 19:52:16
【问题描述】:
使用 ReactJS,我正在尝试以与 Airtable has done on their product page 相同的方式制作第二个(较小的)导航栏。我的第一个导航栏在顶部,一旦我滚动就会从透明变暗。当我希望它位于标题背景图像的正下方时,第二个栏(屏幕截图中的紫色很容易看到)当前位于第一个导航栏的后面。
第一个(主)导航栏 - “Header.js”
import React, { useEffect, useState } from 'react';
import { makeStyles } from '@material-ui/core/styles';
import { AppBar, IconButton, Toolbar, Collapse } from '@material-ui/core';
import SortIcon from '@material-ui/icons/Sort';
import ExpandMoreIcon from '@material-ui/icons/ExpandMore';
import { Link as Scroll } from 'react-scroll';
import ScrollToColor from './ColorChangeOnScroll';
const useStyles = makeStyles((theme) => ({
root: {
display: 'flex',
justifyContent: 'center',
alignItems: 'center',
height: '100vh',
fontFamily: 'Nunito',
},
appbar: {
background: 'none',
},
appbarTitle:{
flexGrow: '1',
},
appbarWrapper:{
width: '80%',
margin: '0 auto',
},
icon: {
color: '#fff',
fontSize: '2rem',
},
colorText: {
color: '#34cbc2',
},
container: {
textAlign: 'center',
},
title: {
color: '#fff',
fontSize: '4rem',
},
goDown: {
color: '#34cbc2',
fontSize: '4rem',
},
}));
export default function Header() {
const classes = useStyles();
const [checked, setChecked] = useState(false);
useEffect(() => {
setChecked(true);
}, []);
return (
<section>
<div className={classes.root} id="header">
<ScrollToColor>
<AppBar className={classes.appbar} elevation={0}>
<Toolbar className={classes.appbarWrapper}>
<h1 className={classes.appbarTitle}>
Logo <span className={classes.colorText}>Colored</span>
</h1>
<IconButton>
<SortIcon className={classes.icon} />
</IconButton>
</Toolbar>
</AppBar>
</ScrollToColor>
<Collapse
in={checked}
{...(checked ? { timeout: 1000 } : {})}
collapsedHeight={50}>
<div className={classes.container}>
<h1 className={classes.title}>
Main header <br />
at <span className={classes.colorText}>title.</span>
</h1>
<Scroll to="info-card" smooth={true}>
<IconButton>
<ExpandMoreIcon className={classes.goDown} />
</IconButton>
</Scroll>
</div>
</Collapse>
</div>
</section>
);
}
第二个导航栏 - “StickyHeader.js”
import React, { useEffect, useState } from 'react';
import { makeStyles } from '@material-ui/core/styles';
import { AppBar, IconButton, Toolbar, Collapse } from '@material-ui/core';
import SortIcon from '@material-ui/icons/Sort';
const useStyles = makeStyles((theme) => ({
root: {
top: '1000px',
display: 'flex',
position: 'sticky',
justifyContent: 'center',
alignItems: 'center',
fontFamily: 'Nunito',
},
appbar: {
background: 'purple',
},
list: {
display: 'flex',
justifyContent: 'center',
alignItems: 'center',
},
}));
export default function Header() {
const classes = useStyles();
const [checked, setChecked] = useState(false);
useEffect(() => {
setChecked(true);
}, []);
return (
<section>
<div className={classes.root} style={{ top: "72px" }} id="stickyheader">
<AppBar className={classes.appbar} elevation={4}>
<Toolbar className={classes.appbarWrapper}>
<ul className={classes.list} style={{ listStyleType: "none" }}>
<li>
<a href="#product" data-id="product" data-is-active="true">Database</a>
</li>
</ul>
</Toolbar>
</AppBar>
</div>
</section>
);
}
登陆页面sn-p
export default function Landing() {
const classes = useStyles();
return (
<div className={classes.root}>
<CssBaseline />
<Header />
<StickyHeader />
<InfoCards />
</div>
);
}
尝试调整:
- 将每个组件分成各自的文件以充当“部分”,这样一个组件就可以放在另一个组件之上
- 在
useStyles和position: relative中调整margin、marginTop - 同上
position: sticky - 将
style={{ top: "##px" }}添加到导航栏的div以查看是否将其向下推
所需结果的 Photoshop 视图(其中第二个导航栏是粘性的,并且在滚动过去时“加入”第一个导航栏)
我不确定我是否在这些导航栏的样式中遗漏了一些简单的东西,或者这是否需要更复杂的东西。任何建议都提前表示赞赏。
注意 徽标和标题标题是第一个导航栏的一部分。第二个(紫色)导航栏有一个非常小的“数据库”可点击文本,在前几张截图中很难看到,就在“彩色徽标”的顶部。
【问题讨论】:
-
"appbar" 是解决方案...请参阅下面的答案。
标签: javascript reactjs material-ui