您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
img-viewer is a script for better picture-viewing experience.
// ==UserScript== // @name img-viewer // @namespace https://sharils.github.io/gist/ // @description img-viewer is a script for better picture-viewing experience. // @match <all_urls> // @version 1.0.0 // @grant none // @noframes // ==/UserScript== (function(global) { "use strict"; var Images = global.Sharils.Images = function() {}; Images.prototype.scrollToNext = function() { var maybeImage, imageRect, viewportHeight; maybeImage = this._next(); if (!maybeImage) { return null; } imageRect = maybeImage.getBoundingClientRect(); viewportHeight = this._viewportHeight(); if (maybeImage.height <= viewportHeight || 0 < maybeImage.top) { maybeImage.scrollIntoView(); } else if (imageRect.bottom <= viewportHeight * 2) { global.scrollBy(0, imageRect.bottom - viewportHeight); } else { global.scrollBy(0, viewportHeight); } return maybeImage; }; Images.prototype.scrollToPrevious = function() { var maybeImage; maybeImage = this._previous(); if (maybeImage) { maybeImage.scrollIntoView(); } return maybeImage; }; Images.prototype._above = function(position, length) { return function(image) { return image.getBoundingClientRect()[position] <= length; }; }; Images.prototype._below = function(position, length) { return function(image) { return length <= image.getBoundingClientRect()[position]; }; }; Images.prototype._compare = function(position, low, high) { return low.getBoundingClientRect()[position] - high.getBoundingClientRect()[position]; }; Images.prototype._documentImages = function() { return [].slice.call(global.document.images); }; Images.prototype._max = function(position) { return function(low, high) { return this._compare(position, low, high) >= 0 ? low : high; }.bind(this); }; Images.prototype._min = function(position) { return function(low, high) { return this._compare(position, low, high) <= 0 ? low : high; }.bind(this); }; Images.prototype._next = function() { var images, maybeImage, partInViewportBelow, viewportBelowTop; viewportBelowTop = this._viewportHeight() + 1; partInViewportBelow = this._below("bottom", viewportBelowTop); images = this._documentImages(); images = images.filter(partInViewportBelow); images = images.filter(this._visible); images = images.filter(this._notFixed); maybeImage = images.length ? images.reduce(this._min("top")) : null; return maybeImage; }; Images.prototype._notFixed = function(image) { var imageTop, notFixed; imageTop = image.getBoundingClientRect().top; global.scrollBy(0, 1); notFixed = imageTop !== image.getBoundingClientRect().top; global.scrollBy(0, -1); return notFixed; }; Images.prototype._previous = function() { var image, imageRect, images, inViewportAbove, maybeImage, partInViewportAbove, viewportAboveTop; partInViewportAbove = this._above("top", -1); images = this._documentImages(); images = images.filter(partInViewportAbove); images = images.filter(this._visible); images = images.filter(this._notFixed); if (!images.length) { return null; } image = images.reduce(this._max("bottom")); imageRect = image.getBoundingClientRect(); viewportAboveTop = imageRect.bottom - this._viewportHeight(); if (imageRect.top <= viewportAboveTop) { return image; } inViewportAbove = this._below("top", viewportAboveTop); images = images.filter(inViewportAbove); maybeImage = images.length ? images.reduce(this._min("top")) : null; return maybeImage; }; Images.prototype._viewportHeight = function() { return global.innerHeight; }; Images.prototype._visible = function(image) { return 0 < image.getBoundingClientRect().height; }; })(this, this.Sharils = this.Sharils || {}); (function(global) { "use strict"; var Controller = global.Sharils.Images.Controller = function(images) { this._onClick = this._onClick.bind(this); this._onImageRightClick = this._onLowerIPress = images.scrollToNext.bind(images); this._onImageLeftClick = this._onUpperIPress = images.scrollToPrevious.bind(images); this._onKeyPress = this._onKeyPress.bind(this); }; Controller.prototype.addEventListeners = function() { global.addEventListener("click", this._onClick); global.addEventListener("keypress", this._onKeyPress); }; Controller.prototype.removeEventListeners = function() { global.removeEventListener("click", this._onClick); global.removeEventListener("keypress", this._onKeyPress); }; Controller.prototype._onClick = function(e) { var imageRect; if (e.target.nodeName !== "IMG") { return; } imageRect = e.target.getBoundingClientRect(); if (e.screenX < imageRect.left + imageRect.width / 2) { this._onImageLeftClick(); } else { this._onImageRightClick(); } }; Controller.prototype._onImageLeftClick = function() { // no operation is intended }; Controller.prototype._onImageRightClick = function() { // no operation is intended }; Controller.prototype._onKeyPress = function(e) { switch(e.charCode) { case 73: this._onUpperIPress(); break; case 105: this._onLowerIPress(); break; } }; Controller.prototype._onLowerIPress = function() { // no operation is intended }; Controller.prototype._onUpperIPress = function() { // no operation is intended }; })(this); if (top === window) { new Sharils.Images.Controller(new Sharils.Images).addEventListeners(); }