diff --git a/components/Container.js b/components/Container.js index 948ba596..90af14e8 100644 --- a/components/Container.js +++ b/components/Container.js @@ -1,28 +1,32 @@ import PropTypes from 'prop-types' -import React, { useEffect } from 'react' +import React, { useCallback, useEffect } from 'react' import CommonHead from '@/components/CommonHead' import TopNav from '@/components/TopNav' +import throttle from 'lodash.throttle' const Container = ({ children, layout, fullWidth, tags, meta, ...customMeta }) => { let windowTop = 0 + const scrollTrigger = useCallback(throttle(() => { + const scrollS = window.scrollY + const nav = document.querySelector('#sticky-nav') + const tagsBar = document.querySelector('#tags-bar') + if (scrollS >= windowTop && scrollS > 10) { + nav && nav.classList.add('-mt-16') + tagsBar && tagsBar.classList.add('-mt-32') + windowTop = scrollS + } else { + nav && nav.classList.remove('-mt-16') + tagsBar && tagsBar.classList.remove('-mt-32') + windowTop = scrollS + } + }, 200)) + // 监听滚动 useEffect(() => { - function scrollTrigger () { - const scrollS = window.scrollY - const nav = document.querySelector('#sticky-nav') - const tagsBar = document.querySelector('#tags-bar') - if (scrollS >= windowTop) { - nav && nav.classList.add('-mt-16') - tagsBar && tagsBar.classList.add('-mt-32') - windowTop = scrollS - } else { - nav && nav.classList.remove('-mt-16') - tagsBar && tagsBar.classList.remove('-mt-32') - windowTop = scrollS - } - } - window.addEventListener('scroll', scrollTrigger) + return () => { + window.removeEventListener('scroll', scrollTrigger) + } }) return ( <> diff --git a/components/JumpToTop.js b/components/JumpToTop.js index 77514d1b..8e03cc29 100644 --- a/components/JumpToTop.js +++ b/components/JumpToTop.js @@ -1,4 +1,4 @@ -import React, { useEffect, useState } from 'react' +import React, { useCallback, useEffect, useState } from 'react' import throttle from 'lodash.throttle' import { useLocale } from '@/lib/locale' @@ -8,29 +8,38 @@ import { useLocale } from '@/lib/locale' * @returns {JSX.Element} * @constructor */ -const JumpToTop = () => { +const JumpToTop = ({ targetRef }) => { const locale = useLocale() - const [show, switchShow] = useState(false) + const [percent, changePercent] = useState(0) + const scrollListener = useCallback(throttle(() => { + // 处理是否显示回到顶部按钮 + const scrollY = window.pageYOffset + const fullHeight = targetRef.current.clientHeight - window.outerHeight + const shouldShow = scrollY > 100 + if (shouldShow !== show) { + switchShow(shouldShow) + } + let per = parseFloat(((scrollY / fullHeight * 100)).toFixed(0)) + if (per > 100) per = 100 + changePercent(per) + }, 100)) useEffect(() => { - const scrollListener = throttle(() => { - // 处理是否显示回到顶部按钮 - const shouldShow = window.scrollY > 100 - if (shouldShow !== show) { - switchShow(shouldShow) - } - }, 500) document.addEventListener('scroll', scrollListener) return () => document.removeEventListener('scroll', scrollListener) }, [show]) return (