diff --git a/themes/hexo/components/FloatDarkModeButton.js b/themes/hexo/components/ButtonFloatDarkMode.js
similarity index 70%
rename from themes/hexo/components/FloatDarkModeButton.js
rename to themes/hexo/components/ButtonFloatDarkMode.js
index 6a7fb97e..6737020b 100644
--- a/themes/hexo/components/FloatDarkModeButton.js
+++ b/themes/hexo/components/ButtonFloatDarkMode.js
@@ -1,9 +1,12 @@
+import { siteConfig } from '@/lib/config'
import { useGlobal } from '@/lib/global'
import { saveDarkModeToLocalStorage } from '@/themes/theme'
import CONFIG from '../config'
-import { siteConfig } from '@/lib/config'
-export default function FloatDarkModeButton () {
+/**
+ * 深色模式按钮
+ */
+export default function ButtonDarkModeFloat() {
const { isDarkMode, updateDarkMode } = useGlobal()
if (!siteConfig('HEXO_WIDGET_DARK_MODE', null, CONFIG)) {
@@ -23,10 +26,13 @@ export default function FloatDarkModeButton () {
return (
-
+ className={
+ 'justify-center items-center w-7 h-7 text-center transform hover:scale-105 duration-200'
+ }>
+
)
}
diff --git a/themes/hexo/components/JumpToCommentButton.js b/themes/hexo/components/ButtonJumpToComment.js
similarity index 55%
rename from themes/hexo/components/JumpToCommentButton.js
rename to themes/hexo/components/ButtonJumpToComment.js
index 60f1d1e9..6a5b55a6 100644
--- a/themes/hexo/components/JumpToCommentButton.js
+++ b/themes/hexo/components/ButtonJumpToComment.js
@@ -1,19 +1,22 @@
-import CONFIG from '../config'
import { siteConfig } from '@/lib/config'
+import CONFIG from '../config'
/**
* 跳转到评论区
* @returns {JSX.Element}
* @constructor
*/
-const JumpToCommentButton = () => {
+const ButtonJumpToComment = () => {
if (!siteConfig('HEXO_WIDGET_TO_COMMENT', null, CONFIG)) {
return <>>
}
function navToComment() {
if (document.getElementById('comment')) {
- window.scrollTo({ top: document.getElementById('comment').offsetTop, behavior: 'smooth' })
+ window.scrollTo({
+ top: document.getElementById('comment').offsetTop,
+ behavior: 'smooth'
+ })
}
// 兼容性不好
// const commentElement = document.getElementById('comment')
@@ -21,9 +24,13 @@ const JumpToCommentButton = () => {
// commentElement?.scrollIntoView({ behavior: 'smooth', block: 'start', inline: 'nearest' })
}
- return (
-
-
)
+ return (
+
+
+
+ )
}
-export default JumpToCommentButton
+export default ButtonJumpToComment
diff --git a/themes/hexo/components/JumpToTopButton.js b/themes/hexo/components/ButtonJumpToTop.js
similarity index 89%
rename from themes/hexo/components/JumpToTopButton.js
rename to themes/hexo/components/ButtonJumpToTop.js
index 9a2b9712..23ee05d8 100644
--- a/themes/hexo/components/JumpToTopButton.js
+++ b/themes/hexo/components/ButtonJumpToTop.js
@@ -1,6 +1,6 @@
+import { siteConfig } from '@/lib/config'
import { useGlobal } from '@/lib/global'
import CONFIG from '../config'
-import { siteConfig } from '@/lib/config'
/**
* 跳转到网页顶部
@@ -10,7 +10,7 @@ import { siteConfig } from '@/lib/config'
* @returns {JSX.Element}
* @constructor
*/
-const JumpToTopButton = ({ showPercent = true, percent }) => {
+const ButtonJumpToTop = ({ showPercent = true, percent }) => {
const { locale } = useGlobal()
if (!siteConfig('HEXO_WIDGET_TO_TOP', null, CONFIG)) {
@@ -22,4 +22,4 @@ const JumpToTopButton = ({ showPercent = true, percent }) => {
)
}
-export default JumpToTopButton
+export default ButtonJumpToTop
diff --git a/themes/hexo/components/ButtonRandomPost.js b/themes/hexo/components/ButtonRandomPost.js
new file mode 100644
index 00000000..a43f8509
--- /dev/null
+++ b/themes/hexo/components/ButtonRandomPost.js
@@ -0,0 +1,29 @@
+import { siteConfig } from '@/lib/config'
+import { useGlobal } from '@/lib/global'
+import { useRouter } from 'next/router'
+
+/**
+ * 随机跳转到一个文章
+ */
+export default function ButtonRandomPost(props) {
+ const { latestPosts } = props
+ const router = useRouter()
+ const { locale } = useGlobal()
+ /**
+ * 随机跳转文章
+ */
+ function handleClick() {
+ const randomIndex = Math.floor(Math.random() * latestPosts.length)
+ const randomPost = latestPosts[randomIndex]
+ router.push(`${siteConfig('SUB_PATH', '')}/${randomPost?.slug}`)
+ }
+
+ return (
+
+
+
+ )
+}
diff --git a/themes/hexo/components/ButtonRandomPostMini.js b/themes/hexo/components/ButtonRandomPostMini.js
new file mode 100644
index 00000000..98eadeb1
--- /dev/null
+++ b/themes/hexo/components/ButtonRandomPostMini.js
@@ -0,0 +1,29 @@
+import { siteConfig } from '@/lib/config'
+import { useGlobal } from '@/lib/global'
+import { useRouter } from 'next/router'
+
+/**
+ * 随机跳转到一个文章
+ */
+export default function ButtonRandomPostMini(props) {
+ const { latestPosts } = props
+ const router = useRouter()
+ const { locale } = useGlobal()
+ /**
+ * 随机跳转文章
+ */
+ function handleClick() {
+ const randomIndex = Math.floor(Math.random() * latestPosts.length)
+ const randomPost = latestPosts[randomIndex]
+ router.push(`${siteConfig('SUB_PATH', '')}/${randomPost?.slug}`)
+ }
+
+ return (
+
+
+
+ )
+}
diff --git a/themes/hexo/components/Header.js b/themes/hexo/components/Header.js
index 9c3da194..29a83d71 100644
--- a/themes/hexo/components/Header.js
+++ b/themes/hexo/components/Header.js
@@ -5,6 +5,7 @@ import Link from 'next/link'
import { useRouter } from 'next/router'
import { useCallback, useEffect, useRef, useState } from 'react'
import CONFIG from '../config'
+import ButtonRandomPost from './ButtonRandomPost'
import CategoryGroup from './CategoryGroup'
import Logo from './Logo'
import { MenuListTop } from './MenuListTop'
@@ -28,6 +29,7 @@ const Header = props => {
const router = useRouter()
const [isOpen, changeShow] = useState(false)
const showSearchButton = siteConfig('HEXO_MENU_SEARCH', false, CONFIG)
+ const showRandomButton = siteConfig('HEXO_MENU_RANDOM', false, CONFIG)
const toggleMenuOpen = () => {
changeShow(!isOpen)
@@ -172,6 +174,7 @@ const Header = props => {
)}
{showSearchButton && }
+ {showRandomButton && }
diff --git a/themes/hexo/components/RightFloatArea.js b/themes/hexo/components/RightFloatArea.js
index d7fadce5..162081b2 100644
--- a/themes/hexo/components/RightFloatArea.js
+++ b/themes/hexo/components/RightFloatArea.js
@@ -1,7 +1,7 @@
import throttle from 'lodash.throttle'
import { useCallback, useEffect, useState } from 'react'
-import FloatDarkModeButton from './FloatDarkModeButton'
-import JumpToTopButton from './JumpToTopButton'
+import ButtonDarkModeFloat from './ButtonFloatDarkMode'
+import ButtonJumpToTop from './ButtonJumpToTop'
/**
* 悬浮在右下角的按钮,当页面向下滚动100px时会出现
@@ -10,20 +10,22 @@ import JumpToTopButton from './JumpToTopButton'
*/
export default function RightFloatArea({ floatSlot }) {
const [showFloatButton, switchShow] = useState(false)
- const scrollListener = useCallback(throttle(() => {
- const targetRef = document.getElementById('wrapper')
- const clientHeight = targetRef?.clientHeight
- 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
+ const scrollListener = useCallback(
+ throttle(() => {
+ const targetRef = document.getElementById('wrapper')
+ const clientHeight = targetRef?.clientHeight
+ 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
- // 右下角显示悬浮按钮
- if (shouldShow !== showFloatButton) {
- switchShow(shouldShow)
- }
- }, 200))
+ // 右下角显示悬浮按钮
+ if (shouldShow !== showFloatButton) {
+ switchShow(shouldShow)
+ }
+ }, 200)
+ )
useEffect(() => {
document.addEventListener('scroll', scrollListener)
@@ -31,12 +33,17 @@ export default function RightFloatArea({ floatSlot }) {
}, [])
return (
-
+
)
}
diff --git a/themes/hexo/config.js b/themes/hexo/config.js
index dddfbe83..024c12e0 100644
--- a/themes/hexo/config.js
+++ b/themes/hexo/config.js
@@ -1,7 +1,12 @@
const CONFIG = {
HEXO_HOME_BANNER_ENABLE: true,
// 3.14.1以后的版本中,欢迎语在blog.config.js中配置,用英文逗号','隔开多个。
- HEXO_HOME_BANNER_GREETINGS: ['Hi,我是一个程序员', 'Hi,我是一个打工人', 'Hi,我是一个干饭人', '欢迎来到我的博客🎉'], // 首页大图标语文字
+ HEXO_HOME_BANNER_GREETINGS: [
+ 'Hi,我是一个程序员',
+ 'Hi,我是一个打工人',
+ 'Hi,我是一个干饭人',
+ '欢迎来到我的博客🎉'
+ ], // 首页大图标语文字
HEXO_HOME_NAV_BUTTONS: true, // 首页是否显示分类大图标按钮
// 已知未修复bug, 在移动端开启true后会加载不出图片; 暂时建议设置为false。
@@ -15,6 +20,7 @@ const CONFIG = {
HEXO_MENU_TAG: true, // 显示标签
HEXO_MENU_ARCHIVE: true, // 显示归档
HEXO_MENU_SEARCH: true, // 显示搜索
+ HEXO_MENU_RANDOM: true, // 显示随机跳转按钮
HEXO_POST_LIST_COVER: true, // 列表显示文章封面
HEXO_POST_LIST_COVER_HOVER_ENLARGE: false, // 列表鼠标悬停放大
diff --git a/themes/hexo/index.js b/themes/hexo/index.js
index 8dd08ec9..4988dad9 100644
--- a/themes/hexo/index.js
+++ b/themes/hexo/index.js
@@ -17,11 +17,12 @@ import ArticleRecommend from './components/ArticleRecommend'
import BlogPostArchive from './components/BlogPostArchive'
import BlogPostListPage from './components/BlogPostListPage'
import BlogPostListScroll from './components/BlogPostListScroll'
+import ButtonJumpToComment from './components/ButtonJumpToComment'
+import ButtonRandomPostMini from './components/ButtonRandomPostMini'
import Card from './components/Card'
import Footer from './components/Footer'
import Header from './components/Header'
import Hero from './components/Hero'
-import JumpToCommentButton from './components/JumpToCommentButton'
import PostHero from './components/PostHero'
import RightFloatArea from './components/RightFloatArea'
import SearchNav from './components/SearchNav'
@@ -51,8 +52,9 @@ export const useHexoGlobal = () => useContext(ThemeGlobalHexo)
const LayoutBase = props => {
const { post, children, slotTop, className } = props
const { onLoading, fullWidth } = useGlobal()
-
const router = useRouter()
+ const showRandomButton = siteConfig('HEXO_MENU_RANDOM', false, CONFIG)
+
const headerSlot = post ? (
) : router.route === '/' &&
@@ -63,6 +65,7 @@ const LayoutBase = props => {
const drawerRight = useRef(null)
const tocRef = isBrowser ? document.getElementById('article-wrapper') : null
+ // 悬浮按钮内容
const floatSlot = (
<>
{post?.toc?.length > 1 && (
@@ -74,7 +77,8 @@ const LayoutBase = props => {
/>
)}
- {post && }
+ {post && }
+ {showRandomButton && }
>
)