스크롤 방향에 따른 네비게이션 보이기, 감추기
2022. 6. 2. 14:53ㆍStudy/JavaScript
HTML
<header>
<div class="container">
<h1><a href="/">Logo</a></h1>
<nav>
<h2 class="hidden">글로벌 네비게이션</h2>
<ul class="nav">
<li><a href="/about"><h3>menu1</h3></a></li>
<li><a href="/shop/main"><h3>menu2</h3></a></li>
<li><a href="/pin/pin_send"><h3>menu3</h3></a></li>
<li><a href="/charge/charge"><h3>menu4</h3></a></li>
<li><a href="javascript:alert('준비중입니다.');"><h3>menu5</h3></a></li>
</ul>
</nav>
</div>
</header>
CSS
/* header */
header{position:fixed; left: 0; top: 0; width: 100%; z-index:99; background:none; transition:top .3s, background .3s;}
header::after{content:''; display:block; position:absolute; left:0; top:0; width:100%; height:100%; z-index:-1; background:linear-gradient(90deg, rgba(0,198,255,1) 55%, rgba(8,228,168,1) 100%); opacity: 0; transition:opacity .3s;}
header.hide{position:fixed; top: -5rem;}
#wrap header.scroll::after{opacity: 1;} /* scroll 일때만 배경 나오게 */
#wrap.sub header::after{opacity: 1;} /* sub에선 항상 배경 나오게 */
JS
// 스크롤 시 헤더
$( function(){
var lastScrollTop = 0;
var delta = 5;
var fixBox = document.querySelector('header');
var fixBoxHeight = fixBox.offsetHeight;
var didScroll;
//스크롤 이벤트
window.onscroll = function() {
didScroll = true;
};
setInterval(function(){ //0.1초마다 스크롤 여부 체크하여 스크롤 중이면 hasScrolled() 호출
if(didScroll){
hasScrolled();
didScroll = false;
}
}, 100);
function hasScrolled(){
let nowScrollTop = window.scrollY;
console.log(nowScrollTop, lastScrollTop);
if(Math.abs(lastScrollTop - nowScrollTop) <= delta){ return; }
if(nowScrollTop > lastScrollTop && nowScrollTop > fixBoxHeight){ //Scroll down
fixBox.classList.add('hide');
}else{
if(nowScrollTop + window.innerHeight < document.body.offsetHeight){ //Scroll up
fixBox.classList.remove('hide');
}
}
lastScrollTop = nowScrollTop;
if( nowScrollTop > 0 ){
fixBox.classList.add('scroll'); // scroll 클래스 일때만 배경 나옴
} else {
fixBox.classList.remove('scroll');
}
}
hasScrolled(); // 초기 1회 실행
});
'Study > JavaScript' 카테고리의 다른 글
수수료 포함한 금액 계산법 /1.1 (0) | 2022.07.21 |
---|---|
javascript url 파라미터 가져오기 (0) | 2022.06.27 |
노드 복제와 템플릿 Node clone, template (0) | 2022.05.30 |
Timer 타이머 (0) | 2022.05.18 |
ES6 배열 내장 함수 (0) | 2022.04.26 |