我有一个导航条。页面加载后,第一个home
div会正确显示。但是,向下滚动然后再向上备份之后,home
div中的某些内容被顶部的导航栏隐藏。如何解决此问题?任何建议表示赞赏!
window.onscroll = () => {
myFunction()
};
const navbar = document.getElementById("navbar");
const sticky = navbar.offsetTop;
myFunction = () => {
if (window.pageYOffset >= sticky) {
navbar.classList.add("sticky")
} else {
navbar.classList.remove("sticky");
}
}
body {
padding: 0px;
margin: 0px;
}
#navbar {
overflow: hidden;
background-color: #000;
}
#navbar a {
float: right;
display: block;
text-align: center;
padding: 1vw;
text-decoration: none;
font-family: 'Muli', sans-serif;
font-size: 2.5vw;
font-weight: 400;
font-style: italic;
}
.color-nav a {
color: white;
}
.active {
background-color: #fff;
color: black !important;
}
.sticky {
position: fixed;
top: 0;
width: 100%;
}
.main-section {
height: 45vw;
}
<body>
<header>
<nav>
<div class='color-nav' id="navbar">
<a id='contact-link' href="#contact">Contact</a>
<a id="about-link" href="#about">About</a>
<a id='portfolio-link' href="#portfolio">Portfolio</a>
<a id='home-link' class="active" href="#home">Home</a>
</div>
</nav>
</header>
<section>
<div id='home-1' class="home main-section">
</div>
</section>
<section>
<div id="portfolio-1" class="portfolio main-section">
</div>
</section>
<section>
<div id="about-1" class='about main-section'>
</div>
</section>
<section>
<div id='contact-1' class='contact main-section'>
</div>
</section>
</body>
答案 0 :(得分:1)
问题是,滚动时会将固定位置添加到#navbar
,因此将其从页面流中移出并将其固定到屏幕上。为此,您将其从<nav>
和<header>
中删除,这些元素的高度现在为0。如果您使用chrome dev工具检查#navbar
,则可以请注意它至少高31像素,至少在我的窗口中可能会有所不同,因为如果您问我不是很好的做法,那么您将其编码为在vw
内填充,因此您可能希望重新考虑一下,并在px
,em
或rem
中加一个填充,这样一个简单的解决方法就是给父div(<header>
或{{1}) }高度为31px或导航栏的高度是什么,因此当您将导航栏从页面流中移出时,导航栏的高度将不会丢失,如下所示:
<nav>
此处为摘要:
header{
height:31px;
}
window.onscroll = () => {
myFunction()
};
const navbar = document.getElementById("navbar");
const sticky = navbar.offsetTop;
myFunction = () => {
if (window.pageYOffset >= sticky) {
navbar.classList.add("sticky")
} else {
navbar.classList.remove("sticky");
}
}
body {
padding: 0px;
margin: 0px;
}
header{
height:31px;
}
#navbar {
overflow: hidden;
background-color: #000;
}
#navbar a {
float: right;
display: block;
text-align: center;
padding: 1vw;
text-decoration: none;
font-family: 'Muli', sans-serif;
font-size: 2.5vw;
font-weight: 400;
font-style: italic;
}
.color-nav a {
color: white;
}
.active {
background-color: #fff;
color: black !important;
}
.sticky {
position: fixed;
top: 0;
width: 100%;
}
section{
height:100vh;
border:5px solid green;
}
但是,如果您只是将导航栏放在页面顶部,则没有理由使用任何此类javascript,您只需在正文顶部添加填充并为导航栏设置固定位置即可。根本没有任何这些滚动事件。如果您的导航栏上方有某些内容,并且希望以某种方式向下滚动页面后进行修复,则可以添加类似此类的javascript滚动事件。这是其中的一个片段:
<header>
<nav>
<div class='color-nav' id="navbar">
<a id='contact-link' href="#contact">Contact</a>
<a id="about-link" href="#about">About</a>
<a id='portfolio-link' href="#portfolio">Portfolio</a>
<a id='home-link' class="active" href="#home">Home</a>
</div>
</nav>
</header>
<section>
<div id='home-1' class="home main-section">
</div>
</section>
<section>
<div id="portfolio-1" class="portfolio main-section">
</div>
</section>
<section>
<div id="about-1" class='about main-section'>
</div>
</section>
<section>
<div id='contact-1' class='contact main-section'>
</div>
</section>
body {
padding: 0px;
padding-top:31px;
margin: 0px;
}
nav{
position:fixed;
top:0;
width:100%;
}
#navbar {
overflow: hidden;
background-color: #000;
}
#navbar a {
float: right;
display: block;
text-align: center;
padding: 1vw;
text-decoration: none;
font-family: 'Muli', sans-serif;
font-size: 2.5vw;
font-weight: 400;
font-style: italic;
}
.color-nav a {
color: white;
}
.active {
background-color: #fff;
color: black !important;
}
section{
height:100vh;
border:5px solid green;
}
答案 1 :(得分:0)
position: fixed;
不会留下空隙,因此由于相对的行为,它所覆盖的空间将被其他元素占用。您需要以与导航高度相同的大小以边距或填充内容。
答案 2 :(得分:0)
我需要将window.pageYOffset >= sticky
更改为window.pageYOffset > sticky
,因为在滚动到顶部时并未删除该类。