闲来无事,用 grok 糊了个油猴脚本,用来实现快速访问某网站。效果如下:
// ==UserScript==
// @name 添加可拖动悬浮图片
// @namespace http://tampermonkey.net/
// @version 1.5
// @description 在每个网页(包括空白页面)添加一个可拖动的悬浮图片,带超链接,拖动时不触发跳转,初始位置在右下角
// @author keka
// @match *://*/*
// @match about:blank
// @grant none
// ==/UserScript==
(function() {
'use strict';
// 等待 DOM 加载完成
function init() {
// 如果 document.body 不存在,创建 body
if (!document.body) {
document.documentElement.appendChild(document.createElement('body'));
}
// 创建图片元素
const img = document.createElement('img');
img.src = 'https://lh3.googleusercontent.com/a/ACg8ocK3JRiPEm0FulcT8n41qVX7MBrVWcTa_uB5FSYGaeXRUL6fb0I=s576-c-no'; // 替换为你的图片 URL
img.alt = '悬浮图片';
img.style.width = '100px'; // 设置图片宽度
img.style.height = '100px'; // 设置图片高度
img.style.cursor = 'move'; // 鼠标悬停时显示移动光标
// 创建超链接元素
const link = document.createElement('a');
link.href = 'https://google.com'; // 替换为你的目标链接
link.target = '_blank'; // 在新标签页打开链接
link.appendChild(img);
// 创建容器 div 并设置悬浮样式
const container = document.createElement('div');
container.style.position = 'fixed';
container.style.zIndex = '9999'; // 确保在最上层
container.style.userSelect = 'none'; // 防止拖动时选中文字
container.appendChild(link);
// 将容器添加到页面
document.body.appendChild(container);
// 拖动功能
let isDragging = false;
let wasDragged = false;
let currentX;
let currentY;
let initialX;
let initialY;
let startX;
let startY;
const dragThreshold = 5; // 像素阈值,判断是否为拖动
container.addEventListener('mousedown', (e) => {
initialX = e.clientX - currentX;
initialY = e.clientY - currentY;
startX = e.clientX;
startY = e.clientY;
isDragging = true;
wasDragged = false;
e.preventDefault(); // 防止默认行为(如图片拖动)
});
document.addEventListener('mousemove', (e) => {
if (isDragging) {
currentX = e.clientX - initialX;
currentY = e.clientY - initialY;
container.style.left = `${currentX}px`;
container.style.top = `${currentY}px`;
container.style.right = 'auto'; // 清除初始右边距
container.style.bottom = 'auto'; // 清除初始底边距
// 检查是否超过拖动阈值
const deltaX = Math.abs(e.clientX - startX);
const deltaY = Math.abs(e.clientY - startY);
if (deltaX > dragThreshold || deltaY > dragThreshold) {
wasDragged = true;
}
}
});
document.addEventListener('mouseup', () => {
isDragging = false;
});
// 单独处理链接的点击事件
link.addEventListener('click', (e) => {
if (wasDragged) {
e.preventDefault(); // 拖动后阻止跳转
e.stopPropagation();
}
});
// 初始化位置:右下角,距离底部和右侧约窗口高度的20%
const windowHeight = window.innerHeight;
const offset = windowHeight * 0.2; // 20% 的窗口高度
currentX = window.innerWidth - 100 - offset; // 图片宽度100px + 20%偏移
currentY = windowHeight - 100 - offset; // 图片高度100px + 20%偏移
container.style.left = `${currentX}px`;
container.style.top = `${currentY}px`;
}
// 监听 DOM 加载完成事件
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', init);
} else {
init(); // DOM 已加载,直接执行
}
})();