JS特效:一个打字绚烂烟花的特效

前言:

转载警告
该特效转载http://mlldxe.cn/archives/541,本来是仅仅支持wordpress的,但顺手被我抠出来放回javascript中了。(●’◡’●)好有成就感呢!

绚烂警告
该代码效果及其绚烂,注意安全!

好吧好吧,乱解刨别人代码也是不对的.

代码:

原生代码:

var sw = window.screen.width;
if (sw > 1200) {
    (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) {
                var installedModules = {};
                function __webpack_require__(moduleId) {
                    if (installedModules[moduleId])
                        return installedModules[moduleId].exports;
                    var module = installedModules[moduleId] = {
                        exports: {},
                        id: moduleId,
                        loaded: false
                    };
                    modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
                    module.loaded = true;
                    return module.exports
                }
                __webpack_require__.m = modules;
                __webpack_require__.c = installedModules;
                __webpack_require__.p = "";
                return __webpack_require__(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() {
                    {
                        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
                        }
                    }
                    {
                        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
            }
        ), (function(module, exports) {
                (function() {
                    var properties = ['direction', 'boxSizing', 'width', 'height', 'overflowX', 'overflowY', 'borderTopWidth', 'borderRightWidth', 'borderBottomWidth', 'borderLeftWidth', 'borderStyle', 'paddingTop', 'paddingRight', 'paddingBottom', 'paddingLeft', 'fontStyle', 'fontVariant', 'fontWeight', 'fontStretch', 'fontSize', 'fontSizeAdjust', 'lineHeight', 'fontFamily', 'textAlign', 'textTransform', 'textIndent', 'textDecoration', '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)
                            }
                        }
                        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;
                        style.whiteSpace = 'pre-wrap';
                        if (element.nodeName !== 'INPUT')
                            style.wordWrap = 'break-word';
                        style.position = 'absolute';
                        if (!debug)
                            style.visibility = 'hidden';
                        properties.forEach(function(prop) {
                            style[prop] = computed[prop]
                        });
                        if (isFirefox) {
                            if (element.scrollHeight > parseInt(computed.height))
                                style.overflowY = 'scroll'
                        } else {
                            style.overflow = 'hidden'
                        }
                        div.textContent = element.value.substring(0, position);
                        if (element.nodeName === 'INPUT')
                            div.textContent = div.textContent.replace(/\s/g, "\u00a0");
                        var span = document.createElement('span');
                        span.textContent = element.value.substring(position) || '.';
                        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
                    }
                }())
            }
        )])
    })
}

    var sw=window.screen.width;
    if (sw>1200) {
        POWERMODE.colorful=true;
        POWERMODE.shake=true;
        document.body.addEventListener('input',POWERMODE)
    }

Tampermonkey用户有福了!

// ==UserScript==
// @name         打字敲击特效
// @namespace    /
// @version      0.1
// @description  ?
// @author       CYF
// @match        *://*/*
// @grant        none
// ==/UserScript==

var sw = window.screen.width;
if (sw > 1200) {
    (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) {
                var installedModules = {};
                function __webpack_require__(moduleId) {
                    if (installedModules[moduleId])
                        return installedModules[moduleId].exports;
                    var module = installedModules[moduleId] = {
                        exports: {},
                        id: moduleId,
                        loaded: false
                    };
                    modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
                    module.loaded = true;
                    return module.exports
                }
                __webpack_require__.m = modules;
                __webpack_require__.c = installedModules;
                __webpack_require__.p = "";
                return __webpack_require__(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() {
                    {
                        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
                        }
                    }
                    {
                        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
            }
        ), (function(module, exports) {
                (function() {
                    var properties = ['direction', 'boxSizing', 'width', 'height', 'overflowX', 'overflowY', 'borderTopWidth', 'borderRightWidth', 'borderBottomWidth', 'borderLeftWidth', 'borderStyle', 'paddingTop', 'paddingRight', 'paddingBottom', 'paddingLeft', 'fontStyle', 'fontVariant', 'fontWeight', 'fontStretch', 'fontSize', 'fontSizeAdjust', 'lineHeight', 'fontFamily', 'textAlign', 'textTransform', 'textIndent', 'textDecoration', '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)
                            }
                        }
                        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;
                        style.whiteSpace = 'pre-wrap';
                        if (element.nodeName !== 'INPUT')
                            style.wordWrap = 'break-word';
                        style.position = 'absolute';
                        if (!debug)
                            style.visibility = 'hidden';
                        properties.forEach(function(prop) {
                            style[prop] = computed[prop]
                        });
                        if (isFirefox) {
                            if (element.scrollHeight > parseInt(computed.height))
                                style.overflowY = 'scroll'
                        } else {
                            style.overflow = 'hidden'
                        }
                        div.textContent = element.value.substring(0, position);
                        if (element.nodeName === 'INPUT')
                            div.textContent = div.textContent.replace(/\s/g, "\u00a0");
                        var span = document.createElement('span');
                        span.textContent = element.value.substring(position) || '.';
                        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
                    }
                }())
            }
        )])
    })
}

    var sw=window.screen.width;
    if (sw>1200) {
        POWERMODE.colorful=true;
        POWERMODE.shake=true;
        document.body.addEventListener('input',POWERMODE)
    }

修改提示:

最后几行:

var sw=window.screen.width;
if (sw>1200) {
    POWERMODE.colorful=true; 
    POWERMODE.shake=true;
    document.body.addEventListener('input',POWERMODE)
}

POWERMODE.colorful=true;指是否开启多彩颜色。而POWERMODE.shake=true;指是否开启屏幕震荡.
默认全部开启.



 目录