您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Changes the YouTube homepage to show you 4 videos per row and fix thumbnail padding.
// ==UserScript== // @name YouTube - 4 Videos Per Row // @version 1.0 // @license CC0-1.0 // @description Changes the YouTube homepage to show you 4 videos per row and fix thumbnail padding. // @author Mane // @match https://www.youtube.com/* // @grant none // @run-at document-start // @namespace https://greasyfork.org/users/1491313 // ==/UserScript== (function() { 'use strict'; // Desired number of videos per row const videosPerRow = 4; // Style ID const styleId = `youtube-${videosPerRow}-videos-per-row-updated`; // Debug logging function debugLog(message) { console.log(`[YouTube Layout Fix]: ${message}`); } // Error reporting function reportError(message, error) { console.error(`[YouTube Layout Fix - ERROR]: ${message}`); if (error) console.error(error); } // Apply the layout fix function applyLayoutFix(count) { try { debugLog(`Applying layout fix for ${count} videos per row...`); // Remove old style if present const old = document.getElementById(styleId); if (old) { old.remove(); debugLog('Removed existing style.'); } // Calculate widths const videoWidthPercentage = 100 / count; const gap = 12; const adjustedWidth = `calc(${videoWidthPercentage}% - ${gap}px)`; // Build new style const style = document.createElement('style'); style.id = styleId; style.textContent = ` #contents.ytd-rich-grid-renderer { display: flex !important; flex-wrap: wrap !important; gap: ${gap}px !important; width: 100% !important; margin: 0 !important; padding: 0 !important; } ytd-rich-item-renderer { flex: 0 0 ${adjustedWidth} !important; max-width: ${adjustedWidth} !important; box-sizing: border-box !important; margin: 0 !important; padding: 0 !important; } ytd-rich-item-renderer[is-in-first-column] { margin-left: 0 !important; } ytd-rich-item-renderer #thumbnail, ytd-rich-item-renderer #thumbnail img { width: 100% !important; height: auto !important; display: block !important; object-fit: cover !important; } #contents.ytd-rich-grid-renderer > ytd-rich-item-renderer[is-in-first-column] { margin-left: 0 !important; } `; document.head.appendChild(style); debugLog(`Applied style for ${count} videos per row.`); } catch (err) { reportError('Error applying layout fix:', err); } } // Initialize script function initialize() { applyLayoutFix(videosPerRow); debugLog('Initial layout fix applied.'); // Re-apply on navigation or resize window.addEventListener('yt-navigate-finish', () => applyLayoutFix(videosPerRow)); window.addEventListener('resize', () => applyLayoutFix(videosPerRow)); } // Observe for dynamic changes try { new MutationObserver(() => applyLayoutFix(videosPerRow)) .observe(document.body, { childList: true, subtree: true }); debugLog('MutationObserver started.'); } catch (err) { reportError('Error setting up MutationObserver:', err); } // Kick things off on load/ready window.addEventListener('load', initialize); if (['interactive','complete'].includes(document.readyState)) { initialize(); } })();