// ==UserScript== // @name 手动全屏 // @namespace http://tampermonkey.net/ // @version 1.2.2 // @description 添加一个可拖动的全屏按钮,支持触屏设备,全屏切换后自动回位 // @author youli // @match *://*/* // @grant none // ==/UserScript== (function() { 'use strict'; // 创建全屏按钮 var fullScreenButton = document.createElement('button'); fullScreenButton.textContent = '全屏'; fullScreenButton.style.position = 'fixed'; fullScreenButton.style.bottom = '10px'; // 以右下角为起始点 fullScreenButton.style.right = '10px'; fullScreenButton.style.zIndex = 9999; fullScreenButton.style.cursor = 'pointer'; fullScreenButton.style.padding = '5px 10px'; fullScreenButton.style.background = 'rgba(76, 175, 79, 0.14)'; fullScreenButton.style.color = 'white'; fullScreenButton.style.border = 'none'; fullScreenButton.style.borderRadius = '4px'; fullScreenButton.style.transition = 'background 0.2s'; // 鼠标悬停效果 fullScreenButton.addEventListener('mouseover', function() { this.style.background = '#45a049'; }); fullScreenButton.addEventListener('mouseout', function() { this.style.background = 'rgba(76, 175, 80, 0.3)'; }); // 重置按钮到右下角 function resetButtonPosition() { fullScreenButton.style.bottom = '10px'; fullScreenButton.style.right = '10px'; fullScreenButton.style.left = 'auto'; fullScreenButton.style.top = 'auto'; } // 初始化拖动变量 var isDragging = false; var startX, startY; var offsetX, offsetY; var touchMoved = false; // 用于判断触摸是否移动过 var dragThreshold = 5; // 拖动阈值,超过这个距离才认为是拖动 // 鼠标/触摸事件处理 fullScreenButton.addEventListener('mousedown', startDrag); fullScreenButton.addEventListener('touchstart', startDrag, { passive: false }); function startDrag(e) { e.preventDefault(); isDragging = false; touchMoved = false; if (e.type === 'touchstart') { startX = e.touches[0].clientX; startY = e.touches[0].clientY; offsetX = startX - fullScreenButton.getBoundingClientRect().left; offsetY = startY - fullScreenButton.getBoundingClientRect().top; } else { startX = e.clientX; startY = e.clientY; offsetX = startX - fullScreenButton.getBoundingClientRect().left; offsetY = startY - fullScreenButton.getBoundingClientRect().top; } document.addEventListener('mousemove', drag); document.addEventListener('touchmove', drag, { passive: false }); document.addEventListener('mouseup', stopDrag); document.addEventListener('touchend', stopDrag); } function drag(e) { e.preventDefault(); var clientX, clientY; if (e.type === 'touchmove') { clientX = e.touches[0].clientX; clientY = e.touches[0].clientY; } else { clientX = e.clientX; clientY = e.clientY; } // 计算移动距离 var diffX = Math.abs(clientX - startX); var diffY = Math.abs(clientY - startY); // 如果移动距离超过阈值,才认为是拖动 if (diffX > dragThreshold || diffY > dragThreshold) { isDragging = true; touchMoved = true; var newX = clientX - offsetX; var newY = clientY - offsetY; // 限制按钮在视口范围内 newX = Math.max(0, Math.min(newX, window.innerWidth - fullScreenButton.offsetWidth)); newY = Math.max(0, Math.min(newY, window.innerHeight - fullScreenButton.offsetHeight)); fullScreenButton.style.left = newX + 'px'; fullScreenButton.style.top = newY + 'px'; fullScreenButton.style.right = 'auto'; fullScreenButton.style.bottom = 'auto'; } } function stopDrag(e) { // 如果是触摸结束且没有移动过,则视为点击 if (e.type === 'touchend' && !touchMoved) { toggleFullScreen(); } isDragging = false; touchMoved = false; document.removeEventListener('mousemove', drag); document.removeEventListener('touchmove', drag); document.removeEventListener('mouseup', stopDrag); document.removeEventListener('touchend', stopDrag); } // 全屏切换功能 fullScreenButton.addEventListener('click', function() { if (!isDragging) { toggleFullScreen(); } }); function toggleFullScreen() { if (!document.fullscreenElement && !document.webkitFullscreenElement && !document.mozFullScreenElement && !document.msFullscreenElement) { // 进入全屏 if (document.documentElement.requestFullscreen) { document.documentElement.requestFullscreen(); } else if (document.documentElement.webkitRequestFullscreen) { document.documentElement.webkitRequestFullscreen(); } else if (document.documentElement.mozRequestFullScreen) { document.documentElement.mozRequestFullScreen(); } else if (document.documentElement.msRequestFullscreen) { document.documentElement.msRequestFullscreen(); } } else { // 退出全屏 if (document.exitFullscreen) { document.exitFullscreen(); } else if (document.webkitExitFullscreen) { document.webkitExitFullscreen(); } else if (document.mozCancelFullScreen) { document.mozCancelFullScreen(); } else if (document.msExitFullscreen) { document.msExitFullscreen(); } } // 全屏状态变化后重置按钮位置 resetButtonPosition(); } // 监听全屏状态变化,更新按钮文本并重置位置 document.addEventListener('fullscreenchange', handleFullscreenChange); document.addEventListener('webkitfullscreenchange', handleFullscreenChange); document.addEventListener('mozfullscreenchange', handleFullscreenChange); document.addEventListener('MSFullscreenChange', handleFullscreenChange); function handleFullscreenChange() { // 更新按钮文本 if (document.fullscreenElement || document.webkitFullscreenElement || document.mozFullScreenElement || document.msFullscreenElement) { fullScreenButton.textContent = '退出全屏'; } else { fullScreenButton.textContent = '全屏'; } // 重置按钮位置到右下角 resetButtonPosition(); } // 添加按钮到页面 document.body.appendChild(fullScreenButton); })();