Greasy Fork

来自缓存

Greasy Fork is available in English.

云养宠物

在网页的右下角挂一个你喜欢的宠物咯

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。

您需要先安装用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         云养宠物
// @version      2.0.1
// @description  在网页的右下角挂一个你喜欢的宠物咯
// @match        *
// @include      *
// @exclude      https://juejin.cn/editor/drafts/*
// @run-at       document-end
// @icon         https://img2.baidu.com/it/u=4226010475,2406859093&fm=26&fmt=auto
// @require      https://code.jquery.com/jquery-3.1.1.min.js
// @namespace    http://www.touch-fish.com/bin/1
// @grant        GM.setValue
// @grant        GM.getValue
// ==/UserScript==
{
    let defaultHTML = `<html>
    <head>
        <meta charset="utf-8">
        <title>CSS睡猫</title>
        <style>
            @keyframes tail{6.6666666667%{transform:rotate(0)}10%{transform:rotate(10deg)}16.6666666667%{transform:rotate(-5deg)}20%{transform:rotate(30deg)}26.6666666667%{transform:rotate(-2deg)}46.6666666667%{transform:rotate(10deg)}53.3333333333%{transform:rotate(-5deg)}56.6666666667%{transform:rotate(10deg)}}
            @keyframes body{6.6666666667%{transform:scaleY(1)}10%{transform:scaleY(1.15)}16.6666666667%{transform:scaleY(1)}20%{transform:scaleY(1.25)}26.6666666667%{transform:scaleY(1)}46.6666666667%{transform:scaleY(1.15)}53.3333333333%{transform:scaleY(1)}56.6666666667%{transform:scaleY(1.15)}}
            @keyframes left-whisker{6.6666666667%{transform:rotate(0)}10%{transform:rotate(0deg)}16.6666666667%{transform:rotate(-5deg)}20%{transform:rotate(0deg)}26.6666666667%{transform:rotate(0deg)}46.6666666667%{transform:rotate(10deg)}53.3333333333%{transform:rotate(-5deg)}56.6666666667%{transform:rotate(10deg)}}
            @keyframes right-whisker{6.6666666667%{transform:rotate(180deg)}10%{transform:rotate(190deg)}16.6666666667%{transform:rotate(180deg)}20%{transform:rotate(175deg)}26.6666666667%{transform:rotate(190deg)}46.6666666667%{transform:rotate(180deg)}53.3333333333%{transform:rotate(185deg)}56.6666666667%{transform:rotate(175deg)}}
            @keyframes left-ear{0%{transform:rotate(-20deg)}6.6666666667%{transform:rotate(-6deg)}13.3333333333%{transform:rotate(-15deg)}26.6666666667%{transform:rotate(-15deg)}33.3333333333%{transform:rotate(-30deg)}40%{transform:rotate(-30deg)}46.6666666667%{transform:rotate(0deg)}53.3333333333%{transform:rotate(0deg)}60%{transform:rotate(-15deg)}80%{transform:rotate(-15deg)}93.3333333333%{transform:rotate(-6deg)}100%{transform:rotateZ(-6deg)}}
            @keyframes right-ear{0%{transform:rotateZ(-16deg)}6.6666666667%{transform:rotateZ(-16deg)}13.3333333333%{transform:rotateZ(-19deg)}26.6666666667%{transform:rotateZ(-19deg)}33.3333333333%{transform:rotateZ(-30deg)}36.6666666667%{transform:rotateZ(-19deg)}37.3333333333%{transform:rotateZ(-30deg)}38%{transform:rotateZ(-19deg)}40%{transform:rotateZ(-19deg)}40.6666666667%{transform:rotateZ(-30deg)}41.3333333333%{transform:rotateZ(-19deg)}46.6666666667%{transform:rotateZ(-9deg)}53.3333333333%{transform:rotateZ(-9deg)}60%{transform:rotateZ(-19deg)}60.6666666667%{transform:rotateZ(-30deg)}61.3333333333%{transform:rotateZ(-19deg)}62.6666666667%{transform:rotateZ(-19deg)}63.3333333333%{transform:rotateZ(-30deg)}64%{transform:rotateZ(-19deg)}80%{transform:rotateZ(-19deg)}93.3333333333%{transform:rotateZ(-16deg)}100%{transform:rotateZ(-16deg)}}
            body{display:inline-flex;justify-content:center;align-items:center}.main{height:400px;width:400px;position:relative;top:-80px;left:-80px}.main .stand{position:absolute;top:50%;left:50%;transform:translate(-50%);height:20px;width:200px;border-radius:20px;background-color:#fd6e72;z-index:2}.main .stand::after{content:"";position:absolute;bottom:-10px;left:50%;transform:translate(-50%);height:10px;width:50px;border-radius:20px;background-color:#fdf9de;box-shadow:0 10px 0 #fdf9de,0 20px 0 #fdf9de,0 30px 0 #fdf9de,0 40px 0 #fdf9de,0 50px 0 #fdf9de,0 60px 0 #fdf9de,0 70px 0 #fdf9de,0 80px 0 #fdf9de,0 90px 0 #fdf9de,0 100px 0 #fdf9de,0 110px 0 #fdf9de,0 120px 0 #fdf9de,0 130px 0 #fdf9de,0 140px 0 #fdf9de,0 150px 0 #fdf9de,0 160px 0 #fdf9de,0 170px 0 #fdf9de}.main .cat{width:110px;height:50px;position:absolute;top:calc(50% - 50px);right:130px;border-top-left-radius:100px;border-top-right-radius:100px}.main .cat .body{width:110px;height:50px;background-color:#745260;position:absolute;border-top-left-radius:100px;border-top-right-radius:100px;animation:body 12s none infinite}.main .cat .head{content:"";width:70px;height:35px;background-color:#745260;position:absolute;top:calc(50% - 10px);left:-40px;border-top-left-radius:80px;border-top-right-radius:80px}.tail-container{position:absolute;right:0;bottom:-13px;z-index:3}.tail{position:absolute;height:30px;width:14px;bottom:-10px;right:0;border-bottom-right-radius:5px;background:#745260;z-index:0}.tail>.tail{animation:tail 12s none infinite;height:100%;width:14px;transform-origin:left;border-bottom-left-radius:20px 20px;border-bottom-right-radius:20px 20px;border-top-right-radius:40px}.ear{position:absolute;left:4px;top:-4px;width:0;height:0;border-left:12px solid transparent;border-right:12px solid transparent;border-bottom:20px solid #745260;transform:rotate(-30deg);animation:left-ear 12s both infinite}.ear+.ear{animation:right-ear 12s both infinite;top:-12px;left:30px}.nose{position:absolute;bottom:10px;left:-10px;background-color:#fd6e72;height:5px;width:5px;border-radius:50%}.whisker-container{position:absolute;bottom:5px;left:-36px;width:20px;height:10px;transform-origin:right;animation:left-whisker 12s both infinite}.whisker-container:nth-child(2){left:-20px;bottom:12px;transform-origin:right;transform:rotate(180deg);animation:right-whisker 12s both infinite}.whisker{position:absolute;top:0;width:100%;border:1px solid #fdf9de;transform-origin:100% 0;transform:rotate(10deg)}.whisker:last-child{top:0;transform:rotate(-20deg)}
        </style>
    </head>
    <body><div style="height: 250px;width: 250px;overflow: hidden;display: inline-block;"><div class="main"><span class="stand"></span><div class="cat"><div class="body"></div><div class="head"><div class="ear"></div><div class="ear"></div></div><div class="face"><div class="nose"></div><div class="whisker-container"><div class="whisker"></div><div class="whisker"></div></div><div class="whisker-container"><div class="whisker"></div><div class="whisker"></div></div></div><div class="tail-container"><div class="tail"><div class="tail"><div class="tail"><div class="tail"><div class="tail"><div class="tail"><div class="tail"></div></div></div></div></div></div></div></div></div></div></div></body>
</html>
`;
    let html = `<div class="touch-fish" style="-webkit-user-select: none; width: 250px;height: 250px;z-index: 9998;position: fixed;right: 0;bottom: 0;">
        <iframe class="showHtml" style="width: 250px;height: 250px;position: absolute;border: none;">
        </iframe>
        <div class="touch-fish-toolbar" style="position: absolute;top: 0;left: 0;display:grid;z-index: 9999;">
           <span style="padding:10px;cursor:pointer" class="list" title="管理列表"><svg class="icon" style="width: 20px;height: 20px;vertical-align: middle;fill: currentColor;overflow: hidden;" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="496"><path d="M187.392 70.656q28.672 0 48.64 19.456t19.968 48.128l0 52.224q0 28.672-19.968 48.64t-48.64 19.968l-54.272 0q-27.648 0-47.616-19.968t-19.968-48.64l0-52.224q0-28.672 19.968-48.128t47.616-19.456l54.272 0zM889.856 70.656q27.648 0 47.616 19.456t19.968 48.128l0 52.224q0 28.672-19.968 48.64t-47.616 19.968l-437.248 0q-28.672 0-48.64-19.968t-19.968-48.64l0-52.224q0-28.672 19.968-48.128t48.64-19.456l437.248 0zM187.392 389.12q28.672 0 48.64 19.968t19.968 48.64l0 52.224q0 27.648-19.968 47.616t-48.64 19.968l-54.272 0q-27.648 0-47.616-19.968t-19.968-47.616l0-52.224q0-28.672 19.968-48.64t47.616-19.968l54.272 0zM889.856 389.12q27.648 0 47.616 19.968t19.968 48.64l0 52.224q0 27.648-19.968 47.616t-47.616 19.968l-437.248 0q-28.672 0-48.64-19.968t-19.968-47.616l0-52.224q0-28.672 19.968-48.64t48.64-19.968l437.248 0zM187.392 708.608q28.672 0 48.64 19.968t19.968 47.616l0 52.224q0 28.672-19.968 48.64t-48.64 19.968l-54.272 0q-27.648 0-47.616-19.968t-19.968-48.64l0-52.224q0-27.648 19.968-47.616t47.616-19.968l54.272 0zM889.856 708.608q27.648 0 47.616 19.968t19.968 47.616l0 52.224q0 28.672-19.968 48.64t-47.616 19.968l-437.248 0q-28.672 0-48.64-19.968t-19.968-48.64l0-52.224q0-27.648 19.968-47.616t48.64-19.968l437.248 0z" p-id="497"></path></svg></span>
            <span style="padding:10px;cursor:pointer" class="change" title="下一个"><svg class="icon" style="width: 20px;height: 20px;vertical-align: middle;fill: currentColor;overflow: hidden;" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="946"><path d="M810.752 205.397333a213.333333 213.333333 0 0 1 213.333333 213.333334v128h-85.333333v-128a128 128 0 0 0-128-128h-768a42.666667 42.666667 0 0 1-24.746667-77.397334L316.586667 0l49.493333 69.461333-190.293333 135.936h634.88z m-597.333333 597.333334a213.333333 213.333333 0 0 1-213.333334-213.333334v-128h85.333334v128a128 128 0 0 0 128 128h768a42.666667 42.666667 0 0 1 24.746666 77.397334l-298.666666 213.333333-49.493334-69.461333 190.293334-135.936H213.333333z" p-id="947"></path></svg></span>
        </div>
    </div>`;
    console.log('test')
    let config = function() {
        let cache = JSON.parse(unsafeWindow.localStorage.touchFishDatas || null);
        if (cache == null) {
            cache = {};
            cache['currUse'] = 'sleepCat';
            cache.resource = {};
            cache.resource['sleepCat'] = defaultHTML;
            updateLocalStorage();
        }

        function updateLocalStorage() {
            unsafeWindow.localStorage.touchFishDatas = JSON.stringify(cache);
        }
        return {
            add(key, html) {
                cache.resource[key] = html;
                updateLocalStorage();
            },
            remove(key) {
                delete cache.resource[key];
                updateLocalStorage();
            },
            change(key) {
                cache['currUse'] = key;
                changeHTML(cache.resource[key]);
                updateLocalStorage();
            },
            curr() {
                return cache.resource[cache['currUse']];
            },
            next() {
                let keys = Object.keys(cache.resource);
                let i = keys.indexOf(cache['currUse']);
                return cache.resource[keys[(i + 1) % keys.length]];
            },
            update(old, newK, html) {
                delete cache.resource[old];
                cache.resource[newK] = html;
                updateLocalStorage();
            },
            resource() {
                return cache.resource;
            },
            currKey(){
                return cache['currUse'];
            }
        }
    }()
    $('body').prepend(html)
    $('head').append(`<style>
    .touch-fish,
    .touch-fish iframe {
        width: 250px;
        height: 250px;
        z-index: 9998;
        position: absolute;
        right: 0;
        bottom: 0;
        border: none;
    }
    .touch-fish-toolbar>span {
        padding: 10px;
        cursor: pointer;
    }
    .tf-list>* {
        padding: 5px 10px;
        margin: 5px;
        border-radius: 4px;
        background: #eee;
        cursor: pointer;
        border: none;
    }
    .tf-btn-add{
        padding: 10px 5px;
        text-align: center;
        background: #00a9;
        cursor: pointer;
        color: #fff;
        font-weight: bold;
        border-radius: 20px;
        margin: 10px;
    }
    .tf-btn-use{
        background: #0a0a;
        color: #fff;
    }
</style>`)
    let delayFunc = function() {
        let time;
        return {
            delay(func, t = 1200) {
                window.clearTimeout(time);
                time = setTimeout(() => func(), t);
            }
        }
    }();
    $('.list').click(function() {
        let rols = `<div class="tf-list" style="">
            <input old="oldK" name="key" placeholder="描述" style="width: 100px;">
            <input name="html" placeholder="网页内容">
            <input name="useThis" type="button" value="启用">
            <input name="del" type="button" value="删除">
        </div>`;
        let html =
            `<div class="tf-m-page" style="background:#fff;position: fixed;z-index: 99999;top: calc(50vh - 200px);left: calc(50vw - 260px); width: 520px;height: 400px;overflow: auto;border: 1px solid orangered;padding: 10px;">
            <div class="tf-btn-add" style="">ADD</div>
            </div>`;
        $('body').prepend(html);

        {
            let rtime; // 定时器交互
            $('.tf-m-page').mouseleave(function() {
                rtime = setTimeout(() => $('.tf-m-page').remove(), 600)
            }).mouseenter(function() {
                window.clearTimeout(rtime)
            });
        }
        $('.tf-m-page').on('input propertychange', 'input', function() {
            console.log('inpu')
            let $t = $(this).parent().find('input');
            let old = $($t[0]).attr('old'),
                newK = $($t[0]).val(),
                h = $($t[1]).val();
            delayFunc.delay(() => {
                config.update(old, newK, h);
            })
        }).on('click', 'input[name="del"]', function() {
            $(this).parent().remove();
            config.remove($(this).prev('[name="key"]').val())
        }).on('click', 'input[name="useThis"]', function() {
            if ($(this).hasClass('tf-btn-use')) {
                return false;
            }
            $('.tf-list input[name="useThis"]').removeClass('tf-btn-use');
            $(this).addClass('tf-btn-use');
            config.change($(this).prev().prev().val())
        });
        $('.tf-btn-add').click(function() {
            $(this).parent().append(rols);
        })
        // 初始化表单数据
        Object.keys(config.resource()).forEach(k => {
            $('.tf-m-page').append(rols);
            let $input = $('.tf-m-page>.tf-list:last>input');
            $($input[0]).attr('old', k).val(k);
            $($input[1]).val(config.resource()[k]);
        })
        // 并选中当前的
        $(`input[old="${config.currKey()}"]`).next().next().addClass('tf-btn-use')
    })
    $('.change').click(function() {
        console.log('change');
        changeHTML(config.next());
    })
    changeHTML(config.curr());
    $('.touch-fish-toolbar').hide()
    $('.touch-fish').mouseover(function() {
        $('.touch-fish-toolbar').show();
    }).mouseout(function() {
        $('.touch-fish-toolbar').hide()
    });

    function changeHTML(html) {
        $('iframe[class="showHtml"]').contents().find('html').empty().append(html);
    }
}