您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
13/12/2024, 21:55:28
- // ==UserScript==
- // @name 4chan post image grid
- // @namespace Violentmonkey Scripts
- // @match https://boards.4chan.org/*
- // @grant none
- // @version 1.0
- // @author Anon
- // @description 13/12/2024, 21:55:28
- // ==/UserScript==
- let imageGrid = null;
- let imageGridContent = null;
- let imageModal = null;
- let modalImage = null;
- const thread = document.querySelector('.thread');
- if (!thread) return;
- // Image modal
- const openImageModal = (thumb) => {
- if (!modalImage) {
- imageModal = document.createElement('div');
- imageModal.classList = 'image-grid__modal';
- document.body.appendChild(imageModal);
- modalImage = document.createElement('img');
- imageModal.appendChild(modalImage);
- imageModal.addEventListener('click', () => imageModal.classList.remove('open'));
- }
- modalImage.src = thumb.href;
- imageModal.classList.add('open');
- };
- // Image grid
- const populateImageGrid = () => {
- imageGridContent.innerHTML = '';
- const thumbs = [...thread.querySelectorAll('.fileThumb')].map(thumb => {
- return thumb.cloneNode(true);
- });
- thumbs.forEach(thumb => {
- imageGridContent.appendChild(thumb);
- thumb.addEventListener('click', (event) => {
- event.preventDefault();
- openImageModal(thumb)
- });
- });
- };
- const buildImageGrid = () => {
- imageGrid = document.createElement('div');
- imageGrid.classList = 'image-grid open';
- document.body.appendChild(imageGrid);
- imageGrid.addEventListener('click', event => {
- if (event.target.closest('.image-grid__content')) return;
- imageGrid.classList.remove('open');
- })
- imageGridContent = document.createElement('div');
- imageGridContent.classList = 'image-grid__content';
- imageGrid.appendChild(imageGridContent);
- populateImageGrid();
- }
- // Image grid button
- const gridButton = document.createElement('button');
- gridButton.textContent = 'Image Grid';
- gridButton.id = 'image-grid-button';
- document.body.appendChild(gridButton);
- gridButton.addEventListener('click', (event) => {
- if (!imageGrid) {
- buildImageGrid();
- } else {
- imageGrid.classList.add('open');
- populateImageGrid();
- }
- });
- // Styles
- const style = document.createElement('style');
- style.innerHTML = `
- .thread {
- flex-direction: column;
- }
- .thread .opContainer {
- order: 1;
- }
- #image-grid-button {
- position: fixed;
- top: 4.5rem;
- right: 2rem;
- opacity: 0.5;
- padding: 0.4rem 0.6rem;
- background: white !important;
- border: none !important;
- border-radius: 0.2rem;
- transition: all ease 150ms;
- cursor: pointer;
- color: inherit;
- }
- #image-grid-button:hover {
- opacity: 1;
- }
- .image-grid {
- position: fixed;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
- z-index: 100;
- background: rgba(0,0,0,0.8);
- display: none;
- }
- .image-grid.open {
- display: flex;
- }
- .image-grid__content {
- height: auto;
- width: auto;
- overflow: auto;
- background: rgba(255,255,255,0.1);
- margin: 3rem;
- display: flex;
- flex-wrap: wrap;
- gap: 10px;
- }
- .image-grid__modal {
- position: fixed;
- z-index: 101;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
- background: rgba(0,0,0,0.5);
- display: none;
- }
- .image-grid__modal.open {
- display: block;
- }
- .image-grid__modal img {
- width: 100%;
- height: 100%;
- object-fit: contain;
- }
- `;
- document.head.appendChild(style);