优化:自动钓鱼停止按钮改为可拖拽悬浮,位置持久化到 localStorage
This commit is contained in:
@@ -1944,18 +1944,23 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 显示「停止自动钓鱼」悬浮按钮
|
* 显示「停止自动钓鱼」悬浮按钮(支持拖拽移动)
|
||||||
* @param {number} cooldown 冷却秒数(用于倒计时提示)
|
* @param {number} cooldown 冷却秒数(用于倒计时提示)
|
||||||
*/
|
*/
|
||||||
function _showAutoFishStopBtn(cooldown) {
|
function _showAutoFishStopBtn(cooldown) {
|
||||||
if (document.getElementById('auto-fish-stop-btn')) return;
|
if (document.getElementById('auto-fish-stop-btn')) return;
|
||||||
const stopBtn = document.createElement('button');
|
|
||||||
stopBtn.id = 'auto-fish-stop-btn';
|
// 注入动画样式
|
||||||
stopBtn.innerHTML = '🛑 停止自动钓鱼';
|
if (!document.getElementById('auto-fish-stop-style')) {
|
||||||
stopBtn.style.cssText = `
|
const s = document.createElement('style');
|
||||||
|
s.id = 'auto-fish-stop-style';
|
||||||
|
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;
|
position: fixed;
|
||||||
bottom: 80px;
|
|
||||||
right: 20px;
|
|
||||||
z-index: 10000;
|
z-index: 10000;
|
||||||
background: linear-gradient(135deg, #dc2626, #b91c1c);
|
background: linear-gradient(135deg, #dc2626, #b91c1c);
|
||||||
color: #fff;
|
color: #fff;
|
||||||
@@ -1964,21 +1969,118 @@
|
|||||||
padding: 8px 18px;
|
padding: 8px 18px;
|
||||||
font-size: 13px;
|
font-size: 13px;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
cursor: pointer;
|
cursor: grab;
|
||||||
box-shadow: 0 4px 12px rgba(220,38,38,0.4);
|
user-select: none;
|
||||||
animation: autoFishBtnPulse 1.8s ease-in-out infinite;
|
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;
|
||||||
|
}
|
||||||
`;
|
`;
|
||||||
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); }
|
|
||||||
}`;
|
|
||||||
document.head.appendChild(s);
|
document.head.appendChild(s);
|
||||||
}
|
}
|
||||||
stopBtn.onclick = stopAutoFishing;
|
|
||||||
document.body.appendChild(stopBtn);
|
const btn = document.createElement('button');
|
||||||
|
btn.id = 'auto-fish-stop-btn';
|
||||||
|
btn.innerHTML = '🛑 停止自动钓鱼<span class="drag-hint">⠿ 可拖动</span>';
|
||||||
|
|
||||||
|
// 从 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);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** 隐藏停止按钮 */
|
/** 隐藏停止按钮 */
|
||||||
|
|||||||
Reference in New Issue
Block a user