🏠 Home 

Furaffinity-Loading-Animations

Library for creating different loading animations on Furaffinity

สคริปต์นี้ไม่ควรถูกติดตั้งโดยตรง มันเป็นคลังสำหรับสคริปต์อื่น ๆ เพื่อบรรจุด้วยคำสั่งเมทา // @require https://update.greasyfork.org/scripts/485153/1549461/Furaffinity-Loading-Animations.js

// ==UserScript==
// @name        Furaffinity-Loading-Animations
// @namespace   Violentmonkey Scripts
// @require     https://update.greasyfork.org/scripts/525666/1549449/Furaffinity-Prototype-Extensions.js
// @grant       none
// @version     1.2.1
// @author      Midori Dragon
// @description Library for creating different loading animations on Furaffinity
// @icon        https://www.furaffinity.net/themes/beta/img/banners/fa_logo.png
// @license     MIT
// @homepageURL https://greasyfork.org/scripts/485153-furaffinity-loading-animations
// @supportURL  https://greasyfork.org/scripts/485153-furaffinity-loading-animations/feedback
// ==/UserScript==
// jshint esversion: 8
(() => {
"use strict";
class LoadingBar {
constructor(baseElem) {
this._delay = 2e3;
this._loadingBar = document.createElement("div");
if (!document.getElementById("flaloadingbarstyle")) {
const style = document.createElement("style");
style.id = "flaloadingbarstyle";
style.innerHTML = "@keyframes gradient { 0% { background-position: 0 0; } 100% { background-position: -200% 0; } }";
document.head.appendChild(style);
}
this._baseElem = baseElem;
this._baseElem.appendChild(this._loadingBar);
this.updateBaseElem();
}
get baseElem() {
return this._baseElem;
}
set baseElem(value) {
if (this._baseElem !== value) {
this._baseElem = value;
this.updateBaseElem();
}
}
get delay() {
return this._delay;
}
set delay(value) {
if (this._delay !== value) {
this._delay = value;
this._loadingBar.style.animation = `gradient ${this._delay / 1e3}s infinite`;
}
}
get text() {
var _a;
return null !== (_a = this._loadingBar.textContent) && void 0 !== _a ? _a : "";
}
set text(value) {
if (this._loadingBar.textContent !== value) this._loadingBar.textContent = value;
}
get cornerRadius() {
return parseFloat(this._loadingBar.style.borderRadius.trimEnd("px"));
}
set cornerRadius(value) {
if (parseFloat(this._loadingBar.style.borderRadius.trimEnd("px")) !== value) this._loadingBar.style.borderRadius = value + "px";
}
get height() {
return parseFloat(this._loadingBar.style.height.trimEnd("px"));
}
set height(value) {
if (parseFloat(this._loadingBar.style.height.trimEnd("px")) !== value) {
this._loadingBar.style.height = value + "px";
this._loadingBar.style.lineHeight = value + "px";
}
}
get fontSize() {
return parseFloat(this._loadingBar.style.fontSize.trimEnd("px"));
}
set fontSize(value) {
if (parseFloat(this._loadingBar.style.fontSize.trimEnd("px")) !== value) if (null != value) this._loadingBar.style.fontSize = value + "px"; else this._loadingBar.style.fontSize = "";
}
get gradient() {
return this._loadingBar.style.background;
}
set gradient(value) {
if (this._loadingBar.style.background !== value) this._loadingBar.style.background = value;
}
get visible() {
return "none" !== this._loadingBar.style.display;
}
set visible(value) {
if (this._loadingBar.style.display !== (value ? "block" : "none")) this._loadingBar.style.display = value ? "block" : "none";
}
dispose() {
this.visible = false;
this._baseElem.removeChild(this._loadingBar);
}
updateBaseElem() {
this._loadingBar.className = "fla-loadingbar";
this._loadingBar.textContent = this.text;
this._loadingBar.style.width = "100%";
this._loadingBar.style.height = "60px";
this._loadingBar.style.lineHeight = this.height + "px";
this._loadingBar.style.textShadow = "-1px -1px 0 #000000, 1px -1px 0 #000000, -1px 1px 0 #000000, 1px 1px 0 #000000";
this._loadingBar.style.fontSize = "15px";
this._loadingBar.style.background = "repeating-linear-gradient(to right, rgba(255,10,3,1) 0%, rgba(255,139,6,1) 8%, rgba(253,228,11,1) 16%, rgba(127,236,12,1) 26%, rgba(32,225,207,1) 36%, rgba(140,60,223,1) 46%, rgba(140,60,223,1) 54%, rgba(32,225,207,1) 64%, rgba(127,236,12,1) 74%, rgba(253,228,11,1) 84%, rgba(255,139,6,1) 92%, rgba(255,10,3,1) 100%)";
this._loadingBar.style.backgroundSize = "200% auto";
this._loadingBar.style.backgroundPosition = "0 100%";
this._loadingBar.style.animation = `gradient ${this.delay / 1e3}s infinite`;
this._loadingBar.style.animationFillMode = "forwards";
this._loadingBar.style.animationTimingFunction = "linear";
this._loadingBar.style.display = "none";
}
}
class LoadingImage {
constructor(baseElem) {
this.delay = 100;
this.doScaleImage = true;
this.scaleChange = .05;
this.scaleChangeMax = 1.2;
this.scaleChangeMin = .8;
this.doRotateImage = true;
this.rotateDegrees = 5;
this._isGrowing = true;
this._scale = 1;
this._rotation = 0;
this._size = 60;
this._image = document.createElement("img");
this._image.src = "https://www.furaffinity.net/themes/beta/img/banners/fa_logo.png";
this._imageContainer = document.createElement("div");
this._baseElem = baseElem;
this._imageContainer.appendChild(this._image);
this._baseElem.appendChild(this._imageContainer);
this.updateBaseElem();
}
get baseElem() {
return this._baseElem;
}
set baseElem(value) {
if (this._baseElem !== value) {
this._baseElem = value;
this.updateBaseElem();
}
}
get imageSrc() {
return this._image.src;
}
set imageSrc(value) {
if (this._image.src !== value) this._image.src = value;
}
get rotation() {
return this._rotation;
}
set rotation(value) {
if (this._rotation !== value) {
this._rotation = value;
this._image.style.transform = `scale(${this._scale}) rotate(${this._rotation}deg)`;
}
}
get scale() {
return this._scale;
}
set scale(value) {
if (this._scale !== value) {
this._scale = value;
this._image.style.transform = `scale(${this._scale}) rotate(${this._rotation}deg)`;
}
}
get size() {
return parseFloat(this._imageContainer.style.width.trimEnd("px"));
}
set size(value) {
if (parseFloat(this._imageContainer.style.width.trimEnd("px")) !== value) {
this._imageContainer.style.width = this._size + "px";
this._imageContainer.style.height = this._size + "px";
}
}
get visible() {
return "none" !== this._imageContainer.style.display;
}
set visible(value) {
if (this._imageContainer.style.display !== (value ? "block" : "none")) {
this._imageContainer.style.display = value ? "block" : "none";
if (value) this._intervalId = setInterval((() => {
this.updateAnimationFrame();
}), this.delay); else clearInterval(this._intervalId);
}
}
get isGrowing() {
return this._isGrowing;
}
set isGrowing(value) {
if (this._isGrowing !== value) this._isGrowing = value;
}
dispose() {
this.visible = false;
this._baseElem.removeChild(this._imageContainer);
}
updateBaseElem() {
this._imageContainer.className = "fla-loading-image-container";
this._imageContainer.style.position = "relative";
this._imageContainer.style.width = this.size + "px";
this._imageContainer.style.height = this.size + "px";
this._imageContainer.style.left = "50%";
this._imageContainer.style.transform = "translateX(-50%)";
this._imageContainer.style.display = "none";
this._image.className = "fla-loading-image";
this._image.src = this.imageSrc;
this._image.style.width = "100%";
this._image.style.height = "100%";
this._image.style.transition = "transform 0.5s ease-in-out";
}
updateAnimationFrame() {
if (this.isGrowing) {
this._scale += this.scaleChange;
this._rotation += this.rotateDegrees;
} else {
this._scale -= this.scaleChange;
this._rotation -= this.rotateDegrees;
}
if (this._scale >= this.scaleChangeMax || this._scale <= this.scaleChangeMin) this.isGrowing = !this.isGrowing;
this._image.style.transform = `scale(${this._scale}) rotate(${this._rotation}deg)`;
}
}
class LoadingSpinner {
constructor(baseElem) {
this._delay = 1e3;
this._size = 60;
this._spinnerThickness = 4;
this._spinnerLength = 1;
this._linearSpin = false;
this._animationCurve = "cubic-bezier(.53,.24,.46,.83)";
this._forecolorHex = "#8941de";
this._backcolorHex = "#f3f3f3";
this._spinner = document.createElement("div");
this._spinnerContainer = document.createElement("div");
if (!document.getElementById("flaspinnerstyle")) {
const style = document.createElement("style");
style.id = "flaspinnerstyle";
style.innerHTML = "@keyframes spin { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } }";
document.head.appendChild(style);
}
this._baseElem = baseElem;
this._spinnerContainer.appendChild(this._spinner);
this._baseElem.appendChild(this._spinnerContainer);
this.updateBaseElem();
}
get baseElem() {
return this._baseElem;
}
set baseElem(value) {
if (this._baseElem !== value) {
this._baseElem = value;
this.updateBaseElem();
}
}
get delay() {
return this._delay;
}
set delay(value) {
if (this._delay !== value) {
this._delay = value;
this._spinner.style.animation = `spin ${this._delay / 1e3}s ${this.animationCurve} infinite`;
}
}
get linearSpin() {
return this._linearSpin;
}
set linearSpin(value) {
if (this._linearSpin !== value) {
this._linearSpin = value;
this._animationCurve = this._linearSpin ? "linear" : "cubic-bezier(.53,.24,.46,.83)";
this._spinner.style.animation = `spin ${this.delay / 1e3}s ${this.animationCurve} infinite`;
}
}
get animationCurve() {
return this._animationCurve;
}
set animationCurve(value) {
if (this._animationCurve !== value) {
this._animationCurve = value;
this._linearSpin = "linear" === this._animationCurve;
this._spinner.style.animation = `spin ${this.delay / 1e3}s ${this.animationCurve} infinite`;
}
}
get size() {
return this._size;
}
set size(value) {
if (this._size !== value) {
this._size = value;
this.updateSize();
}
}
get spinnerThickness() {
return this._spinnerThickness;
}
set spinnerThickness(value) {
if (this._spinnerThickness !== value) {
this._spinnerThickness = value;
this.updateSpinnerBorders();
this.updateSize();
}
}
get spinnerLength() {
return this._spinnerLength;
}
set spinnerLength(value) {
if (this._spinnerLength !== value) {
this._spinnerLength = value;
this.updateSpinnerBorders();
}
}
get forecolorHex() {
return this._forecolorHex;
}
set forecolorHex(value) {
if (this._forecolorHex !== value) {
if (!value.startsWith("#")) value = "#" + value;
this._forecolorHex = value;
this.updateSpinnerBorders();
}
}
get backcolorHex() {
return this._backcolorHex;
}
set backcolorHex(value) {
if (this._backcolorHex !== value) {
if (!value.startsWith("#")) value = "#" + value;
this._backcolorHex = value;
this.updateSpinnerBorders();
}
}
get visible() {
return "none" !== this._spinnerContainer.style.display;
}
set visible(value) {
if (this._spinnerContainer.style.display !== (value ? "block" : "none")) this._spinnerContainer.style.display = value ? "block" : "none";
}
dispose() {
this.visible = false;
this._baseElem.removeChild(this._spinnerContainer);
}
updateSize() {
this._spinnerContainer.style.width = this.size + "px";
this._spinnerContainer.style.height = this.size + "px";
this._spinner.style.width = this.size - 2 * this.spinnerThickness + "px";
this._spinner.style.height = this.size - 2 * this.spinnerThickness + "px";
}
updateSpinnerBorders() {
this._spinner.style.border = this.spinnerThickness + "px solid " + this.backcolorHex;
if (this.spinnerLength >= 4) this._spinner.style.borderLeft = this.spinnerThickness + "px solid " + this._forecolorHex; else if (this.spinnerLength >= 3) this._spinner.style.borderBottom = this.spinnerThickness + "px solid " + this._forecolorHex; else if (this.spinnerLength >= 2) this._spinner.style.borderRight = this.spinnerThickness + "px solid " + this._forecolorHex; else if (this.spinnerLength >= 1) this._spinner.style.borderTop = this.spinnerThickness + "px solid " + this._forecolorHex;
}
updateBaseElem() {
this._spinnerContainer.className = "fla-spinner-container";
this._spinnerContainer.style.position = "relative";
this._spinnerContainer.style.width = this.size + "px";
this._spinnerContainer.style.height = this.size + "px";
this._spinnerContainer.style.left = "50%";
this._spinnerContainer.style.transform = "translateX(-50%)";
this._spinnerContainer.style.display = "none";
this._spinner.className = "fla-spinner";
this.updateSpinnerBorders();
this._spinner.style.borderRadius = "50%";
this._spinner.style.position = "relative";
this._spinner.style.width = this.size - 2 * this.spinnerThickness + "px";
this._spinner.style.height = this.size - 2 * this.spinnerThickness + "px";
this._spinner.style.animation = `spin ${this.delay / 1e3}s ${this.animationCurve} infinite`;
this.updateSize();
}
}
class LoadingTextSpinner {
constructor(baseElem) {
this._characters = [ "◜", "◠", "◝", "◞", "◡", "◟" ];
this._delay = 600;
this._currIndex = -1;
this._spinner = document.createElement("div");
this._baseElem = baseElem;
this._baseElem.appendChild(this._spinner);
this.updateBaseElem();
}
get baseElem() {
return this._baseElem;
}
set baseElem(value) {
if (this._baseElem !== value) {
this._baseElem = value;
this.updateBaseElem();
}
}
get fontSize() {
return parseFloat(this._spinner.style.fontSize.trimEnd("px"));
}
set fontSize(value) {
if (parseFloat(this._spinner.style.fontSize.trimEnd("px")) !== value) this._spinner.style.fontSize = value + "px";
}
get visible() {
return "none" !== this._spinner.style.display;
}
set visible(value) {
if (this._spinner.style.display !== (value ? "block" : "none")) {
this._spinner.style.display = value ? "block" : "none";
if (value) this.start(); else this.stop();
}
}
get delay() {
return this._delay;
}
set delay(value) {
if (this._delay !== value) {
this._delay = value;
if (this.visible) {
this.stop();
this.start();
}
}
}
get characters() {
return this._characters;
}
set characters(value) {
if (this._characters !== value) {
this._characters = value;
if (this.visible) {
this.stop();
this.start();
}
}
}
dispose() {
this.visible = false;
this._baseElem.removeChild(this._spinner);
}
start() {
if (null == this._intervalId && 0 !== this._characters.length) {
if (this._currIndex < 0) this._currIndex = 0;
this._prevContainerTextContent = function removeTextNodes(targetElement) {
let removedText = "";
!function traverseAndRemoveTextNodes(node) {
var _a;
for (let i = node.childNodes.length - 1; i >= 0; i--) {
const child = node.childNodes[i];
if (child.nodeType === Node.TEXT_NODE) {
removedText += (null !== (_a = child.textContent) && void 0 !== _a ? _a : "") + "\n";
node.removeChild(child);
}
}
}(targetElement);
return removedText;
}(this._baseElem);
this._spinner.textContent = "⠀⠀";
this._intervalId = setInterval((() => {
if (this._currIndex >= this.characters.length) this._currIndex = 0;
this._spinner.textContent = this.characters[this._currIndex];
this._currIndex++;
}), this.delay / this.characters.length);
}
}
stop() {
var _a;
if (null != this._intervalId) {
clearInterval(this._intervalId);
this._baseElem.textContent = null !== (_a = this._prevContainerTextContent) && void 0 !== _a ? _a : null;
this._intervalId = void 0;
}
}
updateBaseElem() {
this._spinner.className = "fla-text-spinner";
this._spinner.style.display = "none";
this._spinner.style.fontSize = "15px";
}
}
Object.defineProperties(window, {
FALoadingSpinner: {
get: () => LoadingSpinner
},
FALoadingTextSpinner: {
get: () => LoadingTextSpinner
},
FALoadingImage: {
get: () => LoadingImage
},
FALoadingBar: {
get: () => LoadingBar
}
});
})();