From 9f8b560d202d5ca1d643e366c923c9bcd0f4de04 Mon Sep 17 00:00:00 2001
From: nanhaoluo <3075912108@qq.com>
Date: Fri, 23 Jan 2026 13:04:43 +0800
Subject: [PATCH] =?UTF-8?q?feat:=20=E4=B8=BATODO=E5=88=97=E8=A1=A8?=
=?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=8A=98=E5=8F=A0=E5=B7=B2=E5=AE=8C=E6=88=90?=
=?UTF-8?q?=E4=BB=BB=E5=8A=A1=E5=8A=9F=E8=83=BD?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
- 添加折叠/展开已完成任务的按钮,显示已完成数量
- 实现流畅的折叠展开动画效果(高度、透明度、位移)
- 优化删除和完成任务的动画,增加缩放效果
- 同时支持桌面端和移动端
- 折叠按钮在没有已完成任务时自动隐藏
- 使用 CSS transition 实现平滑的进入退出动画
---
argontheme.js | 30 +++++++++++++
sidebar.php | 57 +++++++++++++++++++++++++
style.css | 115 +++++++++++++++++++++++++++++++++++++++++++++++++-
3 files changed, 201 insertions(+), 1 deletion(-)
diff --git a/argontheme.js b/argontheme.js
index d7ef059..2a85de9 100644
--- a/argontheme.js
+++ b/argontheme.js
@@ -3198,11 +3198,41 @@ $(document).on("click" , "#blog_categories .tag" , function(){
// ========== 移动端TODO交互 ==========
function updateMobileTodoCount() {
var count = $("#mobile-todo-list .mobile-todo-item:not(.todo-completed)").length;
+ var completedCount = $("#mobile-todo-list .mobile-todo-item.todo-completed").length;
$("#mobile_todo_count").text(count);
// 同步更新桌面端计数
$(".todo-count").text(count);
+
+ // 更新折叠按钮
+ var collapseBtn = $("#mobile-todo-collapse-btn");
+ if (collapseBtn.length) {
+ collapseBtn.find(".mobile-todo-completed-count").text(completedCount);
+ if (completedCount > 0) {
+ collapseBtn.show();
+ } else {
+ collapseBtn.hide();
+ }
+ }
}
+ // 移动端折叠/展开已完成任务
+ $(document).on("click", "#mobile-todo-collapse-btn", function(e) {
+ e.stopPropagation();
+ var btn = $(this);
+ var completedItems = $("#mobile-todo-list .mobile-todo-item.todo-completed");
+ var isCollapsed = btn.hasClass("collapsed");
+
+ if (isCollapsed) {
+ // 展开
+ btn.removeClass("collapsed");
+ completedItems.removeClass("collapsed");
+ } else {
+ // 折叠
+ btn.addClass("collapsed");
+ completedItems.addClass("collapsed");
+ }
+ });
+
// 添加TODO
$(document).on("click", "#mobile-todo-add-btn", function() {
addMobileTodo();
diff --git a/sidebar.php b/sidebar.php
index 90ce01c..7208d17 100644
--- a/sidebar.php
+++ b/sidebar.php
@@ -165,6 +165,15 @@ $author_desc = get_option('argon_sidebar_author_description');
+ 0) :
+ ?>
+
+
@@ -854,8 +863,15 @@ $author_desc = get_option('argon_sidebar_author_description');
+ 0) : ?>
+
+
@@ -950,9 +966,26 @@ $author_desc = get_option('argon_sidebar_author_description');
function updateCount() {
var count = document.querySelectorAll('.todo-item:not(.todo-completed)').length;
+ var completedCount = document.querySelectorAll('.todo-item.todo-completed').length;
var countEl = document.querySelector('.todo-count');
if (countEl) countEl.textContent = count;
+ // 更新折叠按钮
+ var collapseBtn = document.getElementById('todo-collapse-btn');
+ var completedCountEl = collapseBtn ? collapseBtn.querySelector('.todo-completed-count') : null;
+ if (completedCountEl) {
+ completedCountEl.textContent = completedCount;
+ }
+
+ // 显示/隐藏折叠按钮
+ if (collapseBtn) {
+ if (completedCount > 0) {
+ collapseBtn.style.display = 'flex';
+ } else {
+ collapseBtn.style.display = 'none';
+ }
+ }
+
var totalCount = document.querySelectorAll('.todo-item').length;
var list = document.getElementById('todo-list');
if (totalCount > 4) {
@@ -970,6 +1003,30 @@ $author_desc = get_option('argon_sidebar_author_description');
}
}
+ // 折叠/展开已完成任务
+ var collapseBtn = document.getElementById('todo-collapse-btn');
+ if (collapseBtn) {
+ collapseBtn.addEventListener('click', function(e) {
+ e.stopPropagation();
+ var completedItems = document.querySelectorAll('.todo-item.todo-completed');
+ var isCollapsed = collapseBtn.classList.contains('collapsed');
+
+ if (isCollapsed) {
+ // 展开
+ collapseBtn.classList.remove('collapsed');
+ completedItems.forEach(function(item) {
+ item.classList.remove('collapsed');
+ });
+ } else {
+ // 折叠
+ collapseBtn.classList.add('collapsed');
+ completedItems.forEach(function(item) {
+ item.classList.add('collapsed');
+ });
+ }
+ });
+ }
+
// 添加 TODO
if (isAuthor) {
var input = document.getElementById('todo-input');
diff --git a/style.css b/style.css
index 7a5ca1d..f26533e 100644
--- a/style.css
+++ b/style.css
@@ -10973,11 +10973,31 @@ html.darkmode.amoled-dark #content:after {
opacity: 0.6;
order: 1;
transform: scale(0.98);
+ max-height: 500px;
+ overflow: hidden;
+ transition: all var(--animation-normal) var(--ease-emphasized),
+ max-height var(--animation-normal) var(--ease-emphasized),
+ margin var(--animation-normal) var(--ease-emphasized),
+ padding var(--animation-normal) var(--ease-emphasized),
+ opacity var(--animation-normal) var(--ease-emphasized);
+ }
+
+ .mobile-todo-item.todo-completed.collapsed {
+ max-height: 0;
+ margin-bottom: 0;
+ padding-top: 0;
+ padding-bottom: 0;
+ opacity: 0;
+ transform: translateY(-10px) scale(0.9);
}
.mobile-todo-item.todo-completing {
opacity: 0;
transform: translateX(40px) scale(0.85);
+ max-height: 0;
+ margin-bottom: 0;
+ padding-top: 0;
+ padding-bottom: 0;
transition: all 0.4s var(--ease-emphasized-accelerate);
}
@@ -10996,6 +11016,43 @@ html.darkmode.amoled-dark #content:after {
margin-bottom: 8px;
opacity: 0.35;
}
+
+ /* 移动端折叠已完成按钮 */
+ .mobile-todo-collapse-btn {
+ display: flex;
+ align-items: center;
+ gap: 3px;
+ background: rgba(var(--themecolor-rgbstr), 0.12);
+ color: var(--themecolor);
+ border: none;
+ border-radius: 8px;
+ padding: 2px 6px;
+ font-size: 10px;
+ font-weight: 600;
+ cursor: pointer;
+ transition: all var(--animation-fast) var(--ease-standard);
+ margin-left: 6px;
+ flex-shrink: 0;
+ }
+
+ .mobile-todo-collapse-btn:active {
+ background: rgba(var(--themecolor-rgbstr), 0.25);
+ transform: scale(0.92);
+ }
+
+ .mobile-todo-collapse-btn i {
+ font-size: 8px;
+ transition: transform var(--animation-fast) var(--ease-standard);
+ }
+
+ .mobile-todo-collapse-btn.collapsed i {
+ transform: rotate(-90deg);
+ }
+
+ .mobile-todo-completed-count {
+ min-width: 10px;
+ text-align: center;
+ }
#navbar_global {
background: var(--color-foreground);
@@ -12559,6 +12616,42 @@ html.navbar-absolute #leftbar_part3.sticky {
margin-left: auto;
}
+/* 折叠已完成按钮 */
+.todo-collapse-btn {
+ display: flex;
+ align-items: center;
+ gap: 4px;
+ background: rgba(var(--themecolor-rgbstr), 0.1);
+ color: var(--themecolor);
+ border: none;
+ border-radius: 8px;
+ padding: 2px 7px;
+ font-size: 10px;
+ font-weight: 600;
+ cursor: pointer;
+ transition: all var(--animation-fast) var(--ease-standard);
+ margin-left: 6px;
+}
+
+.todo-collapse-btn:hover {
+ background: rgba(var(--themecolor-rgbstr), 0.2);
+ transform: scale(1.05);
+}
+
+.todo-collapse-btn i {
+ font-size: 9px;
+ transition: transform var(--animation-fast) var(--ease-standard);
+}
+
+.todo-collapse-btn.collapsed i {
+ transform: rotate(-90deg);
+}
+
+.todo-completed-count {
+ min-width: 12px;
+ text-align: center;
+}
+
/* 站长端:显示未完成数�?*/
.todo-count::before {
content: '';
@@ -12734,7 +12827,11 @@ html.navbar-absolute #leftbar_part3.sticky {
.todo-item.todo-completing {
opacity: 0;
- transform: translateX(30px);
+ transform: translateX(30px) scale(0.9);
+ max-height: 0;
+ margin-bottom: 0;
+ padding-top: 0;
+ padding-bottom: 0;
transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
}
@@ -12746,6 +12843,22 @@ html.navbar-absolute #leftbar_part3.sticky {
.todo-item.todo-completed {
opacity: 0.7;
order: 1;
+ max-height: 500px;
+ overflow: hidden;
+ transition: all var(--animation-normal) var(--ease-emphasized),
+ max-height var(--animation-normal) var(--ease-emphasized),
+ margin var(--animation-normal) var(--ease-emphasized),
+ padding var(--animation-normal) var(--ease-emphasized),
+ opacity var(--animation-normal) var(--ease-emphasized);
+}
+
+.todo-item.todo-completed.collapsed {
+ max-height: 0;
+ margin-bottom: 0;
+ padding-top: 0;
+ padding-bottom: 0;
+ opacity: 0;
+ transform: translateY(-10px);
}
.todo-item.todo-completed:hover {