您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Adds full screen lightbox feature (with preloading) for imagefap galleries. Just click on image thumbnail from the category or homepage.
当前为
// ==UserScript== // @name Powerfap // @namespace http://tampermonkey.net/ // @version 0.3 // @description Adds full screen lightbox feature (with preloading) for imagefap galleries. Just click on image thumbnail from the category or homepage. // @author Alekc // @match https://www.imagefap.com/* // @require https://cdn.jsdelivr.net/npm/[email protected]/src/simpleLightbox.min.js // @grant none // ==/UserScript== const css_lightbox = ` .slbOverlay, .slbWrapOuter, .slbWrap { position: fixed; top: 0; right: 0; bottom: 0; left: 0; } .slbOverlay { overflow: hidden; z-index: 2000; background-color: #000; opacity: 0.7; -webkit-animation: slbOverlay 0.5s; -moz-animation: slbOverlay 0.5s; animation: slbOverlay 0.5s; } .slbWrapOuter { overflow-x: hidden; overflow-y: auto; z-index: 2010; } .slbWrap { position: absolute; text-align: center; } .slbWrap:before { content: ""; display: inline-block; height: 100%; vertical-align: middle; } .slbContentOuter { position: relative; display: inline-block; vertical-align: middle; margin: 0px auto; padding: 0 1em; box-sizing: border-box; z-index: 2020; text-align: left; max-width: 100%; } .slbContentEl .slbContentOuter { padding: 5em 1em; } .slbContent { position: relative; } .slbContentEl .slbContent { -webkit-animation: slbEnter 0.3s; -moz-animation: slbEnter 0.3s; animation: slbEnter 0.3s; background-color: #fff; box-shadow: 0 0.2em 1em rgba(0, 0, 0, 0.4); } .slbImageWrap { -webkit-animation: slbEnter 0.3s; -moz-animation: slbEnter 0.3s; animation: slbEnter 0.3s; position: relative; } .slbImageWrap:after { content: ""; position: absolute; left: 0; right: 0; top: 5em; bottom: 5em; display: block; z-index: -1; box-shadow: 0 0.2em 1em rgba(0, 0, 0, 0.6); background-color: #FFF; } .slbDirectionNext .slbImageWrap { -webkit-animation: slbEnterNext 0.4s; -moz-animation: slbEnterNext 0.4s; animation: slbEnterNext 0.4s; } .slbDirectionPrev .slbImageWrap { -webkit-animation: slbEnterPrev 0.4s; -moz-animation: slbEnterPrev 0.4s; animation: slbEnterPrev 0.4s; } .slbImage { width: auto; max-width: 100%; height: auto; display: block; line-height: 0; box-sizing: border-box; padding: 5em 0; margin: 0 auto; } .slbCaption { display: inline-block; max-width: 100%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; word-wrap: normal; font-size: 1.4em; position: absolute; left: 0; right: 0; bottom: 0; padding: 0.71429em 0; color: #fff; color: rgba(255, 255, 255, 0.7); text-align: center; } .slbCloseBtn, .slbArrow { margin: 0; padding: 0; border: 0; cursor: pointer; background: none; } .slbCloseBtn::-moz-focus-inner, .slbArrow::-moz-focus-inner { padding: 0; border: 0; } .slbCloseBtn:hover, .slbArrow:hover { opacity: 0.5; } .slbCloseBtn:active, .slbArrow:active { opacity: 0.8; } .slbCloseBtn { -webkit-animation: slbEnter 0.3s; -moz-animation: slbEnter 0.3s; animation: slbEnter 0.3s; font-size: 3em; width: 1.66667em; height: 1.66667em; line-height: 1.66667em; position: absolute; right: -0.33333em; top: 0; color: #fff; color: rgba(255, 255, 255, 0.7); text-align: center; } .slbLoading .slbCloseBtn { display: none; } .slbLoadingText { font-size: 1.4em; color: #fff; color: rgba(255, 255, 255, 0.9); } .slbArrows { position: fixed; top: 50%; left: 0; right: 0; } .slbLoading .slbArrows { display: none; } .slbArrow { position: absolute; top: 50%; margin-top: -5em; width: 5em; height: 10em; opacity: 0.7; text-indent: -999em; overflow: hidden; } .slbArrow:before { content: ""; position: absolute; top: 50%; left: 50%; margin: -0.8em 0 0 -0.8em; border: 0.8em solid transparent; } .slbArrow.next { right: 0; } .slbArrow.next:before { border-left-color: #fff; } .slbArrow.prev { left: 0; } .slbArrow.prev:before { border-right-color: #fff; } .slbIframeCont { width: 80em; height: 0; overflow: hidden; padding-top: 56.25%; margin: 5em 0; } .slbIframe { position: absolute; top: 0; left: 0; width: 100%; height: 100%; box-shadow: 0 0.2em 1em rgba(0, 0, 0, 0.6); background: #000; } @-webkit-keyframes slbOverlay { from { opacity: 0; } to { opacity: 0.7; } } @-moz-keyframes slbOverlay { from { opacity: 0; } to { opacity: 0.7; } } @keyframes slbOverlay { from { opacity: 0; } to { opacity: 0.7; } } @-webkit-keyframes slbEnter { from { opacity: 0; -webkit-transform: translate3d(0, -1em, 0); } to { opacity: 1; -webkit-transform: translate3d(0, 0, 0); } } @-moz-keyframes slbEnter { from { opacity: 0; -moz-transform: translate3d(0, -1em, 0); } to { opacity: 1; -moz-transform: translate3d(0, 0, 0); } } @keyframes slbEnter { from { opacity: 0; -webkit-transform: translate3d(0, -1em, 0); -moz-transform: translate3d(0, -1em, 0); -ms-transform: translate3d(0, -1em, 0); -o-transform: translate3d(0, -1em, 0); transform: translate3d(0, -1em, 0); } to { opacity: 1; -webkit-transform: translate3d(0, 0, 0); -moz-transform: translate3d(0, 0, 0); -ms-transform: translate3d(0, 0, 0); -o-transform: translate3d(0, 0, 0); transform: translate3d(0, 0, 0); } } @-webkit-keyframes slbEnterNext { from { opacity: 0; -webkit-transform: translate3d(4em, 0, 0); } to { opacity: 1; -webkit-transform: translate3d(0, 0, 0); } } @-moz-keyframes slbEnterNext { from { opacity: 0; -moz-transform: translate3d(4em, 0, 0); } to { opacity: 1; -moz-transform: translate3d(0, 0, 0); } } @keyframes slbEnterNext { from { opacity: 0; -webkit-transform: translate3d(4em, 0, 0); -moz-transform: translate3d(4em, 0, 0); -ms-transform: translate3d(4em, 0, 0); -o-transform: translate3d(4em, 0, 0); transform: translate3d(4em, 0, 0); } to { opacity: 1; -webkit-transform: translate3d(0, 0, 0); -moz-transform: translate3d(0, 0, 0); -ms-transform: translate3d(0, 0, 0); -o-transform: translate3d(0, 0, 0); transform: translate3d(0, 0, 0); } } @-webkit-keyframes slbEnterPrev { from { opacity: 0; -webkit-transform: translate3d(-4em, 0, 0); } to { opacity: 1; -webkit-transform: translate3d(0, 0, 0); } } @-moz-keyframes slbEnterPrev { from { opacity: 0; -moz-transform: translate3d(-4em, 0, 0); } to { opacity: 1; -moz-transform: translate3d(0, 0, 0); } } @keyframes slbEnterPrev { from { opacity: 0; -webkit-transform: translate3d(-4em, 0, 0); -moz-transform: translate3d(-4em, 0, 0); -ms-transform: translate3d(-4em, 0, 0); -o-transform: translate3d(-4em, 0, 0); transform: translate3d(-4em, 0, 0); } to { opacity: 1; -webkit-transform: translate3d(0, 0, 0); -moz-transform: translate3d(0, 0, 0); -ms-transform: translate3d(0, 0, 0); -o-transform: translate3d(0, 0, 0); transform: translate3d(0, 0, 0); } } .lds-ellipsis { display: inline-block; position: relative; width: 64px; height: 64px; } .lds-ellipsis div { position: absolute; top: 27px; width: 11px; height: 11px; border-radius: 50%; background: #fff; animation-timing-function: cubic-bezier(0, 1, 1, 0); } .lds-ellipsis div:nth-child(1) { left: 6px; animation: lds-ellipsis1 0.6s infinite; } .lds-ellipsis div:nth-child(2) { left: 6px; animation: lds-ellipsis2 0.6s infinite; } .lds-ellipsis div:nth-child(3) { left: 26px; animation: lds-ellipsis2 0.6s infinite; } .lds-ellipsis div:nth-child(4) { left: 45px; animation: lds-ellipsis3 0.6s infinite; } @keyframes lds-ellipsis1 { 0% { transform: scale(0); } 100% { transform: scale(1); } } @keyframes lds-ellipsis3 { 0% { transform: scale(1); } 100% { transform: scale(0); } } @keyframes lds-ellipsis2 { 0% { transform: translate(0, 0); } 100% { transform: translate(19px, 0); } } #overlay { display:none; } #overlay .lds-ellipsis { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); } `; const loadingSplashScreenHtml = `<div id='overlay' class="slbOverlay"><div class="lds-ellipsis"><div></div><div></div><div></div><div></div></div></div>` var $ = window.$; const galRegex = /\/photo\/(\d+)/m; const homeRegex = /image\.php\?id=(\d+)/m; var preloadedImages = []; var lightBox; (function() { 'use strict'; //prepare lightBox $("body").append("<style>" + css_lightbox + "</style>" + loadingSplashScreenHtml); //link from category page $("img.gal_thumb").parent("a").click(function(){ event.preventDefault(); showOverlay(); var match = galRegex.exec($(this).attr("href")); if (match == null){ alert("can't find photo id"); return; } var galId = $(this).closest("tr[valign='top']").prev().attr("id"); var photoId = match[1]; run(photoId, galId,[]); }); $('a[href*="image.php?id="]').click(function(){ event.preventDefault(); showOverlay(); var match = homeRegex.exec($(this).attr("href")); if (match == null){ alert("can't find photo id"); return; } var galId = $(this).closest("tr:not([bgcolor])").prev().attr("id"); var photoId = match[1]; run(photoId, galId,[]); }); // })(); function showOverlay(){ $("#overlay").show(); } function hideOverlay(){ $("#overlay").hide(); } function run(photoId, galId, result){ var url = "https://www.imagefap.com/photo/"+ photoId +"/?gid=" + galId + "&idx=" + result.length + "&partial=true"; $.ajax({ url: url, type: "GET", dataType: "html", success: function(data) { var newLinks = []; $(data).find("a").each(function(){ newLinks.push($(this).attr("href")); }); result = result.concat(newLinks); if (newLinks.length == 0 || newLinks.length < 24) { //todo: generate library generateLightBox(result); return; } run(photoId, galId, result); }, error: function(jqXHR, textStatus,errorThrown ){ alert("Error: "+ textStatus + " (" + errorThrown + ")"); hideOverlay(); } }); } function generateLightBox(result){ lightBox = SimpleLightbox.open({ items: result }); //$(lightBox.$content).parent().find("button.next").click(preloadNextSlide); lightBox.next = function (event){ this.showPosition(this.currentPosition + 1); var preloadCount = 5; if (this.currentPosition + preloadCount <= this.items.length){ preloadImage(this.items[this.currentPosition + preloadCount]); } } //preload first x for (var i = 1; i<6;i++){ preloadImage(result[i]); } hideOverlay(); lightBox.show(); } function preloadImage(href){ if (href === 'undefined' || typeof(preloadedImages[href]) !== 'undefined'){ return; } preloadedImages[href] = new Image(); preloadedImages[href].src = href; }