$(function () { /* ========================================== 1. 데이터 및 공통 변수 설정 ========================================= */ const subMenuData = { about: { title: '회사소개', items: [ { text: '소개', link: '/company/about.html' }, { text: '연혁', link: '/company/history.html' }, // { text: '오시는길', link: '/company/location.html' } ] }, product: { title: '제품소개', items: [ { text: 'WISIGHT', id: 'core', link: '/product/view.html' } // { text: '확장 모듈', id: 'extension', link: '/product/view.html?type=extension' }, // { text: '부가 서비스', id: 'additional', link: '/product/view.html?type=additional' }, // { text: '기술 서비스', id: 'construction', link: '/product/view.html?type=construction' } ] }, casestudy: { title: '고객사례', items: [ { text: '산업군별', link: '/case/study.html' } ] }, customer: { title: '고객지원', items: [ { text: '문의', link: '/customer/contact.html' }, { text: 'FAQ', link: '/customer/faq.html' } ] } }; const $header = $('#header'), $headerWrapper = $('.header-wrapper'), $subWrapper = $('.sub-menu-wrapper'), $subContainer = $('.sub-menu-container'), $sideMenuWrapper = $('.side-menu-wrapper'), $sideMenuInner = $('.side-menu'), $dimmed = $('.side-menu-dimmed'), $productMain = $('.product-main'), $topBtn = $('.main .top-btn, .sub > div .top-btn'); let allProductItems = []; /* ========================================== 2. 스크롤 이벤트 (헤더 제어 & TOP 버튼 푸터 감지) ========================================= */ function initScrollEvents() { let lastScrollTop = 0; const $footer = $('footer'); // TOP 버튼 초기 숨김 gsap.set($topBtn, { autoAlpha: 0, y: 20 }); $(window).on('scroll', function () { let st = $(this).scrollTop(); let windowHeight = $(window).height(); let documentHeight = $(document).height(); let footerHeight = $footer.length ? $footer.outerHeight() : 0; // 헤더 배경 및 노출 제어 st > 0 ? $headerWrapper.addClass('header-scrolled') : $headerWrapper.removeClass('header-scrolled'); if (Math.abs(lastScrollTop - st) > 5) { if (st > lastScrollTop && st > 80) { $header.addClass('header-hidden').removeClass('is-open'); } else { $header.removeClass('header-hidden'); } lastScrollTop = st; } // TOP 버튼 푸터 영역 감지 로직 let distanceFromBottom = documentHeight - (st + windowHeight); if (st > 300 && distanceFromBottom > footerHeight) { gsap.to($topBtn, { autoAlpha: 1, y: 0, duration: 0.2, overwrite: 'auto' }); } else { gsap.to($topBtn, { autoAlpha: 0, y: 20, duration: 0.1, overwrite: 'auto' }); } }); $topBtn.on('click', (e) => { e.preventDefault(); gsap.to(window, { scrollTo: 0, duration: 0.2, ease: "power2.inOut" }); }); } /* ========================================== 3. GNB 네비게이션 (동적 서브메뉴 & 위치 & 애니메이션) ========================================= */ function initNavigation() { const path = window.location.pathname; const urlParams = new URLSearchParams(window.location.search); const type = urlParams.get('type'); // PC 메인메뉴 마우스 오버 $('.main-menu-item').on('mouseenter', function () { const id = $(this).data('id'); const data = subMenuData[id]?.items; if (data) { $subContainer.empty(); const menuHtml = data.map(m => ` `).join(''); $subContainer.html(menuHtml); // 정확한 시작점 Padding-left 계산 const $targetLink = $(this).find('a'); const targetLeft = $targetLink.offset().left; const parentLeft = $headerWrapper.offset().left; $subContainer.css('padding-left', (targetLeft - parentLeft) + 'px'); // 부드러운 높이 계산 및 적용 const contentHeight = $subContainer.outerHeight(); $subWrapper.css('max-height', contentHeight + 'px'); $header.addClass('is-open'); } }); // 헤더 이탈 시 초기화 $header.on('mouseleave', function() { $header.removeClass('is-open'); $subWrapper.css('max-height', '0px'); setTimeout(() => { if(!$header.hasClass('is-open')) $subContainer.empty(); }, 400); }); // 모바일 사이드 메뉴 구성 let sideHtml = ''; Object.keys(subMenuData).forEach(key => { const menu = subMenuData[key]; sideHtml += `
`; }); $sideMenuInner.html(sideHtml); $('.gnb-btn').on('click', () => { $sideMenuWrapper.addClass('is-active'); $dimmed.stop().fadeIn(); }); $('.close-btn, .side-menu-dimmed').on('click', () => { $sideMenuWrapper.removeClass('is-active'); $dimmed.stop().fadeOut(); }); $(document).off('click', '.side-menu-btn').on('click', '.side-menu-btn', function () { const $this = $(this); $this.toggleClass('is-active').next('.side-menu-submenu').stop().slideToggle(300); $('.side-menu-btn').not($this).removeClass('is-active').next('.side-menu-submenu').stop().slideUp(300); }); // 브레드크럼 자동 설정 if ($('#bc-main').length) { let mainKey = path.includes('company') ? 'about' : path.includes('product') ? 'product' : path.includes('case') ? 'casestudy' : 'customer'; const currentMenu = subMenuData[mainKey]; if (currentMenu) { $('#bc-main .label').text(currentMenu.title); const sub = currentMenu.items.find(i => mainKey === 'product' ? i.id === type : path.includes(i.link.split('/').pop())) || currentMenu.items[0]; $('#bc-sub .label').text(sub.text); if ($('.page-tit').length) $('.page-tit').text(sub.text); $('#bc-main .bc-list').html(Object.keys(subMenuData).map(k => `
  • ${subMenuData[k].title}
  • `).join('')); $('#bc-sub .bc-list').html(currentMenu.items.map(i => `
  • ${i.text}
  • `).join('')); } } $('.bc-btn').on('click', function (e) { e.stopPropagation(); $(this).closest('.bc-item').toggleClass('active').siblings().removeClass('active'); }); } /* ========================================== 6. 초기화 실행 ========================================= */ initScrollEvents(); initNavigation(); $(document).on('click', () => { $('.bc-item').removeClass('active'); $('.select-items').addClass('select-hide'); }); });