클래스명에 '
.clicked_nav
' 라는 단어가 더해지면, 클릭한 해당 메뉴에 검정 밑줄이 생긴다!
li
메뉴가 클릭되면 모든 메뉴에 붙인 ref
를 순회하여, 해당 메뉴 클래스명 뒤에 .clicked_nav
라는 단어가 붙은 클래스명 찾아 .clicked_nav
제거 .clicked_nav
라는 단어를 추가switch ~ case
를 활용하여, 클릭한 해당 메뉴의 영역에 따른 스크롤 이동for
문에서 forEach
문을 사용해 보았다. // clicked nav menu - border-bottom & scroll move method
const changeNavItem = (e) => {
// 클릭한 메뉴 밑줄 처리를 위한 ref 리스트
const navRefList = [classIntroduceRef, classReviewRef, classCurriculumRef, classCommunityRef, refundPolicyRef]
// 각 메뉴 항목의 스크롤 이동 기준
const introOffsetTop = document.querySelector('.class_info_box').offsetTop
const reviewOffsetTop = document.querySelector('.review_header').offsetTop
const curriculumOffsetTop = document.querySelector('.curriculum_box').offsetTop
const communityOffsetTop = document.querySelector('.class_community').offsetTop
const refundOffsetTop = document.querySelector('.refund_policy_box').offsetTop
// ref로 전체 nav 메뉴 밑줄 처리 초기화
for ( let i = 0 ; i < navRefList.length ; i++ ) {
if (navRefList[i].current.classList.value.split(' ')[1] === 'clicked_nav' )
navRefList[i].current.classList.remove('clicked_nav')
}
// 클릭한 nav 메뉴만 밑줄 처리
e.target.classList.add('clicked_nav')
// 클릭한 해당 nav 메뉴로 스크롤 이동
switch (e.target.classList.value.split(' ')[0]) {
// 클릭한 nav 메뉴가 '리뷰'일 경우
case 'class_review_nav' :
if (e.target.offsetParent.classList.contains('fixed')) {
window.scrollTo({ top: reviewOffsetTop - 52, behavior: 'smooth' })
} else {
window.scrollTo({ top: reviewOffsetTop - 200, behavior: 'smooth' })
}
break;
// 클릭한 nav 메뉴가 '커리큘럼'일 경우
case 'class_curriculum_nav' :
if (e.target.offsetParent.classList.contains('fixed')) {
window.scrollTo({ top: curriculumOffsetTop - 52, behavior: 'smooth' })
} else {
window.scrollTo({ top: curriculumOffsetTop - 200, behavior: 'smooth' })
}
break;
// 클릭한 nav 메뉴가 '커뮤니티'일 경우
case 'class_cummunity_nav' :
if (e.target.offsetParent.classList.contains('fixed')) {
window.scrollTo({ top: communityOffsetTop - 52, behavior: 'smooth' })
} else {
window.scrollTo({ top: communityOffsetTop - 200, behavior: 'smooth' })
}
break;
// 클릭한 nav 메뉴가 '환불정책'일 경우
case 'refund_policy_nav' :
if (e.target.offsetParent.classList.contains('fixed')) {
window.scrollTo({ top: refundOffsetTop - 52, behavior: 'smooth' })
} else {
window.scrollTo({ top: refundOffsetTop - 200, behavior: 'smooth' })
}
break;
// nav 메뉴 기본값 '강의 소개'를 클릭했을 경우
default :
if (e.target.offsetParent.classList.contains('fixed')) {
window.scrollTo({ top: introOffsetTop - 52, behavior: 'smooth' })
} else {
window.scrollTo({ top: introOffsetTop - 200, behavior: 'smooth' })
}
}
}
// clicked nav menu - border-bottom & scroll move method
const changeNavItem = (e) => {
// 클릭한 메뉴 밑줄 처리를 위한 ref 리스트
const navRefList = [classIntroduceRef, classReviewRef, classCurriculumRef, classCommunityRef, refundPolicyRef]
// 각 메뉴 항목의 스크롤 이동 기준
const introOffsetTop = document.querySelector('.class_info_box').offsetTop
const reviewOffsetTop = document.querySelector('.review_header').offsetTop
const curriculumOffsetTop = document.querySelector('.curriculum_box').offsetTop
const communityOffsetTop = document.querySelector('.class_community').offsetTop
const refundOffsetTop = document.querySelector('.refund_policy_box').offsetTop
// ref로 전체 nav 메뉴 밑줄 처리 초기화
navRefList.forEach(ref => {
if (ref.current.classList.value.split(' ')[1] === 'clicked_nav' )
ref.current.classList.remove('clicked_nav')
})
// 클릭한 nav 메뉴만 밑줄 처리
e.target.classList.add('clicked_nav')
// 클릭한 해당 nav 메뉴의 클래스명을 판별하는 메서드
switch (e.target.classList.value.split(' ')[0]) {
// 클릭한 nav 메뉴가 '리뷰'일 경우
case 'class_review_nav' :
e.target.offsetParent.classList.contains('fixed') ?
clickedNavScroll(reviewOffsetTop, 52)
: clickedNavScroll(reviewOffsetTop, 200)
break;
// 클릭한 nav 메뉴가 '커리큘럼'일 경우
case 'class_curriculum_nav' :
e.target.offsetParent.classList.contains('fixed') ?
clickedNavScroll(curriculumOffsetTop, 52)
: clickedNavScroll(curriculumOffsetTop, 200)
break;
// 클릭한 nav 메뉴가 '커뮤니티'일 경우
case 'class_cummunity_nav' :
e.target.offsetParent.classList.contains('fixed') ?
clickedNavScroll(communityOffsetTop, 52)
: clickedNavScroll(communityOffsetTop, 200)
break;
// 클릭한 nav 메뉴가 '환불정책'일 경우
case 'refund_policy_nav' :
e.target.offsetParent.classList.contains('fixed') ?
clickedNavScroll(refundOffsetTop, 52)
: clickedNavScroll(refundOffsetTop, 200)
break;
// nav 메뉴 기본값 '강의 소개'를 클릭했을 경우
default :
e.target.offsetParent.classList.contains('fixed') ?
clickedNavScroll(introOffsetTop, 52)
: clickedNavScroll(introOffsetTop, 200)
}
}
// 클릭한 메뉴로 스크롤 이동 메서드
const clickedNavScroll = (offset, num) => {
return window.scrollTo({ top: `${offset}` - `${num}`, behavior: 'smooth' })
}
// clicked nav menu - border-bottom & scroll move method
const changeNavItem = (e) => {
// 클릭한 메뉴 밑줄 처리를 위한 ref 리스트
const navRefList = [classIntroduceRef, classReviewRef, classCurriculumRef, classCommunityRef, refundPolicyRef]
// nav 안의 메뉴를 ref로 순회하여, 전체 nav 메뉴 밑줄 처리 초기화
navRefList.forEach(ref => {
if (ref.current.classList.value.includes('clicked_nav'))
ref.current.classList.remove('clicked_nav')
})
// 클릭한 nav 메뉴만 밑줄 처리
e.target.classList.add('clicked_nav')
// nav 고정 여부에 따라 달라지는 스크롤 이동 처리
e.target.offsetParent.classList.contains('fixed') ?
clickedNavScroll(moveToOffsetTop(e), 52) : clickedNavScroll(moveToOffsetTop(e), 200)
}
// 각 nav 메뉴 위치에 따른 offsetTop을 return하는 메서드
const moveToOffsetTop = (e) => {
// 각 메뉴 항목의 스크롤 이동 기준
const introOffsetTop = document.querySelector('.class_info_box').offsetTop
const reviewOffsetTop = document.querySelector('.review_header').offsetTop
const curriculumOffsetTop = document.querySelector('.curriculum_box').offsetTop
const communityOffsetTop = document.querySelector('.class_community').offsetTop
const refundOffsetTop = document.querySelector('.refund_policy_box').offsetTop
switch (e.target.classList.value.split(' ')[0]) {
// 클릭한 nav 메뉴가 '리뷰'일 경우
case 'class_review_nav' :
return reviewOffsetTop
// 클릭한 nav 메뉴가 '커리큘럼'일 경우
case 'class_curriculum_nav' :
return curriculumOffsetTop
// 클릭한 nav 메뉴가 '커뮤니티'일 경우
case 'class_cummunity_nav' :
return communityOffsetTop
// 클릭한 nav 메뉴가 '환불정책'일 경우
case 'refund_policy_nav' :
return refundOffsetTop
// nav 메뉴 기본값 '강의 소개'를 클릭했을 경우
default :
return introOffsetTop
}
}
// 클릭한 메뉴로 스크롤 이동 메서드
const clickedNavScroll = (offset, num) => {
return window.scrollTo({ top: `${offset}` - `${num}`, behavior: 'smooth' })
}
const navStringList = ['classIntroduceRef', 'classReviewRef', 'classCurriculumRef', 'classCommunityRef', 'refundPolicyRef'];
console.log(typeof navStringList);
// string
const navRefList = [classIntroduceRef, classReviewRef, classCurriculumRef, classCommunityRef, refundPolicyRef];
console.log(typeof navRefList);
// object
사고방식을 전환하여 줄이는 방법을 택해 보자. 아자아자 빠이팅🔥