From 9f5d213d993098ed241a373421d13d1c4a9e0c02 Mon Sep 17 00:00:00 2001 From: lkddi Date: Tue, 3 Mar 2026 16:56:10 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=EF=BC=9A=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E9=92=93=E9=B1=BC=E5=81=9C=E6=AD=A2=E6=8C=89=E9=92=AE=E6=94=B9?= =?UTF-8?q?=E4=B8=BA=E5=8F=AF=E6=8B=96=E6=8B=BD=E6=82=AC=E6=B5=AE=EF=BC=8C?= =?UTF-8?q?=E4=BD=8D=E7=BD=AE=E6=8C=81=E4=B9=85=E5=8C=96=E5=88=B0=20localS?= =?UTF-8?q?torage?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../views/chat/partials/scripts.blade.php | 154 +++++++++++++++--- 1 file changed, 128 insertions(+), 26 deletions(-) diff --git a/resources/views/chat/partials/scripts.blade.php b/resources/views/chat/partials/scripts.blade.php index 11c898c..b52d0e1 100644 --- a/resources/views/chat/partials/scripts.blade.php +++ b/resources/views/chat/partials/scripts.blade.php @@ -1944,41 +1944,143 @@ } /** - * 显示「停止自动钓鱼」悬浮按钮 + * 显示「停止自动钓鱼」悬浮按钮(支持拖拽移动) * @param {number} cooldown 冷却秒数(用于倒计时提示) */ function _showAutoFishStopBtn(cooldown) { if (document.getElementById('auto-fish-stop-btn')) return; - const stopBtn = document.createElement('button'); - stopBtn.id = 'auto-fish-stop-btn'; - stopBtn.innerHTML = '🛑 停止自动钓鱼'; - stopBtn.style.cssText = ` - position: fixed; - bottom: 80px; - right: 20px; - z-index: 10000; - background: linear-gradient(135deg, #dc2626, #b91c1c); - color: #fff; - border: none; - border-radius: 20px; - padding: 8px 18px; - font-size: 13px; - font-weight: bold; - cursor: pointer; - box-shadow: 0 4px 12px rgba(220,38,38,0.4); - animation: autoFishBtnPulse 1.8s ease-in-out infinite; - `; + + // 注入动画样式 if (!document.getElementById('auto-fish-stop-style')) { const s = document.createElement('style'); s.id = 'auto-fish-stop-style'; - s.textContent = `@keyframes autoFishBtnPulse { - 0%,100% { transform: scale(1); } - 50% { transform: scale(1.05); } - }`; + s.textContent = ` + @keyframes autoFishBtnPulse { + 0%,100% { box-shadow: 0 4px 12px rgba(220,38,38,0.4); } + 50% { box-shadow: 0 4px 20px rgba(220,38,38,0.7); } + } + #auto-fish-stop-btn { + position: fixed; + z-index: 10000; + background: linear-gradient(135deg, #dc2626, #b91c1c); + color: #fff; + border: none; + border-radius: 20px; + padding: 8px 18px; + font-size: 13px; + font-weight: bold; + cursor: grab; + user-select: none; + animation: autoFishBtnPulse 1.8s ease-in-out infinite; + touch-action: none; + } + #auto-fish-stop-btn:active { cursor: grabbing; } + #auto-fish-stop-btn .drag-hint { + display: block; + font-size: 9px; + font-weight: normal; + opacity: .65; + margin-top: 1px; + text-align: center; + letter-spacing: .5px; + } + `; document.head.appendChild(s); } - stopBtn.onclick = stopAutoFishing; - document.body.appendChild(stopBtn); + + const btn = document.createElement('button'); + btn.id = 'auto-fish-stop-btn'; + btn.innerHTML = '🛑 停止自动钓鱼⠿ 可拖动'; + + // 从 localStorage 恢复上次位置,默认右下角 + const saved = (() => { + try { + return JSON.parse(localStorage.getItem('autoFishBtnPos')); + } catch { + return null; + } + })(); + if (saved) { + btn.style.left = saved.left + 'px'; + btn.style.top = saved.top + 'px'; + } else { + btn.style.bottom = '80px'; + btn.style.right = '20px'; + } + + // ── 拖拽逻辑(鼠标 + 触摸) ────────────────────────────────── + let isDragging = false; + let startX, startY, startLeft, startTop; + + function onDragStart(e) { + // 将 right/bottom 转为 left/top 绝对坐标,便于拖拽计算 + const rect = btn.getBoundingClientRect(); + btn.style.left = rect.left + 'px'; + btn.style.top = rect.top + 'px'; + btn.style.right = 'auto'; + btn.style.bottom = 'auto'; + + isDragging = false; + const clientX = e.touches ? e.touches[0].clientX : e.clientX; + const clientY = e.touches ? e.touches[0].clientY : e.clientY; + startX = clientX; + startY = clientY; + startLeft = rect.left; + startTop = rect.top; + + document.addEventListener('mousemove', onDragMove, { + passive: false + }); + document.addEventListener('mouseup', onDragEnd); + document.addEventListener('touchmove', onDragMove, { + passive: false + }); + document.addEventListener('touchend', onDragEnd); + } + + function onDragMove(e) { + e.preventDefault(); + const clientX = e.touches ? e.touches[0].clientX : e.clientX; + const clientY = e.touches ? e.touches[0].clientY : e.clientY; + const dx = clientX - startX; + const dy = clientY - startY; + if (Math.abs(dx) > 3 || Math.abs(dy) > 3) { + isDragging = true; + } + if (!isDragging) return; + + const newLeft = Math.max(0, Math.min(window.innerWidth - btn.offsetWidth, startLeft + dx)); + const newTop = Math.max(0, Math.min(window.innerHeight - btn.offsetHeight, startTop + dy)); + btn.style.left = newLeft + 'px'; + btn.style.top = newTop + 'px'; + } + + function onDragEnd() { + document.removeEventListener('mousemove', onDragMove); + document.removeEventListener('mouseup', onDragEnd); + document.removeEventListener('touchmove', onDragMove); + document.removeEventListener('touchend', onDragEnd); + + // 持久化位置 + if (isDragging) { + localStorage.setItem('autoFishBtnPos', JSON.stringify({ + left: parseInt(btn.style.left), + top: parseInt(btn.style.top), + })); + } + } + + btn.addEventListener('mousedown', onDragStart); + btn.addEventListener('touchstart', onDragStart, { + passive: true + }); + + // 拖拽时不触发 click;非拖拽时才停止钓鱼 + btn.addEventListener('click', () => { + if (!isDragging) stopAutoFishing(); + }); + + document.body.appendChild(btn); } /** 隐藏停止按钮 */