// ==UserScript== // @name DisableScrollScript // @namespace http://tampermonkey.net/ // @version 2024-11-12 // @description 禁止滚动 // @author 荷塘月色 // @include *://* // @grant none // @license MIT // @downloadURL none // ==/UserScript== (function() { const wrapper = document.createElement('div') document.body.appendChild(wrapper) wrapper.classList.add('wrapper') const dragEl = document.createElement('div') dragEl.classList.add('drag-element') const defaultStyleClass = document.createElement('style') const hiddenStyleClass = document.createElement('style') const button = document.createElement('button') wrapper.appendChild(button) wrapper.appendChild(dragEl) document.head.appendChild(defaultStyleClass) button.innerText = '锁定' button.classList.add('custom-button') const offset = { x: 0, y: 0 } let isDragging = false dragEl.addEventListener('mousedown', (ev) => { isDragging = true offset.x = ev.clientX - wrapper.getBoundingClientRect().left offset.y = ev.clientY - wrapper.getBoundingClientRect().top }) document.addEventListener('mousemove', function(e) { if (isDragging) { wrapper.style.left = (e.clientX - offset.x) + 'px' wrapper.style.top = (e.clientY - offset.y) + 'px' } }) document.addEventListener('mouseup', function() { isDragging = false }) button.addEventListener('click', () => { if (document.head.contains(hiddenStyleClass)) { document.head.removeChild(hiddenStyleClass) button.innerText = '锁定' } else { document.head.appendChild(hiddenStyleClass) button.innerText = '解锁' } }) function Camel2Kebab(string) { return string.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase() } /* 通用 JSON 转 CSS 方法 */ function Json2Css(complexStyleObject) { let cssString = '' for (const selector in complexStyleObject) { if (selector.startsWith('@')) { /* 处理媒体查询和其他@规则 */ cssString += `${selector} { ` for (const innerSelector in complexStyleObject[selector]) { cssString += `${innerSelector} { ` const styles = complexStyleObject[selector][innerSelector] for (const prop in styles) { cssString += `${Camel2Kebab(prop)}: ${styles[prop]}; ` } cssString += '} ' } cssString += '} ' } else { cssString += `${selector} { ` const styles = complexStyleObject[selector] for (const prop in styles) { cssString += `${Camel2Kebab(prop)}: ${styles[prop]}; ` } cssString += '} ' } } return cssString } const hiddenStylesJSON = { '*': { 'overflow': 'hidden !important' } } hiddenStyleClass.innerHTML = `${Json2Css(hiddenStylesJSON)}` const defaultStylesJSON = { '.custom-button': { 'padding': '0.25em 1em', 'border-radius': '4px', 'border': '1px solid #000', 'cursor': 'pointer' }, '.wrapper': { 'zIndex': '10000', 'position': 'fixed', 'top': '10px', 'left': '10px', 'padding': '4px', 'display': 'flex', 'flexDirection': 'column', 'gap': '4px', 'background': 'rgb(255,255,255)', 'border-radius': '4px', 'border': '1px solid #000' }, '.drag-element': { 'width': '100%', 'height': '4px', 'background': 'rgba(0,0,0,0.2)', 'border-radius': '4px', 'cursor': 'pointer' } } defaultStyleClass.innerHTML = `${Json2Css(defaultStylesJSON)}` })()