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); } /** 隐藏停止按钮 */