Power Mode Input 输入特效

Activate power mode:网页内输入(如 input, textarea)内容时触发抖动/烟花特效,原作者:https://github.com/disjukr,原作者 GitHub 仓库 https://github.com/disjukr/activate-power-mode

目前為 2020-09-10 提交的版本,檢視 最新版本

// ==UserScript==
// @name         Power Mode Input 输入特效
// @description  Activate power mode:网页内输入(如 input, textarea)内容时触发抖动/烟花特效,原作者:https://github.com/disjukr,原作者 GitHub 仓库 https://github.com/disjukr/activate-power-mode
// @namespace    https://gf.qytechs.cn/users/686525-flexiston
// @version      0.1
// @author       Flexiston
// @run-at       document-idle
// @icon         https://cdn.jsdelivr.net/gh/Flexiston/CDN/favicon.png
// @include      *://*
// @grant        GM_setValue
// @grant        GM_getValue
// @grant        GM_registerMenuCommand
// ==/UserScript==

(function() {
    if (typeof POWERMODE !== 'function') {
        // 原作者:https://github.com/disjukr
        // 原作者仓库:https://github.com/disjukr/activate-power-mode
        
        // 预览地址:http://0xabcdef.com/activate-power-mode/

        // ==activate-power-mode start==
        (function webpackUniversalModuleDefinition(root,factory) {
            if(typeof exports === 'object' && typeof module === 'object')
                module.exports = factory();
            else if(typeof define === 'function' && define.amd)
                define([], factory);
            else if(typeof exports === 'object')
                exports["POWERMODE"] = factory();
            else
                root["POWERMODE"] = factory();
        })(this, function() {
            return /******/ (function(modules) { // webpackBootstrap
                /******/ // The module cache
                /******/ var installedModules = {};
                /******/ // The require function
                /******/ function __webpack_require__(moduleId) {
                    /******/ // Check if module is in cache
                    /******/ if(installedModules[moduleId])
                        /******/ return installedModules[moduleId].exports;
                    /******/ // Create a new module (and put it into the cache)
                    /******/ var module = installedModules[moduleId] = {
                        /******/ exports: {},
                        /******/ id: moduleId,
                        /******/ loaded: false
                        /******/ };
                    /******/ // Execute the module function
                    /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
                    /******/ // Flag the module as loaded
                    /******/ module.loaded = true;
                    /******/ // Return the exports of the module
                    /******/ return module.exports;
                    /******/ }
                /******/ // expose the modules object (__webpack_modules__)
                /******/ __webpack_require__.m = modules;
                /******/ // expose the module cache
                /******/ __webpack_require__.c = installedModules;
                /******/ // __webpack_public_path__
                /******/ __webpack_require__.p = "";
                /******/ // Load entry module and return exports
                /******/ return __webpack_require__(0);
                /******/ })
            /*******************************************************************
                *****/
            /******/ ([
                /* 0 */
                /***/ (function(module, exports, __webpack_require__) {
                    'use strict';
                    var canvas = document.createElement('canvas');
                    canvas.width = window.innerWidth;
                    canvas.height = window.innerHeight;
                    canvas.style.cssText = 'position:fixed;top:0;left:0;pointer-events:none;z￾index:999999';
                    window.addEventListener('resize', function () {
                        canvas.width = window.innerWidth;
                        canvas.height = window.innerHeight;
                    });
                    document.body.appendChild(canvas);
                    var context = canvas.getContext('2d');
                    var particles = [];
                    var particlePointer = 0;
                    var rendering = false;
                    POWERMODE.shake = true;
                    function getRandom(min, max) {
                        return Math.random() * (max - min) + min;
                    }
                    function getColor(el) {
                        if (POWERMODE.colorful) {
                            var u = getRandom(0, 360);
                            return 'hsla(' + getRandom(u - 10, u + 10) + ', 100%, ' + getRandom(50, 80) + '%, ' + 1 + ')';
                        } else {
                            return window.getComputedStyle(el).color;
                        }
                    }
                    function getCaret() {
                        var el = document.activeElement;
                        var bcr;
                        if (el.tagName === 'TEXTAREA' ||
                            (el.tagName === 'INPUT' && el.getAttribute('type') === 'text')) {
                            var offset = __webpack_require__(1)(el, el.selectionEnd);
                            bcr = el.getBoundingClientRect();
                            return {
                                x: offset.left + bcr.left,
                                y: offset.top + bcr.top,
                                color: getColor(el)
                            };
                        }
                        var selection = window.getSelection();
                        if (selection.rangeCount) {
                            var range = selection.getRangeAt(0);
                            var startNode = range.startContainer;
                            if (startNode.nodeType === document.TEXT_NODE) {
                                startNode = startNode.parentNode;
                            }
                            bcr = range.getBoundingClientRect();
                            return {
                                x: bcr.left,
                                y: bcr.top,
                                color: getColor(startNode)
                            };
                        }
                        return { x: 0, y: 0, color: 'transparent' };
                    }
                    function createParticle(x, y, color) {
                        return {
                            x: x,
                            y: y,
                            alpha: 1,
                            color: color,
                            velocity: {
                                x: -1 + Math.random() * 2,
                                y: -3.5 + Math.random() * 2
                            }
                        };
                    }
                    function POWERMODE() {
                        { // spawn particles
                            var caret = getCaret();
                            var numParticles = 5 + Math.round(Math.random() * 10);
                            while (numParticles--) {
                                particles[particlePointer] = createParticle(caret.x, caret.y, caret.color);
                                particlePointer = (particlePointer + 1) % 500;
                            }
                        }
                        { // shake screen
                            if (POWERMODE.shake) {
                                var intensity = 1 + 2 * Math.random();
                                var x = intensity * (Math.random() > 0.5 ? -1 : 1);
                                var y = intensity * (Math.random() > 0.5 ? -1 : 1);
                                document.body.style.marginLeft = x + 'px';
                                document.body.style.marginTop = y + 'px';
                                setTimeout(function() {
                                    document.body.style.marginLeft = '';
                                    document.body.style.marginTop = '';
                                }, 75);
                            }
                        }
                        if(!rendering){
                            requestAnimationFrame(loop);
                        }
                    };
                    POWERMODE.colorful = false;
                    function loop() {
                        rendering = true;
                        context.clearRect(0, 0, canvas.width, canvas.height);
                        var rendered = false;
                        var rect = canvas.getBoundingClientRect();
                        for (var i = 0; i < particles.length; ++i) {
                            var particle = particles[i];
                            if (particle.alpha <= 0.1) continue;
                            particle.velocity.y += 0.075;
                            particle.x += particle.velocity.x;
                            particle.y += particle.velocity.y;
                            particle.alpha *= 0.96;
                            context.globalAlpha = particle.alpha;
                            context.fillStyle = particle.color;
                            context.fillRect(
                                Math.round(particle.x - 1.5) - rect.left,
                                Math.round(particle.y - 1.5) - rect.top,
                                3, 3
                            );
                            rendered = true;
                        }
                        if(rendered){
                            requestAnimationFrame(loop);
                        }else{
                            rendering = false;
                        }
                    }
                    module.exports = POWERMODE;
                    /***/ }),
                /* 1 */
                /***/ (function(module, exports) {
                    /* jshint browser: true */
                    (function () {
                        // The properties that we copy into a mirrored div.
                        // Note that some browsers, such as Firefox,
                        // do not concatenate properties, i.e. padding￾top, bottom etc. -> padding,
                        // so we have to do every single property specifically.
                        var properties = [
                            'direction', // RTL support
                            'boxSizing',
                            'width', // on Chrome and IE, exclude the scrollbar, so the mirror div wraps exactly as the textarea does
                            'height',
                            'overflowX',
                            'overflowY', // copy the scrollbar for IE
                            'borderTopWidth',
                            'borderRightWidth',
                            'borderBottomWidth',
                            'borderLeftWidth',
                            'borderStyle',
                            'paddingTop',
                            'paddingRight',
                            'paddingBottom',
                            'paddingLeft',
                            // https://developer.mozilla.org/en-US/docs/Web/CSS/font
                            'fontStyle',
                            'fontVariant',
                            'fontWeight',
                            'fontStretch',
                            'fontSize',
                            'fontSizeAdjust',
                            'lineHeight',
                            'fontFamily',
                            'textAlign',
                            'textTransform',
                            'textIndent',
                            'textDecoration', // might not make a difference, but better be safe
                            'letterSpacing',
                            'wordSpacing',
                            'tabSize',
                            'MozTabSize'
                        ];
                        var isFirefox = window.mozInnerScreenX != null;
                        function getCaretCoordinates(element, position, options) {
                            var debug = options && options.debug || false;
                            if (debug) {
                                var el = document.querySelector('#input￾textarea-caret-position-mirror-div');
                                if ( el ) { el.parentNode.removeChild(el); }
                            }
                            // mirrored div
                            var div = document.createElement('div');
                            div.id = 'input-textarea-caret-position-mirror￾div';
                            document.body.appendChild(div);
                            var style = div.style;
                            var computed = window.getComputedStyle? getComputedStyle(element) : element.currentStyle; // currentStyle for IE < 9
                            // default textarea styles
                            style.whiteSpace = 'pre-wrap';
                            if (element.nodeName !== 'INPUT')
                                style.wordWrap = 'break-word'; // only for textarea-s
                            // position off-screen
                            style.position = 'absolute'; // required to return coordinates properly
                            if (!debug)
                                style.visibility = 'hidden'; // not 'display: none' because we want rendering
                            // transfer the element's properties to the div
                            properties.forEach(function (prop) {
                                style[prop] = computed[prop];
                            });
                            if (isFirefox) {
                                // Firefox lies about the overflow property for textareas: https://bugzilla.mozilla.org/show_bug.cgi?id=984275
                                if (element.scrollHeight > parseInt(computed.height))
                                    style.overflowY = 'scroll';
                            } else {
                                style.overflow = 'hidden'; // for Chrome to not render a scrollbar; IE keeps overflowY = 'scroll'
                            }
                            div.textContent = element.value.substring(0, position);
                            // the second special handling for input type="text" vs textarea: spaces need to be replaced with non-breaking spaces - http://stackoverflow.com/a/
                            13402035/1269037
                            if (element.nodeName === 'INPUT')
                                div.textContent = div.textContent.replace(/\s/g, "\u00a0");
                            var span = document.createElement('span');
                            // Wrapping must be replicated *exactly*, including when a long word gets
                            // onto the next line, with whitespace at the end of the line before (#7).
                            // The *only* reliable way to do that is to copy the *entire* rest of the
                            // textarea's content into the <span> created at the caret position.
                            // for inputs, just '.' would be enough, but why bother?
                            span.textContent = element.value.substring(position) || '.'; // || because a completely empty faux span doesn't render at all
                            div.appendChild(span);
                            var coordinates = {
                                top: span.offsetTop + parseInt(computed['borderTopWidth']),
                                left: span.offsetLeft + parseInt(computed['borderLeftWidth'])
                            };
                            if (debug) {
                                span.style.backgroundColor = '#aaa';
                            } else {
                                document.body.removeChild(div);
                            }
                            return coordinates;
                        }
                        if (typeof module != "undefined" && typeof module.exports != "undefined") {
                            module.exports = getCaretCoordinates;
                        } else {
                            window.getCaretCoordinates = getCaretCoordinates;
                        }
                    }());
                    /***/ })
                /******/ ])
        });
        ;
        // ==activate-power-mode end==
    }

    var colorfulOn = GM_getValue('colorfulOn');
    var shakeOn = GM_getValue('shakeOn');

    POWERMODE.colorful = colorfulOn;
    POWERMODE.shake = shakeOn;

    if (colorfulOn) {
        console.log('Power Mode Input: 开启彩色');
    } else {
        console.log('Power Mode Input: 关闭彩色');
    }

    if (shakeOn) {
        console.log('Power Mode Input: 开启抖动');
    } else {
        console.log('Power Mode Input: 关闭抖动');
    }

    function colorfulToggle() {
        if (colorfulOn){
            console.log('Power Mode Input: 关闭彩色');
            GM_setValue('colorfulOn', false);
            window.location.reload();
        } else {
            console.log('Power Mode Input: 开启彩色');
            GM_setValue('colorfulOn', true);
            window.location.reload();
        }
    }

    function shakeToggle() {
        if (shakeOn) {
            console.log('Power Mode Input: 关闭抖动');
            GM_setValue('shakeOn', false);
            window.location.reload();
        } else {
            console.log('Power Mode Input: 开启抖动');
            GM_setValue('shakeOn', true);
            window.location.reload();
        }
    }

    GM_registerMenuCommand('点击开启/关闭彩色', colorfulToggle, '');
    GM_registerMenuCommand('点击开启/关闭抖动', shakeToggle, '');

    document.body.addEventListener('input', POWERMODE);
})();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址