您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Arrange Imgur upload posts in a grid layout.
当前为
- // ==UserScript==
- // @name Imgur Upload Posts Grid Layout
- // @namespace http://tampermonkey.net/
- // @version 0.3
- // @description Arrange Imgur upload posts in a grid layout.
- // @author Byakuran
- // @match https://imgur.com/a/*
- // @icon https://www.google.com/s2/favicons?sz=64&domain=imgur.com
- // @grant none
- // ==/UserScript==
- (function() {
- 'use strict';
- // Create and inject CSS
- const style = document.createElement('style');
- style.textContent = `
- /* Toggle button styles */
- #gridLayoutToggle {
- position: fixed;
- top: 20px;
- right: 20px;
- z-index: 9999;
- padding: 8px 16px;
- background: #1bb76e;
- color: white;
- border: none;
- border-radius: 4px;
- cursor: pointer;
- font-size: 14px;
- transition: background 0.3s;
- }
- #gridLayoutToggle:hover {
- background: #159157;
- }
- /* Grid layout styles */
- .has-min-posts .UploadPost {
- width: auto !important;
- margin-left: 20px !important;
- }
- .has-min-posts .Upload-container > :nth-child(2):not(.UploadPost) {
- margin-right: 40px !important;
- }
- .has-min-posts .UploadPost-files > .PostContent.UploadPost-file {
- flex: 0 0 auto;
- width: calc(33.33% - 10px);
- min-width: 200px;
- margin: 0 !important;
- }
- .has-min-posts .UploadPost-files {
- display: flex;
- flex-wrap: wrap;
- gap: 10px;
- padding: 10px;
- }
- .has-min-posts .UploadPost-files > :first-child:not(.PostContent.UploadPost-file),
- .has-min-posts .UploadPost-files > :last-child:not(.PostContent.UploadPost-file) {
- width: 100% !important;
- flex: none !important;
- }
- .ImageDescription {
- max-height: 2.4em;
- overflow: hidden;
- position: relative;
- cursor: pointer;
- transition: max-height 0.3s ease-out;
- padding-right: 25px;
- }
- .ImageDescription.expanded {
- max-height: 1000px;
- }
- .ImageDescription::after {
- content: "▼";
- position: absolute;
- bottom: 0;
- right: 0;
- background: linear-gradient(90deg, transparent, #1a3c6e 20%);
- padding: 0 5px;
- color: white;
- }
- .ImageDescription.expanded::after {
- content: "▲";
- background: linear-gradient(90deg, transparent, #1a3c6e 20%);
- color: white;
- }
- `;
- document.head.appendChild(style);
- // Create toggle button
- const toggleButton = document.createElement('button');
- toggleButton.id = 'gridLayoutToggle';
- toggleButton.textContent = 'Disable Grid Layout';
- document.body.appendChild(toggleButton);
- // Get layout preference from localStorage
- let isGridEnabled = localStorage.getItem('imgurGridLayout') !== 'disabled';
- // Function to reset grid application state
- function resetGridState() {
- const containers = document.querySelectorAll('.UploadPost-files');
- containers.forEach(container => {
- container.removeAttribute('data-grid-applied');
- });
- }
- // Update button text and layout based on current state
- function updateLayoutState() {
- toggleButton.textContent = isGridEnabled ? 'Disable Grid Layout' : 'Enable Grid Layout';
- document.body.classList.remove('has-min-posts');
- resetGridState();
- if (isGridEnabled) {
- applyChanges();
- }
- }
- // Toggle button click handler
- toggleButton.addEventListener('click', () => {
- isGridEnabled = !isGridEnabled;
- localStorage.setItem('imgurGridLayout', isGridEnabled ? 'enabled' : 'disabled');
- updateLayoutState();
- });
- function makeDescriptionsExpandable() {
- const descriptions = document.querySelectorAll('.ImageDescription:not([data-expandable])');
- descriptions.forEach(desc => {
- desc.setAttribute('data-expandable', 'true');
- desc.addEventListener('click', function() {
- this.classList.toggle('expanded');
- });
- });
- }
- // Function to apply layout and make descriptions expandable
- function applyChanges() {
- if (!isGridEnabled) return;
- const containers = document.querySelectorAll('.UploadPost-files');
- containers.forEach(container => {
- if (!container.dataset.gridApplied) {
- const posts = container.querySelectorAll(':scope > .PostContent.UploadPost-file');
- if (posts.length >= 3) {
- container.dataset.gridApplied = 'true';
- document.body.classList.add('has-min-posts');
- }
- }
- });
- makeDescriptionsExpandable();
- }
- // Initial application
- updateLayoutState();
- // Monitor for dynamic content
- const observer = new MutationObserver((mutations) => {
- mutations.forEach((mutation) => {
- if (mutation.addedNodes.length) {
- applyChanges();
- }
- });
- });
- observer.observe(document.body, {
- childList: true,
- subtree: true
- });
- })();