import SideBarDrawer from '@/components/SideBarDrawer' import { siteConfig } from '@/lib/config' import { useGlobal } from '@/lib/global' import throttle from 'lodash.throttle' import Link from 'next/link' import { useRouter } from 'next/router' import { useCallback, useEffect, useRef, useState } from 'react' import CONFIG from '../config' import CategoryGroup from './CategoryGroup' import Logo from './Logo' import { MenuListTop } from './MenuListTop' import SearchButton from './SearchButton' import SearchDrawer from './SearchDrawer' import SideBar from './SideBar' import TagGroups from './TagGroups' let windowTop = 0 /** * 顶部导航(页头) * @param {*} param0 * @returns */ const Header = props => { const { tags, currentTag, categories, currentCategory } = props const { locale } = useGlobal() const searchDrawer = useRef() const { isDarkMode } = useGlobal() const throttleMs = 200 const showSearchButton = siteConfig('MATERY_MENU_SEARCH', false, CONFIG) const router = useRouter() const scrollTrigger = useCallback( throttle(() => { requestAnimationFrame(() => { const scrollS = window.scrollY const nav = document.querySelector('#sticky-nav') const header = document.querySelector('#header') const showNav = scrollS <= windowTop || scrollS < 5 || (header && scrollS <= header.clientHeight * 2) // 非首页无大图时影藏顶部 滚动条置顶时隐藏// 非首页无大图时影藏顶部 滚动条置顶时隐藏 // 是否将导航栏透明 const navTransparent = header && scrollS < 300 // 透明导航条的条件 if (navTransparent) { nav && nav.classList.replace('bg-indigo-700', 'bg-none') nav && nav.classList.replace('text-black', 'text-white') nav && nav.classList.replace('shadow-xl', 'shadow-none') nav && nav.classList.replace('dark:bg-hexo-black-gray', 'transparent') } else { nav && nav.classList.replace('bg-none', 'bg-indigo-700') nav && nav.classList.replace('text-white', 'text-black') nav && nav.classList.replace('shadow-none', 'shadow-xl') nav && nav.classList.replace('transparent', 'dark:bg-hexo-black-gray') } 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') } } } // 监听滚动 useEffect(() => { scrollTrigger() window.addEventListener('scroll', scrollTrigger) return () => { window.removeEventListener('scroll', scrollTrigger) } }, [router]) const [isOpen, changeShow] = useState(false) const toggleMenuOpen = () => { changeShow(!isOpen) } const toggleMenuClose = () => { changeShow(false) } const searchDrawerSlot = ( <> {categories && (
{locale.COMMON.CATEGORY}
{locale.COMMON.MORE}
)} {tags && (
{locale.COMMON.TAGS}
{locale.COMMON.MORE}
)} ) return (
{/* 导航栏 */}
) } export default Header