Greasy Fork

自动阅读器

pc 端自动阅读器,实现不同速度,在阅读中解放双手,页面自动滚动

// ==UserScript==
// @name         自动阅读器
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  pc 端自动阅读器,实现不同速度,在阅读中解放双手,页面自动滚动
// @author       windymiao
// @match        https://*/*
// @icon         data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==
// @require      https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js
// @grant        none
// @license      MIT
// ==/UserScript==

(function() {
    'use strict';
    var button = `<div class="toggle">
                    <span>阅读设置</span>
                  </div>`

    var content = `<div id="auto-reading">
        <div class="title">
            <span>自动阅读设置</span>
            <span style="float:right;" class="hidden">❯</span>
        </div>


        <div style="margin: 16px 0;">
            阅读速度
        </div>

        <div class="forRadio">
            <input type="radio" id="0.6" name="step" value="0.6" checked="">
            <label for="0.6" class="radio-label">0.6</label>
        </div>
        <div class="forRadio">
            <input type="radio" id="1.0" name="step" value="1.0">
            <label for="1.0" class="radio-label">1.0</label>
        </div>
        <div class="forRadio">
            <input type="radio" id="1.2" name="step" value="1.2">
            <label for="1.2" class="radio-label">1.2</label>
        </div>
        <div class="forRadio">
            <input type="radio" id="1.5" name="step" value="1.5">
            <label for="1.5" class="radio-label">1.5</label>
        </div>
        <div class="forRadio">
            <input type="radio" id="1.8" name="step" value="1.8">
            <label for="1.8" class="radio-label">1.8</label>
        </div>
        <div class="forRadio">
            <input type="radio" id="2.0" name="step" value="2">
            <label for="2.0" class="radio-label">2.0</label>
        </div>



        <div style="margin: 10px auto;width: 100%;">
            <div class="start" title="开启自动阅读">
                开启
            </div>
            <div class="stop" title="关闭自动阅读">
                关闭
            </div>
        </div>

    </div>`

    var styleStr = `<style>
    #auto-reading {
        position: fixed;
        right: -200px;
        top: 100px;
        color:#000000;
        font-size:16px;

        width: 155px;
        padding: 10px;
        background: #ffffff;
        box-shadow: 0 2px 12px 0 rgb(0 0 0 / 10%);
        box-sizing: border-box;
        transition: right 2s ease-out;
        -webkit-transition: right 0.5s ease-in-out;
        -moz-transition: right 2s ease-out;
        -ms-transition: right 2s ease-out;
        -o-transition: right 2s ease-out;

        z-index:1000000;

    }

    #auto-reading.active {
        right: 0px;
    }



    .title {
        font-size: 18px;
        /* text-align: center; */
        display: block;
        width: 100%;
    }

    .hidden {
        cursor: pointer;
        display: inline-block;
    }

    .hidden:hover {
        color: #1296db;
    }

    .start,
    .stop {
        cursor: pointer;
        display: inline-block;
        background: #1296db;
        color: #ffffff;
        padding: 2px 8px;
        border-radius: 7px;
        font-size: 14px;

        text-align: center;
        line-height: 20px;

    }
    .stop{
        margin-left: 12px;
    }

    .start:hover,
    .stop:hover {
        background-color: #1296db;
        box-shadow: 0px 0px 4px 1px #cccccc;
        cursor: pointer;
    }


    .forRadio {
        margin-right: 16px;
        display: inline-block;
        line-height: 19px;
    }

    .forRadio .radio-label {
        cursor: pointer;
    }

    .forRadio input[type="radio"] {
        position: absolute;
        opacity: 0;
    }

    .forRadio input[type="radio"]+.radio-label:before {
        content: "";
        background: #fff;
        border-radius: 100%;
        border: 1px solid #c8c8c8;
        display: inline-block;
        width: 14px;
        height: 14px;
        position: relative;
        margin-right: 8px;
        top: 1.5px;
        vertical-align: top;
        cursor: pointer;
        text-align: center;
        -webkit-transition: all 250ms ease;
        transition: all 250ms ease;
    }

    .forRadio input[type="radio"]+.radio-label:hover:before {
        border: 1px solid #1296db;
    }

    .forRadio input[type="radio"]:checked+.radio-label:before {
        background-color: #1296db;
        box-shadow: inset 0 0 0 3px #f4f4f4;
        border-color: #1296db;
    }

    .forRadio input[type="radio"]:focus+.radio-label:before {
        outline: none;
        border-color: #1296db;
    }

    .forRadio input[type="radio"]:disabled:checked+.radio-label:before {
        box-shadow: inset 0 0 0 3px #f4f4f4;
        border-color: #c8c8c8;
        background: #c8c8c8;
    }

    .forRadio input[type="radio"]:disabled+.radio-label:before {
        border-color: #c8c8c8;
        cursor: not-allowed;
    }

    .forRadio input[type="radio"]:disabled+.radio-label {
        color: #c8c8c8;
        cursor: not-allowed;
    }

    .forRadio input[type="radio"]:disabled:checked+.radio-label {
        color: #c8c8c8;
        cursor: not-allowed;
    }

    .forRadio input[type="radio"]+.radio-label:empty:before {
        margin-right: 0;
    }

    .toggle {
        width: 50px;
        height: 50px;
        background: #1296db;
        position: fixed;
        right: -14px;
        top: 155px;
        border-radius: 33%;
        z-index:1000000;


    }

    .toggle:hover {
        background-color: #1296db;
        box-shadow: 0px 0px 8px 3px #cccccc;
        cursor: pointer;
    }

    .toggle span {
        display: block;
        width: 30px;
        height: 30px;
        font-size: 12px;
        margin: 9px 8px;
        color: #ffffff;
        line-height:17px;

    }

    .line {
        width: 100%;
        height: 1px;
        background-color: #cccccc;
        margin-top: 5px;
    }
</style>`

    console.log('aaa');
    $('body').append(button);
    $('body').append(content);
    $('head').append(styleStr);

    var interval; // 定时器
    var v; // 阅读速度

    $('.start').on('click', function () {
        start();
    })

    $('.stop').on('click', function () {
        stop();
    })

    /**
     * 开始自动阅读
     * */
    function start() {
        if (interval) {
            clearInterval(interval);
        }
        var startPos = $(window).scrollTop();
        var top = 0;
        v = parseFloat($('input[name="step"]:checked').val());

        interval = setInterval(function () {


            top = startPos += v
            window.scrollTo({
                left: 0, // x坐标
                top: top,  // y 坐标
                behavior: 'smooth' // 可选值:smooth、instant、auto
            })
        }, 50)
    }

    /**
     * 停止自动阅读
     */
    function stop() {
        if (interval) {
            clearInterval(interval);
            interval = null;
        }
    }

    /**
     * 改变阅读速度
     */
    $('input:radio[name="step"]').change(function (event) {

        if (interval) {
            start();
        }
    })

    /**
     * 监听鼠标滑动事件
     */
    $(window).on('mousewheel', function (event) {
        console.log(event);
        stop();
    }, function () {
        if (interval) {
            start();
        }
    });


    $('.toggle').click(function (event) {

        $(this).fadeOut();
        $('#auto-reading').addClass('active');
    })

    $('.hidden').click(function () {
        hiddenSetting();
    })

    function hiddenSetting(){
        setTimeout(() => {
            $('.toggle').fadeIn();
        }, 500);
        $('#auto-reading').removeClass('active');
    }

    $(window).scroll(function(){
       if ($(window).scrollTop() + $(window).height() + 5 >= $(document).height()) {
           console.log('bottom');
           clearInterval(interval);
           interval = null;

       }
    });



})();