$(function () { AOS.init({ duration: 800, }); const lenis = new Lenis(); gsap.registerPlugin(ScrollTrigger, SplitText); // Lenis 与 GSAP ScrollTrigger 同步(保证触发点准确) lenis.on('scroll', ScrollTrigger.update); gsap.ticker.add((time) => { lenis.raf(time * 1000); }); gsap.ticker.lagSmoothing(0); const $header = $('.site-header'); // 任意带 data-header-dark 的区块:滚入「顶贴视口上沿」区间时顶栏加 .dark(与具体 class 解耦) const $targets = $('[data-header-dark]'); const active = new Set(); const setHeaderDark = () => { $header.toggleClass('dark', active.size > 0); }; $targets.each(function () { const el = this; ScrollTrigger.create({ trigger: el, start: 'top top', end: 'bottom top', onEnter: () => { active.add(el); setHeaderDark(); }, onEnterBack: () => { active.add(el); setHeaderDark(); }, onLeave: () => { active.delete(el); setHeaderDark(); }, onLeaveBack: () => { active.delete(el); setHeaderDark(); }, }); }); ScrollTrigger.refresh(); /* 在768px以下时,navbar-collapse增加class glass-card*/ // 初始化 if ($(window).width() <= 768) { $('#navbarCollapse').addClass('glass-card'); } $(window).on('resize', function () { if ($(window).width() <= 768) { $('#navbarCollapse').addClass('glass-card'); } else { $('#navbarCollapse').removeClass('glass-card'); } }); // mask:遮罩渐显(CSS)+ SplitText 按行从上向下错开出现 const maskEl = document.querySelector('.mask'); const maskContentEl = document.querySelector('.mask-content'); const $maskToggles = $('.site-header__icon-btn.toggle, .mask-header__icon-btn.toggle'); function setMaskOpenUi(isOpen) { $('body').toggleClass('is-mask-open', isOpen); $maskToggles.attr('aria-expanded', isOpen ? 'true' : 'false'); $maskToggles.attr('aria-label', isOpen ? '关闭导航菜单' : '打开导航菜单'); } $('.site-header__icon-btn.toggle').on('click', function () { if (!maskEl || !maskContentEl) return; const nodes = maskContentEl.querySelectorAll('h4, a'); $(maskEl).addClass('show mask--nav-motion'); $('body').css('overflow', 'hidden'); setMaskOpenUi(true); gsap.killTweensOf(nodes); gsap.from(nodes, { opacity: 0, stagger: 0.02, delay: 0.35, overwrite: 'auto', onComplete: function () { maskEl.classList.remove('mask--nav-motion'); gsap.set(nodes, { clearProps: 'opacity' }); }, }); }); $('.mask-header__icon-btn.toggle').on('click', function () { if (!maskEl || !maskContentEl) return; gsap.killTweensOf(maskContentEl.querySelectorAll('h4, a')); $(maskEl).removeClass('show mask--nav-motion'); $('body').css('overflow', 'auto'); setMaskOpenUi(false); }); });