B站自动宽屏模式

进入视频详情页后自动快速切换至宽屏模式,自动开播时也能更快地切换,动画流畅迅速,提升用户体验

// ==UserScript==
// @name         B站自动宽屏模式
// @namespace    http://tampermonkey.net/
// @version      3.1
// @description  进入视频详情页后自动快速切换至宽屏模式,自动开播时也能更快地切换,动画流畅迅速,提升用户体验
// @author
// @match        *://www.bilibili.com/video/*
// @match        *://www.bilibili.com/bangumi/play/*
// @grant        none
// @run-at       document-start
// ==/UserScript==

(function() {
    'use strict';

    const CONFIG = {
        ACTIVATE_INTERVAL: 20,       // 每次尝试间隔 20ms
        ACTIVATE_MAX_ATTEMPTS: 20,     // 最多尝试 20 次(约 400ms 内完成)
        MUTATION_THROTTLE: 100         // MutationObserver 防抖延迟
    };

    // 尽早注入宽屏及过渡动画样式
    function injectStyles() {
        if (document.getElementById('wideModeEnhancedStyle')) return;
        const style = document.createElement('style');
        style.id = 'wideModeEnhancedStyle';
        style.textContent = `
            /* 基础样式及动画:仅对宽度、高度、transform 进行过渡 */
            .bpx-player-container,
            #bilibili-player,
            #playerWrap,
            .bpx-player-video-wrap,
            .player-wrap {
                transition: width 100ms ease-in-out, height 100ms ease-in-out, transform 100ms ease-in-out !important;
                transform-origin: center center;
                position: relative;
                will-change: width, height, transform;
                transform: translateZ(0);
                backface-visibility: hidden;
            }
            /* 宽屏模式激活样式 */
            .bpx-player-container[data-screen="wide"],
            .player-wrap[data-screen="wide"] {
                width: 100% !important;
                height: 100% !important;
                max-width: 100% !important;
                max-height: 100% !important;
                transform: none !important;
            }
            /* 全屏模式优化(不影响宽屏动画) */
            .bpx-player-container[data-screen="full"] {
                position: fixed !important;
                z-index: 999999 !important;
                left: 0 !important;
                top: 0 !important;
                width: 100vw !important;
                height: 100vh !important;
            }
        `;
        document.head.appendChild(style);
    }

    // 判断是否已经进入宽屏或全屏状态
    function isWideMode() {
        return document.fullscreenElement !== null ||
               document.querySelector('[aria-label="退出宽屏"], .bpx-player-container[data-screen="wide"], .player-wrap[data-screen="wide"]');
    }

    // 查找并点击宽屏按钮
    function tryActivateWideMode() {
        const wideButton = document.querySelector('[aria-label="宽屏"], .bpx-player-ctrl-wide-enter');
        if (wideButton) {
            wideButton.click();
        }
    }

    // 轮询激活宽屏模式:在短时间内多次尝试,确保快速响应
    function activateWideMode(maxAttempts = CONFIG.ACTIVATE_MAX_ATTEMPTS, interval = CONFIG.ACTIVATE_INTERVAL) {
        let attempts = 0;
        function attempt() {
            if (isWideMode()) return; // 如果已经宽屏则停止
            tryActivateWideMode();
            attempts++;
            if (!isWideMode() && attempts < maxAttempts) {
                setTimeout(attempt, interval);
            }
        }
        attempt();
    }

    // 利用 MutationObserver 监控 DOM,当宽屏按钮因加载延迟未出现时立即触发
    function observeForWideButton() {
        const observer = new MutationObserver((mutations) => {
            if (!isWideMode()) {
                tryActivateWideMode();
            }
        });
        observer.observe(document.body, {
            childList: true,
            subtree: true
        });
    }

    // 初始化流程:注入样式、激活宽屏、并监控 DOM 变化
    function initialize() {
        injectStyles();
        activateWideMode();
        observeForWideButton();
    }

    // 根据文档加载状态尽早执行初始化
    if (document.readyState === 'loading') {
        document.addEventListener('DOMContentLoaded', initialize);
    } else {
        initialize();
    }

    // 监听 URL 变化,适应单页应用场景
    window.addEventListener('popstate', initialize);
    window.addEventListener('pushstate', initialize);
})();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址