b站滚轮调节音量优化

可在未全屏时,于视频底部使用滚轮调节音量,每次调节音量幅度为5,可在代码中修改volumeChange变量来自定义调节幅度

Fra og med 28.03.2025. Se den nyeste version.

// ==UserScript==
// @name         b站滚轮调节音量优化
// @namespace    http://greakfork.org/
// @version      1.3
// @description  可在未全屏时,于视频底部使用滚轮调节音量,每次调节音量幅度为5,可在代码中修改volumeChange变量来自定义调节幅度
// @author       xiao_luo
// @match        https://www.bilibili.com/video/*
// @icon         https://i0.hdslb.com/bfs/static/jinkela/long/images/favicon.ico
// @grant        none
// @license GPL-3.0
// ==/UserScript==


(function() {
    'use strict';

    let volumeChange = 0.05
    function initThis(){
        let volume_btn = document.querySelector("div[aria-label='音量']")
        let video = document.querySelector('video')
        console.log("初始化完成")
        volume_btn.addEventListener("wheel",function(event){
            event.preventDefault()
            volume_btn.setAttribute("class", "bpx-player-ctrl-btn bpx-player-ctrl-volume bpx-state-show")
            if(event.wheelDelta > 0){
                video.volume = (video.volume-volumeChange)<0?0:(video.volume-volumeChange)
            }else if(event.wheelDelta < 0){
                video.volume = (video.volume+volumeChange)>1?1:(video.volume+volumeChange)
            }
        })

        let tempSpeed=0
        let speed_btn = document.querySelector("div[aria-label='倍速']")
        let speed_choice = Array.from(document.querySelector('.bpx-player-ctrl-playbackrate-menu').children)
        speed_choice = speed_choice.sort(function (a, b) {
            const orderA = parseFloat(a.getAttribute('data-value'))
            const orderB = parseFloat(b.getAttribute('data-value'))
            return orderA - orderB;
        })

        for(let i=0; i<speed_choice.length; i++){
            if(speed_choice[i].getAttribute("data-value") == "1"){
                tempSpeed = i
            }
        }

        speed_btn.addEventListener("wheel",event=>{
            event.preventDefault()

            speed_btn.setAttribute("class", "bpx-player-ctrl-btn bpx-player-ctrl-playbackrate bpx-state-show")
            let zeroIndex = document.querySelector('.be-settings') ? 1 : 0
            if(event.wheelDelta > 0){
                tempSpeed = speed_choice.length-1>tempSpeed+1 ? tempSpeed+1 : speed_choice.length-1
            }else if(event.wheelDelta < 0){
                tempSpeed = zeroIndex<tempSpeed-1 ? tempSpeed-1 : zeroIndex
            }
            speed_choice[tempSpeed].click()
        })


    }

    function waitElement(selector, callback) {
        const element = document.querySelector(selector);
        if (element) {
            callback();
        } else {
            setTimeout(() => {
                waitElement(selector, callback);
            }, 100);
        }
    }

    waitElement("li[data-value='1']",initThis)

    setTimeout(() => {
        initThis()
    }, 1000);


})();