import BLOG from '@/blog.config' import { useGlobal } from '@/lib/global' import { faAngleDown } from '@fortawesome/free-solid-svg-icons' import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' import { useEffect, useState } from 'react' import Typed from 'typed.js' let wrapperTop = 0 let windowTop = 0 let autoScroll = false /** * * @returns 头图 */ export default function Header () { const [typed, changeType] = useState() useEffect(() => { if (!typed && window && document.getElementById('typed')) { changeType( new Typed('#typed', { strings: BLOG.headerStrings, typeSpeed: 200, backSpeed: 100, backDelay: 400, showCursor: true, smartBackspace: true }) ) } }) const { theme } = useGlobal() const autoScrollEnd = () => { if (autoScroll) { windowTop = window.scrollY autoScroll = false } } const scrollTrigger = () => { if ( (window.scrollY > windowTop) & (window.scrollY < window.innerHeight) & !autoScroll ) { autoScroll = true window.scrollTo({ top: wrapperTop, behavior: 'smooth' }) setTimeout(autoScrollEnd, 500) } if ( (window.scrollY < windowTop) & (window.scrollY < window.innerHeight) & !autoScroll ) { autoScroll = true window.scrollTo({ top: 0, behavior: 'smooth' }) setTimeout(autoScrollEnd, 500) } windowTop = window.scrollY updateTopNav() } const updateTopNav = () => { if (theme !== 'dark') { const stickyNavElement = document.getElementById('sticky-nav') if (window.scrollY < window.innerHeight) { stickyNavElement.classList.add('dark') } else { stickyNavElement.classList.remove('dark') } } } function updateHeaderHeight () { setTimeout(() => { if (window) { const wrapperElement = document.getElementById('wrapper') wrapperTop = wrapperElement.offsetTop } }, 500) } useEffect(() => { updateHeaderHeight() updateTopNav() window.addEventListener('scroll', scrollTrigger) window.addEventListener('resize', updateHeaderHeight) return () => { window.removeEventListener('scroll', scrollTrigger) window.removeEventListener('resize', updateHeaderHeight) } }) return ( ) }