import { useGlobal } from '@/lib/global' import Link from 'next/link' import { useCallback, useEffect, useRef, useState } from 'react' import CategoryGroup from './CategoryGroup' import Collapse from './Collapse' import Logo from './Logo' import SearchDrawer from './SearchDrawer' import TagGroups from './TagGroups' import MenuButtonGroupTop from './MenuButtonGroupTop' import MenuList from './MenuList' import { useRouter } from 'next/router' import throttle from 'lodash.throttle' let windowTop = 0 /** * 顶部导航 * @param {*} param0 * @returns */ const TopNav = props => { const searchDrawer = useRef() const { tags, currentTag, categories, currentCategory } = props const { locale } = useGlobal() const { isDarkMode } = useGlobal() const router = useRouter() const [isOpen, changeShow] = useState(false) const toggleMenuOpen = () => { changeShow(!isOpen) } // 监听滚动 useEffect(() => { scrollTrigger() window.addEventListener('scroll', scrollTrigger) return () => { window.removeEventListener('scroll', scrollTrigger) } }, []) const throttleMs = 200 const scrollTrigger = useCallback(throttle(() => { const scrollS = window.scrollY const nav = document.querySelector('#sticky-nav') const header = document.querySelector('#header') // 是否将导航栏透明 const navTransparent = (scrollS < document.documentElement.clientHeight - 12 && router.route === '/') || scrollS < 300 // 透明导航条的条件 if (header && navTransparent) { nav && nav.classList.replace('bg-white', 'bg-none') nav && nav.classList.replace('text-black', 'text-white') nav && nav.classList.replace('border', 'border-transparent') nav && nav.classList.replace('drop-shadow-md', 'shadow-none') nav && nav.classList.replace('dark:bg-hexo-black-gray', 'transparent') } else { nav && nav.classList.replace('bg-none', 'bg-white') nav && nav.classList.replace('text-white', 'text-black') nav && nav.classList.replace('border-transparent', 'border') nav && nav.classList.replace('shadow-none', 'drop-shadow-md') nav && nav.classList.replace('transparent', 'dark:bg-hexo-black-gray') } const showNav = scrollS <= windowTop || scrollS < 5 || (header && scrollS <= header.clientHeight * 2)// 非首页无大图时影藏顶部 滚动条置顶时隐藏 if (!showNav) { nav && nav.classList.replace('top-0', '-top-20') windowTop = scrollS } else { nav && nav.classList.replace('-top-20', 'top-0') windowTop = scrollS } navDarkMode() }, throttleMs) ) const navDarkMode = () => { const nav = document.getElementById('sticky-nav') const header = document.querySelector('#header') if (!isDarkMode && nav && header) { if (window.scrollY < header.clientHeight) { nav?.classList?.add('dark') } else { nav?.classList?.remove('dark') } } } const searchDrawerSlot = <> {categories && (
{locale.COMMON.CATEGORY}
{locale.COMMON.MORE}
)} {tags && (
{locale.COMMON.TAGS}
{locale.COMMON.MORE}
)} return (
{/* 导航栏 */}
) } export default TopNav