- // ==UserScript==
- // @name DisableScrollScript
- // @namespace http://tampermonkey.net/
- // @version 2024.11.18.4
- // @description 禁止滚动
- // @author 荷塘月色
- // @include *://*
- // @grant none
- // @license MIT
- // ==/UserScript==
-
- (function() {
- const wrapper = document.createElement('div')
- document.body.appendChild(wrapper)
- wrapper.classList.add('custom-wrapper')
- const dragEl = document.createElement('div')
- dragEl.classList.add('custom-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('touchstart', e => {
- isDragging = true
- const touch = e.touches[0] // 获取第一个触摸点
- offset.x = touch.clientX - wrapper.getBoundingClientRect().left
- offset.y = touch.clientY - wrapper.getBoundingClientRect().top
- e.preventDefault()
- })
-
- 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
- })
-
- document.addEventListener('touchmove', function(e) {
- if (isDragging) {
- const touch = e.touches[0] // 获取第一个触摸点
- wrapper.style.left = (touch.clientX - offset.x) + 'px'
- wrapper.style.top = (touch.clientY - offset.y) + 'px'
- }
- })
-
- document.addEventListener('touchend', 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',
- // 'touch-action': 'none'
- }
- }
- hiddenStyleClass.innerHTML = `${Json2Css(hiddenStylesJSON)}`
-
- const defaultStylesJSON = {
- '.custom-wrapper': {
- 'zIndex': '10000',
- 'position': 'fixed',
- 'top': '10px',
- 'left': '10px',
- 'padding': '4px',
- 'display': 'flex',
- 'flexDirection': 'column',
- 'gap': '4px',
- 'background': 'rgb(255,255,255)',
- 'border-radius': '2px',
- 'border': '1px solid #666',
- 'box-sizing': 'border-box',
- },
- '.custom-button': {
- 'padding': '0.25em 1em',
- // 'border-radius': '4px 4px 0 0',
- 'border-radius': '2px',
- 'border': '1px solid #666',
- 'cursor': 'pointer',
- 'color': '#333',
- 'font-size': '0.875em',
- 'box-sizing': 'border-box',
- },
- '.custom-drag-element': {
- 'width': '100%',
- 'height': '6px',
- 'background': 'rgba(0,0,0,0.25)',
- 'border': '1px solid #666',
- // 'border-radius': '0 0 4px 4px',
- 'border-radius': '2px',
- 'cursor': 'pointer',
- 'box-sizing': 'border-box',
- }
- }
- defaultStyleClass.innerHTML = `${Json2Css(defaultStylesJSON)}`
-
- function preventScroll(e) {
- if (document.head.contains(hiddenStyleClass))
- e.preventDefault()
- }
-
- window.addEventListener('wheel', preventScroll, { passive: false }) // 鼠标滚轮
- window.addEventListener('touchmove', preventScroll, { passive: false }) // 移动设备触摸滑动
-
- // 确保按钮能在页面里
- setInterval(() => {
- if (!document.body.contains(wrapper)) {
- document.body.appendChild(wrapper)
- }
- }, 100)
- })()