diff --git a/components/Header.js b/components/Header.js
index 23c0bba2..bbc8ee1d 100644
--- a/components/Header.js
+++ b/components/Header.js
@@ -1,7 +1,6 @@
import { useGlobal } from '@/lib/global'
import { faArrowDown } from '@fortawesome/free-solid-svg-icons'
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
-import throttle from 'lodash.throttle'
import { useCallback, useEffect, useState } from 'react'
import Typed from 'typed.js'
@@ -23,23 +22,32 @@ export default function Header () {
}))
}
})
- const scrollToCenter = () => {
- document.getElementById('wrapper').scrollIntoView({ behavior: 'smooth' })
- }
-
const { theme } = useGlobal()
// 监听滚动
let windowTop = 0
- const scrollTrigger = useCallback(throttle(() => {
- if (window.scrollY > windowTop & window.scrollY < window.innerHeight) {
- scrollToCenter()
+ let autoScroll = false
+
+ const autoScrollEnd = () => {
+ windowTop = window.scrollY
+ autoScroll = false
+ console.log('滚动结束回调', windowTop)
+ }
+ const scrollTrigger = useCallback(() => {
+ console.log('触发 top', windowTop, 'y', window.scrollY, autoScroll)
+ if (window.scrollY > windowTop & window.scrollY < window.innerHeight & !autoScroll) {
+ // console.log('滚中间', windowTop, window.scrollY, window.innerHeight)
+ autoScroll = true
+ scrollTo(window.innerHeight, autoScrollEnd)
}
- if (window.scrollY < windowTop & window.scrollY < window.innerHeight) {
- window.scroll({ top: 0, behavior: 'smooth' })
+ if (window.scrollY < windowTop & window.scrollY < window.innerHeight & !autoScroll) {
+ // console.log('滚上', windowTop, window.scrollY, window.innerHeight)
+ autoScroll = true
+ scrollTo(0, autoScrollEnd)
}
windowTop = window.scrollY
+
updateTopNav()
- }, 500))
+ })
const updateTopNav = () => {
if (theme !== 'dark') {
@@ -65,7 +73,7 @@ export default function Header () {
-
+
{ scrollTo(window.innerHeight, autoScrollEnd) }} className='cursor-pointer w-full text-center text-2xl animate-bounce absolute bottom-10 text-white'>
}
+
+/**
+ * Native scrollTo with callback
+ * @param offset - offset to scroll to
+ * @param callback - callback function
+ */
+function scrollTo (offset, callback) {
+ const fixedOffset = offset.toFixed()
+ const onScroll = function () {
+ if (window.pageYOffset.toFixed() === fixedOffset) {
+ window.removeEventListener('scroll', onScroll)
+ callback()
+ }
+ }
+
+ window.addEventListener('scroll', onScroll)
+ onScroll()
+ window.scrollTo({
+ top: offset,
+ behavior: 'smooth'
+ })
+}
diff --git a/components/SideAreaRight.js b/components/SideAreaRight.js
index 5cb5a387..a3bc507d 100644
--- a/components/SideAreaRight.js
+++ b/components/SideAreaRight.js
@@ -74,7 +74,7 @@ const SideAreaRight = ({
-
+
{showToc && (
diff --git a/layouts/BaseLayout.js b/layouts/BaseLayout.js
index 0efc1bfb..b73d0c80 100644
--- a/layouts/BaseLayout.js
+++ b/layouts/BaseLayout.js
@@ -1,6 +1,7 @@
import CommonHead from '@/components/CommonHead'
import FloatDarkModeButton from '@/components/FloatDarkModeButton'
import Footer from '@/components/Footer'
+import Header from '@/components/Header'
import JumpToBottomButton from '@/components/JumpToBottomButton'
import JumpToTopButton from '@/components/JumpToTopButton'
import LoadingCover from '@/components/LoadingCover'
@@ -8,10 +9,9 @@ import SideAreaRight from '@/components/SideAreaRight'
import TopNav from '@/components/TopNav'
import { useGlobal } from '@/lib/global'
import throttle from 'lodash.throttle'
+import { useRouter } from 'next/router'
import PropTypes from 'prop-types'
import React, { useCallback, useEffect, useRef } from 'react'
-import { useRouter } from 'next/router'
-import Header from '@/components/Header'
/**
* 基础布局 采用左右两侧布局,移动端使用顶部导航栏
* @param children
@@ -77,7 +77,7 @@ const BaseLayout = ({
{/* 首页头图 */}
{router.asPath === '/' &&
}
-