import React, { useEffect, useState } from 'react' import { useGlobal } from '@/lib/global' import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' import { faArrowUp } from '@fortawesome/free-solid-svg-icons' import smoothscroll from 'smoothscroll-polyfill' let windowTop = 0 /** * 跳转到网页顶部 * 当屏幕下滑500像素后会出现该控件 * @param targetRef 关联高度的目标html标签 * @param showPercent 是否显示百分比 * @returns {JSX.Element} * @constructor */ const JumpToTopButton = ({ targetRef, showPercent = true }) => { const { locale } = useGlobal() const [show, switchShow] = useState(false) const [percent, changePercent] = useState(0) const scrollListener = () => { // 处理是否显示回到顶部按钮 const clientHeight = targetRef ? (targetRef.current ? targetRef.current.clientHeight : 0) : 0 const scrollY = window.pageYOffset const fullHeight = clientHeight - window.outerHeight let per = parseFloat(((scrollY / fullHeight * 100)).toFixed(0)) if (per > 100) per = 100 // const shouldShow = scrollY > 100 && per > 0 && scrollY < windowTop const shouldShow = scrollY > 100 && per > 0 windowTop = scrollY if (shouldShow !== show) { switchShow(shouldShow) } changePercent(per) } useEffect(() => { smoothscroll.polyfill() document.addEventListener('scroll', scrollListener) return () => document.removeEventListener('scroll', scrollListener) }, [show]) return (
window.scrollTo({ top: 0, behavior: 'smooth' })} className={(show ? '' : 'hidden') + ' animate__fadeInRight animate__animated animate__faster shadow-card rounded-full glassmorphism py-1 cursor-pointer '}>
{showPercent && (
{percent}
)}
) } export default JumpToTopButton