我正在尝试构建一个导航栏,该导航栏:
到目前为止,我找到了一种可行的方法。但是必须有一种更有效的方法。我有一个隐藏和显示导航栏的功能-当到达顶部时,一个间隔会再次增长。我尝试将它们合并,但始终失败...谢谢!
HTML
<!DOCTYPE html>
<html>
<head>
<title>Test</title>
</head>
<body>
<header id="navbar" class="navbar">
<a href="#home">Home</a>
<a href="#news">News</a>
<a href="#contact">Contact</a>
</header>
</body>
</html>
JavaScript
var prevScrollpos = window.pageYOffset;
var shrinkHeader = 200;
function tellMeAStory() {
}
window.onscroll = function() {
var currentScrollPos = window.pageYOffset;
if (prevScrollpos > currentScrollPos) {
document.getElementById("navbar").style.top = "0";
} else {
document.getElementById("navbar").style.top = "-200px";
$('.navbar').addClass('shrink');
}
prevScrollpos = currentScrollPos;
}
setInterval(function(){
var scroll = getCurrentScroll();
if (scroll < 10){
$('.navbar').removeClass('shrink');
} else {}
},250)
function getCurrentScroll() {
return window.pageYOffset || document.documentElement.scrollTop;
};
CSS
body {
margin: 0;
background-color: #f1f1f1;
font-family: Arial, Helvetica, sans-serif;
height: 2000px;
}
header {
background-color: #333;
position: fixed;
top: 0;
width: 100%;
display: block;
transition: all 0.3s;
height: 200px;
}
.grow{
height: 200px;
}
.shrink{
height: 50px;
}
#navbar a {
float: left;
display: block;
color: #f2f2f2;
text-align: center;
padding: 15px;
text-decoration: none;
font-size: 17px;
}
#navbar a:hover {
background-color: #ddd;
color: black;
}
JSFiddle
答案 0 :(得分:0)
合并它们并不难。我建议做这样的事情:
var prevScrollpos = window.pageYOffset;
var shrinkHeader = 200;
window.onscroll = function() {
var currentScrollPos = window.pageYOffset;
if (currentScrollPos < 10){
$('.navbar').removeClass('shrink');
}
else if (prevScrollpos > currentScrollPos) {
document.getElementById("navbar").style.top = "0";
} else {
document.getElementById("navbar").style.top = "-200px";
$('.navbar').addClass('shrink');
}
prevScrollpos = currentScrollPos;
}
function getCurrentScroll() {
return window.pageYOffset || document.documentElement.scrollTop;
};
您还可以跟踪上一次操作,如果相同,则不要对厄运进行任何操作(这样会更快)。
使用类代替内联样式也是一种好习惯。您可能要考虑使用用于显示/隐藏栏的类。您可能只有3个类,不需要内联样式:
答案 1 :(得分:0)
这是我要做的一些改进:
setInterval
函数。
var prevScrollpos = getCurrentScroll();
var shrinkHeader = 200;
var ticking = false;
// Cache it so you don't have to get it on every scroll event
var navbar = document.getElementById('navbar');
window.addEventListener('scroll', function() {
var currentScrollPos = getCurrentScroll();
if (!ticking) {
window.requestAnimationFrame(function() {
if (prevScrollpos > currentScrollPos) {
navbar.style.top = '0';
} else {
navbar.style.top = '-200px';
navbar.classList.add('shrink');
}
if (currentScrollPos < 10) {
navbar.classList.remove('shrink');
}
prevScrollpos = currentScrollPos;
ticking = false;
});
ticking = true;
}
});
function getCurrentScroll() {
return window.pageYOffset || document.documentElement.scrollTop;
};
body {
margin: 0;
background-color: #f1f1f1;
font-family: Arial, Helvetica, sans-serif;
height: 2000px;
}
header {
background-color: #333;
position: fixed;
top: 0;
width: 100%;
display: block;
transition: all 0.3s;
height: 200px;
}
.grow {
height: 200px;
}
.shrink {
height: 50px;
}
#navbar a {
float: left;
display: block;
color: #f2f2f2;
text-align: center;
padding: 15px;
text-decoration: none;
font-size: 17px;
}
#navbar a:hover {
background-color: #ddd;
color: black;
}
<header id="navbar" class="navbar">
<a href="#start">Start</a>
<a href="#one">One</a>
<a href="#two">Two</a>
</header>