Civitai - Image & Video Hover

Mouse over videos&images to view full size

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

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

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

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

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name         Civitai - Image & Video Hover
// @namespace    http://tampermonkey.net/
// @version      1.0
// @description  Mouse over videos&images to view full size
// @author       gfish
// @license      MIT
// @match        https://civitai.com/*
// @require      http://code.jquery.com/jquery-3.4.1.min.js
// @compatible   firefox
// @compatible   chrome
// @compatible   edge
// ==/UserScript==

(function() {
    document.body.insertAdjacentHTML('afterbegin', "<img id='img_hover_container' style='float:left; pointer-events:none; position:absolute; max-width:200px; overflow:hidden; z-index:9999;' src=''>")
    document.body.insertAdjacentHTML('afterbegin', "<video id='vid_hover_container' style='float:left; pointer-events:none; position:absolute; max-width:200px; overflow:hidden; z-index:9999; visibility:hidden;' src='' loop autoplay='true' muted='true'>")
    let vid = document.getElementById('vid_hover_container')

    let bEnter = false;
    let img_type = "jpg";
    let mainRoutine = setInterval((e) => {
        [...document.getElementsByTagName('img'), ...document.getElementsByTagName('video')].forEach((el) => {
            if (el.xhover !== true) {
                el.xhover = true;
                el.addEventListener("mouseenter", (event) => {
                    bEnter = true;
                    img_type = "jpg"
                    $("#img_hover_container").attr("src", el.currentSrc.replace("width=","original=true,width0="))
                    $("#vid_hover_container").css("visibility","visible")
                    $("#vid_hover_container").attr("src", el.currentSrc.replace("width=","original=true,width0=").replace("anim=false","anim=true").replace(".jpeg",".webm"))
                    vid.load()
                    console.log(el.currentSrc, '  |  ', vid.src)
                })
                el.addEventListener("mouseleave", (event) => {
                    bEnter = false;
                    $("#img_hover_container").attr("src", "")
                    vid.pause();
                    vid.removeAttribute('src'); // empty source
                    vid.load();
                })
            }
        });
    }, 100);

    let currentMousePos = { x: -1, y: -1 };
    $(document).mousemove(function(event) {
        currentMousePos.x = event.pageX;
        currentMousePos.y = event.pageY;
        update_pos();
    });

    let mouse_offset_x = 16;
    let mouse_offset_x2 = 16;
    let mouse_offset_y = 16;
    let mouse_offset_y2 = 16;
    let mouse_side = false;
    function update_pos(){
        //Mouse Horizontal
        if(currentMousePos.x > ($(window).width()/2))
        {
            mouse_side = true;
            mouse_offset_x = -$("#img_hover_container").width() - 16;
            mouse_offset_x2 = -$("#vid_hover_container").width() - 16;
            $("#img_hover_container").css("max-width", currentMousePos.x - 16)
            $("#vid_hover_container").css("max-width", currentMousePos.x - 16)
        }
        else
        {
            mouse_side = false;
            mouse_offset_x = 16;
            mouse_offset_x2 = 16;
            $("#img_hover_container").css("max-width", $(window).width()-currentMousePos.x)
            $("#vid_hover_container").css("max-width", $(window).width()-currentMousePos.x)
        }

        //Mouse Vertical
        if(currentMousePos.y > ($(window).height() - $("#img_hover_container").height()))
        {
            mouse_offset_y = ($(window).height() - $("#img_hover_container").height()) + $(document).scrollTop();
        }
        else
        {
            mouse_offset_y = currentMousePos.y + 16;
        }
        if(currentMousePos.y > ($(window).height() - $("#vid_hover_container").height()))
        {
            mouse_offset_y2 = ($(window).height() - $("#vid_hover_container").height()) + $(document).scrollTop();
        }
        else
        {
            mouse_offset_y2 = currentMousePos.y + 16;
        }

        $("#img_hover_container").offset({
            top: mouse_offset_y,
            left: currentMousePos.x + mouse_offset_x
        });
        $("#vid_hover_container").offset({
            top: mouse_offset_y2,
            left: currentMousePos.x + mouse_offset_x2
        });

        if (bEnter) {
            if (vid.src !== "" && vid.currentTime > 0) {
                $("#vid_hover_container").css('visibility','visible');
                $("#img_hover_container").css("visibility","hidden");
            }
            else {
                $("#vid_hover_container").css("visibility","hidden");
                $("#img_hover_container").css("visibility","visible");
            }
        }
        else {
            $("#vid_hover_container").css('visibility','hidden');
            $("#img_hover_container").css("visibility","hidden");
        }
    }

    //Update image position periodically
    var intervalID = setInterval(function(){update_pos();}, 100);

    //image type handler
    $("#img_hover_container").on('error', function(er)
    {
        if(img_type == "jpg")
        {
            $("#img_hover_container").attr("src", $("#img_hover_container").attr("src").replace(".jpg",".png"))
            img_type = "png";
        }
        else if(img_type == "png")
        {
            $("#img_hover_container").attr("src", $("#img_hover_container").attr("src").replace(".png",".jpeg"))
            img_type = "jpeg";
        }
        else if(img_type == "jpeg")
        {
            $("#img_hover_container").attr("src", $("#img_hover_container").attr("src").replace(".jpeg",".gif"))
            img_type = "gif";
        }
    })
    $("#vid_hover_container").on('error', function(er)
    {
        if (vid.src.includes('original=true,'))
        {
            $("#vid_hover_container").attr("src", vid.src.replace("original=true,","").replace("skip=,","skip0="))
            vid.load()
        }
    })

    $("#img_hover_container").css("max-height", $(window).height())
    $("#vid_hover_container").css("max-height", $(window).height())
    window?.navigation.addEventListener("navigate", (event) => {
        console.log('nav')
        bEnter = false;
        $("#img_hover_container").attr("src", "")
        vid.pause();
        vid.removeAttribute('src'); // empty source
        vid.load();
    })
})();