// ==UserScript==
// @name Bilibili Video Fix Negative Color
// @namespace https://github.com/downwarjers/WebTweaks
// @version 1.3.1
// @description 解決 Bilibili 影片顏色異常或提供負片效果。在播放器的「設定」選單(關燈模式旁)新增「反轉顏色」開關。透過注入 CSS `filter: invert(100%) hue-rotate(180deg)` 實現畫面反轉。
// @author downwarjers
// @license MIT
// @match *://www.bilibili.com/*
// @grant none
// @downloadURL https://raw.githubusercontent.com/downwarjers/WebTweaks/main/UserScripts/bilibili-video-negative-color/bilibili-video-negative-color.user.js
// @updateURL https://raw.githubusercontent.com/downwarjers/WebTweaks/main/UserScripts/bilibili-video-negative-color/bilibili-video-negative-color.user.js
// ==/UserScript==
(function () {
'use strict';
// 1. 注入 CSS 樣式
const style = document.createElement('style');
style.textContent = `
/* 影片反轉的樣式 */
.bpx-player-container.video-is-inverted video {
filter: invert(100%) hue-rotate(180deg) saturate(120%);
}
`;
document.head.appendChild(style);
/**
* 創建「反轉顏色」的 Checkbox 元素
* @param {Element} playerContainer - 播放器容器
* @param {Element} anchorElement - "关灯模式" 的
元素 (作為複製模板)
* @returns {Element}
*/
function createInvertCheckbox(playerContainer, anchorElement) {
// 深度複製 "关灯模式" 節點,以繼承所有樣式與結構
const newCheckbox = anchorElement.cloneNode(true);
// 修改 class,移除 'bpx-player-ctrl-setting-lightoff'
// 並加上我們自己的標記 'my-invert-checkbox'
newCheckbox.classList.remove('bpx-player-ctrl-setting-lightoff');
newCheckbox.classList.add('my-invert-checkbox');
// 找到內部的
const input = newCheckbox.querySelector('.bui-checkbox-input');
if (input) {
input.setAttribute('aria-label', '反轉顏色');
// 檢查當前狀態並設定
const isCurrentlyInverted = playerContainer.classList.contains('video-is-inverted');
input.checked = isCurrentlyInverted;
// 綁定 change 事件
input.addEventListener('change', (e) => {
playerContainer.classList.toggle('video-is-inverted', e.target.checked);
});
}
// 找到