您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Moves and expands YouTube description on the right, making it scrollable and dynamically adjusting height to video.
当前为
// ==UserScript== // @name Youtube Scrollable Right Side Description // @description Moves and expands YouTube description on the right, making it scrollable and dynamically adjusting height to video. // @version 3.0 // @author SH3LL // @license MIT // @match *://*.youtube.com/* // @grant none // @run-at document-end // @namespace https://gf.qytechs.cn/users/762057 // ==/UserScript== (function() { 'use strict'; let descriptionExpander; const moveEl = (parent, child) => parent?.prepend(child); const setElStyle = (el, styles) => el?.setAttribute('style', styles); const qSel = sel => document.querySelector(sel); const getElById = id => document.getElementById(id); const ownerObserver = new MutationObserver((mutationsList, observer) => { if (getElById('owner')) { observer.disconnect(); console.log('"owner" found, executing.'); executeScript(); } }); ownerObserver.observe(document.body, { childList: true, subtree: true }); const updateDescHeight = height => { descriptionExpander && (descriptionExpander.style.maxHeight = `${height - 70}px`); }; const videoHeightObserver = new MutationObserver(mutations => { for (const m of mutations) { if (m.type === 'attributes' && m.attributeName === 'style') { const heightMatch = m.target.style.height.match(/^(\d+)px$/); heightMatch && updateDescHeight(parseInt(heightMatch[1], 10)); } } }); const observeVideoHeight = () => { const videoContent = qSel('.ytp-iv-video-content'); if (videoContent) { videoHeightObserver.observe(videoContent, { attributes: true, attributeFilter: ['style'] }); const initialHeight = videoContent.style.height.match(/^(\d+)px$/); initialHeight && updateDescHeight(parseInt(initialHeight[1], 10)); } else { console.warn('No .ytp-iv-video-content found.'); } }; function executeScript() { const related = qSel('#related'); const bottomRow = getElById('bottom-row'); const owner = getElById('owner'); const below = qSel('#below'); const infoContainer = getElById('info-container'); descriptionExpander = getElById('description-inline-expander'); const description = getElById('description'); const descriptionInner = getElById('description-inner'); const descStyle = `margin-left: 0; overflow: auto; max-width: 100%; font-size: 1.3rem; line-height: normal; width: auto; padding: 8px; border-bottom-width: 0; --yt-endpoint-text-decoration: underline; background-color: var(--yt-playlist-background-item)`; moveEl(related, bottomRow); owner && (moveEl(related, owner), setElStyle(owner, 'margin:0')); moveEl(below, infoContainer); setElStyle(infoContainer, 'color:white; font-size: 12px'); if (descriptionExpander && description && descriptionInner) { setElStyle(descriptionExpander, descStyle); setElStyle(description, 'margin: 0'); setElStyle(descriptionInner, 'margin: 0'); descriptionExpander.setAttribute('is-expanded', ''); observeVideoHeight(); } const removalObserver = new MutationObserver(mutations => { const targets = ['expand', 'collapse', 'ytd-watch-info-text', 'snippet']; for (const m of mutations) { if (m.type === 'childList') { targets.forEach(id => getElById(id)?.remove()); !targets.some(getElById) && (observer.disconnect(), console.log('Removal observer done.')); } } }); const watchInfoFlex = qSel('ytd-watch-metadata > div'); watchInfoFlex && removalObserver.observe(watchInfoFlex, { childList: true, subtree: true }); } })();
QingJ © 2025
镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址