From 886bc464d155517959a171f83d9b7bdfce4f1e4b Mon Sep 17 00:00:00 2001 From: rbetree Date: Mon, 27 Oct 2025 14:52:32 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E'=E5=88=86=E7=B1=BB?= =?UTF-8?q?=E5=B1=95=E5=BC=80/=E6=94=B6=E8=B5=B7'=E6=8C=89=E9=92=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assets/style.css | 43 ++++++++++++++++++++++ src/script.js | 67 ++++++++++++++++++++++++++++++----- templates/layouts/default.hbs | 5 +++ 3 files changed, 107 insertions(+), 8 deletions(-) diff --git a/assets/style.css b/assets/style.css index e672747..e3a1b75 100644 --- a/assets/style.css +++ b/assets/style.css @@ -626,6 +626,42 @@ body .content.expanded { z-index: 10; } +/* 分类切换按钮 */ +.category-toggle { + position: fixed; + bottom: 5rem; + right: 2rem; + width: 40px; + height: 40px; + border-radius: 10px; + background: linear-gradient(145deg, var(--site-card-bg-gradient-1), var(--site-card-bg-gradient-2)); + color: var(--text-bright); + display: flex; + align-items: center; + justify-content: center; + cursor: pointer; + transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); + z-index: 100; + box-shadow: 0 4px 16px var(--shadow-color); + border: 1px solid var(--border-color); +} + +.category-toggle:hover { + transform: translateY(-2px); + background: linear-gradient(145deg, var(--secondary-bg), var(--site-card-bg-gradient-1)); + box-shadow: 0 6px 20px var(--shadow-color); + color: var(--accent-color); +} + +.category-toggle:active { + transform: translateY(0); + box-shadow: 0 2px 8px var(--shadow-color); +} + +.category-toggle i { + font-size: 18px; +} + /* 搜索框 */ .search-box { position: relative; @@ -1730,6 +1766,12 @@ body .content.expanded { animation: glow 3s ease-in-out infinite alternate; } + /* 移动端分类切换按钮 */ + .category-toggle { + bottom: 4rem; + right: 1rem; + } + /* 分类样式优化 */ .category { margin: 0 0.15rem 1.5rem 0.15rem; @@ -1792,6 +1834,7 @@ body .content.expanded { } @media (max-width: 480px) { + .welcome-section { padding: 0 1rem; margin-bottom: 2rem; diff --git a/src/script.js b/src/script.js index 0ae6af9..683a4e0 100644 --- a/src/script.js +++ b/src/script.js @@ -344,19 +344,60 @@ window.MeNav = { // 多层级嵌套书签功能 window.MeNav.expandAll = function() { - document.querySelectorAll('.category.collapsed, .group.collapsed').forEach(element => { - element.classList.remove('collapsed'); - saveToggleState(element, 'expanded'); - }); + const activePage = document.querySelector('.page.active'); + if (activePage) { + activePage.querySelectorAll('.category.collapsed, .group.collapsed').forEach(element => { + element.classList.remove('collapsed'); + saveToggleState(element, 'expanded'); + }); + } }; window.MeNav.collapseAll = function() { - document.querySelectorAll('.category:not(.collapsed), .group:not(.collapsed)').forEach(element => { - element.classList.add('collapsed'); - saveToggleState(element, 'collapsed'); - }); + const activePage = document.querySelector('.page.active'); + if (activePage) { + activePage.querySelectorAll('.category:not(.collapsed), .group:not(.collapsed)').forEach(element => { + element.classList.add('collapsed'); + saveToggleState(element, 'collapsed'); + }); + } }; +// 智能切换分类展开/收起状态 +window.MeNav.toggleCategories = function() { + const activePage = document.querySelector('.page.active'); + if (!activePage) return; + + const allElements = activePage.querySelectorAll('.category, .group'); + const collapsedElements = activePage.querySelectorAll('.category.collapsed, .group.collapsed'); + + // 如果收起的数量 >= 总数的一半,执行展开;否则执行收起 + if (collapsedElements.length >= allElements.length / 2) { + window.MeNav.expandAll(); + updateCategoryToggleIcon('up'); + } else { + window.MeNav.collapseAll(); + updateCategoryToggleIcon('down'); + } +}; + +// 更新分类切换按钮图标 +function updateCategoryToggleIcon(state) { + const toggleBtn = document.getElementById('category-toggle'); + if (!toggleBtn) return; + + const icon = toggleBtn.querySelector('i'); + if (!icon) return; + + if (state === 'up') { + icon.className = 'fas fa-angle-double-up'; + toggleBtn.setAttribute('aria-label', '收起分类'); + } else { + icon.className = 'fas fa-angle-double-down'; + toggleBtn.setAttribute('aria-label', '展开分类'); + } +} + window.MeNav.toggleCategory = function(categoryName, subcategoryName = null, groupName = null) { const selector = groupName ? `[data-name="${categoryName}"] [data-name="${subcategoryName}"] [data-name="${groupName}"]` @@ -1446,6 +1487,16 @@ document.addEventListener('DOMContentLoaded', () => { // 初始化嵌套分类功能 initializeNestedCategories(); + // 初始化分类切换按钮 + const categoryToggleBtn = document.getElementById('category-toggle'); + if (categoryToggleBtn) { + categoryToggleBtn.addEventListener('click', function() { + window.MeNav.toggleCategories(); + }); + } else { + console.error('Category toggle button not found'); + } + // 初始化搜索索引(使用requestIdleCallback或setTimeout延迟初始化,避免影响页面加载) if ('requestIdleCallback' in window) { requestIdleCallback(() => initSearchIndex()); diff --git a/templates/layouts/default.hbs b/templates/layouts/default.hbs index 8bcaee6..e36e910 100644 --- a/templates/layouts/default.hbs +++ b/templates/layouts/default.hbs @@ -132,6 +132,11 @@ {{/each}} + + +