您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Add simple buttons to control items per row on Youtube's homepage grid, default is 4
当前为
- // ==UserScript==
- // @name YouTube Grid Row Controller
- // @namespace https://github.com/HageFX-78
- // @version 0.1
- // @description Add simple buttons to control items per row on Youtube's homepage grid, default is 4
- // @author HageFX78
- // @license MIT
- // @match *://www.youtube.com/*
- // @icon https://www.google.com/s2/favicons?sz=64&domain=youtube.com
- // @grant GM_setValue
- // @grant GM_getValue
- // ==/UserScript==
- (function () {
- "use strict";
- // If you have another script that disables or remove yt chips set this to false, true by default
- let embedInChips = true;
- // If you want to hide the controls/UI set this to true, false by default
- let hideControls = false;
- // This will be used if hideControls is true, 4 by default. Setting will affect the count when hideControls is true
- let defaultItemsPerRow = 4;
- // Changing this will not effect the script, use the buttons to change it
- let itemsPerRow = GM_getValue("itemsPerRow", defaultItemsPerRow);
- const overrideStyle = document.createElement("style");
- const staticOverrideStyle = document.createElement("style");
- const chipsStyle = document.createElement("style");
- const noChipsStyle = document.createElement("style");
- chipsStyle.textContent = `
- #right-arrow {
- right: 10% !important;
- }
- #chips-wrapper {
- justify-content: left !important;
- }
- #chips-content{
- width: 90% !important;
- }
- #itemPerRowControl {
- display: flex;
- justify-content: center;
- align-items: center;
- flex: 1;
- gap: 10px;
- box-sizing: border-box;
- user-select: none;
- }
- `;
- noChipsStyle.textContent = `
- #itemPerRowControl {
- display: flex;
- justify-content: right;
- align-items: center;
- margin: 0;
- padding: 0 60px;
- width: 100%;
- gap: 10px;
- box-sizing: border-box;
- user-select: none;
- }
- `;
- staticOverrideStyle.textContent = `
- ytd-rich-item-renderer[rendered-from-rich-grid][is-in-first-column] {
- margin-left: calc(var(--ytd-rich-grid-item-margin) / 2) !important;
- }
- #itemPerRowControl button {
- background-color: #f1f1f1;
- border: none;
- color: white;
- background-color:var(--yt-spec-badge-chip-background);
- font-size: 24px;
- text-align: center;
- display: inline-block;
- height: 30px;
- aspect-ratio: 1/1;
- border-radius: 50%;
- }
- #itemPerRowControl button:hover {
- background-color: var(--yt-spec-button-chip-background-hover);
- cursor: pointer;
- }
- `;
- overrideStyle.textContent = `
- ytd-rich-grid-renderer { --ytd-rich-grid-items-per-row: ${
- hideControls ? defaultItemsPerRow : itemsPerRow
- } !important; }
- `;
- document.head.appendChild(staticOverrideStyle);
- document.head.appendChild(overrideStyle);
- if (hideControls) {
- return;
- }
- if (embedInChips) {
- document.head.appendChild(chipsStyle);
- waitForElement("#chips-wrapper").then((element) => {
- createControlDiv(element);
- });
- } else {
- document.head.appendChild(noChipsStyle);
- waitForElement("#contents").then((element) => {
- createControlDiv(element);
- });
- }
- //-------------------------------------------- Functions --------------------------------------------------
- function waitForElement(selector) {
- return new Promise((resolve) => {
- const observer = new MutationObserver((mutations, observer) => {
- const element = document.querySelector(selector);
- if (element) {
- observer.disconnect();
- resolve(element);
- }
- });
- observer.observe(document.body, {
- childList: true,
- subtree: true,
- });
- });
- }
- function updateItemPerRow() {
- overrideStyle.textContent = `
- ytd-rich-grid-renderer { --ytd-rich-grid-items-per-row: ${itemsPerRow} !important; }`;
- GM_setValue("itemsPerRow", itemsPerRow); // Save the value
- }
- function createControlDiv(insertTarget) {
- let controlDiv = document.createElement("div");
- controlDiv.id = "itemPerRowControl";
- controlDiv.classList.add("style-scope", "ytd-rich-grid-renderer");
- // Control
- let addItemPerRow = document.createElement("button");
- addItemPerRow.innerText = "+";
- addItemPerRow.addEventListener("click", () => {
- itemsPerRow++;
- updateItemPerRow();
- });
- let minusItemPerRow = document.createElement("button");
- minusItemPerRow.innerText = "-";
- minusItemPerRow.addEventListener("click", () => {
- if (itemsPerRow > 1) {
- itemsPerRow--;
- updateItemPerRow();
- }
- });
- controlDiv.appendChild(minusItemPerRow);
- controlDiv.appendChild(addItemPerRow);
- if (embedInChips) {
- insertTarget.appendChild(controlDiv);
- } else {
- insertTarget.parentNode.insertBefore(controlDiv, insertTarget);
- }
- }
- })();