// ==UserScript==
// @name 远景论坛宽屏化
// @namespace http://tampermonkey.net/
// @version 1.4
// @author 宇泽同学
// @description 调整论坛布局
// @icon https://www.google.com/s2/favicons?sz=64&domain=pcbeta.com
// @license MIT
// @match https://bbs.pcbeta.com/*
// @grant none
// @downloadURL none
// ==/UserScript==
(function() {
'use strict';
// 创建滑块容器
var sliderContainer = document.createElement('div');
sliderContainer.style.position = 'fixed';
sliderContainer.style.background = '#f1f1f1';
sliderContainer.style.padding = '10px';
sliderContainer.style.zIndex = '9999';
sliderContainer.style.border = '1px solid #ccc';
sliderContainer.style.borderRadius = '5px';
sliderContainer.style.width = '180px';
sliderContainer.style.userSelect = 'none';
sliderContainer.style.cursor = 'move';
sliderContainer.style.color = '#000'; // 确保文字始终为黑色
var sliderLabel = document.createElement('label');
sliderLabel.innerHTML = '页面宽度: ';
sliderContainer.appendChild(sliderLabel);
var sliderValue = document.createElement('span');
sliderValue.innerHTML = '90%';
sliderContainer.appendChild(sliderValue);
// 切换主题按钮
var themeToggleButton = document.createElement('div');
themeToggleButton.innerHTML = getMoonIcon();
themeToggleButton.style.display = 'inline';
themeToggleButton.style.marginLeft = '10px';
themeToggleButton.style.cursor = 'pointer';
themeToggleButton.style.userSelect = 'none';
themeToggleButton.style.fontSize = '13pt';
themeToggleButton.style.color = '#000'; // 确保符号始终为黑色
sliderContainer.appendChild(themeToggleButton);
var slider = document.createElement('input');
slider.type = 'range';
slider.min = '50';
slider.max = '100';
slider.value = '90';
slider.style.width = '100%';
slider.style.cursor = 'pointer';
sliderContainer.appendChild(slider);
document.body.appendChild(sliderContainer);
var hdElement = document.getElementById('hd');
var defaultLeft = 'calc(100% - 230px)'; // 180px (slider width) + 50px distance from right
var defaultTop = hdElement ? (hdElement.getBoundingClientRect().top + (hdElement.getBoundingClientRect().height / 2) - (sliderContainer.getBoundingClientRect().height / 2)) + 'px' : '80px';
sliderContainer.style.left = defaultLeft;
sliderContainer.style.top = defaultTop;
// 创建折叠图标
var toggleButton = document.createElement('div');
toggleButton.innerHTML = getRightArrowIcon(); // 初始状态为向右的箭头
toggleButton.style.position = 'absolute';
toggleButton.style.top = '5px';
toggleButton.style.right = '5px';
toggleButton.style.cursor = 'pointer';
toggleButton.style.userSelect = 'none';
toggleButton.style.fontSize = '13pt';
toggleButton.style.color = '#000'; // 确保符号始终为黑色
sliderContainer.appendChild(toggleButton);
var isCollapsed = false;
// 折叠和展开功能
toggleButton.addEventListener('click', function() {
var currentTop = sliderContainer.style.top;
var currentLeft = sliderContainer.style.left;
isCollapsed = !isCollapsed;
if (isCollapsed) {
sliderContainer.style.width = '30px';
sliderContainer.style.height = '30px'; // 设置高度为30像素
sliderLabel.style.display = 'none';
slider.style.display = 'none';
sliderValue.style.display = 'none';
themeToggleButton.style.display = 'none';
toggleButton.innerHTML = getLeftArrowIcon(); // 使用左箭头图标
toggleButton.style.top = '50%';
toggleButton.style.transform = 'translate(-50%, -50%)';
toggleButton.style.left = '50%';
// 折叠到同一行的右侧,留出一定距离
sliderContainer.style.left = 'calc(100% - 60px)';
sliderContainer.style.top = currentTop;
} else {
sliderContainer.style.width = '180px';
sliderContainer.style.height = 'auto'; // 恢复原来的高度
sliderLabel.style.display = 'inline';
slider.style.display = 'inline';
sliderValue.style.display = 'inline';
themeToggleButton.style.display = 'inline';
toggleButton.innerHTML = getRightArrowIcon(); // 使用右箭头图标
toggleButton.style.top = '5px';
toggleButton.style.right = '5px';
toggleButton.style.transform = 'none';
toggleButton.style.left = 'auto';
// 恢复到之前的位置并确保向左展开
sliderContainer.style.left = 'calc(100% - 230px)';
sliderContainer.style.top = currentTop;
}
});
// 调整页面宽度函数
function adjustWidth(percentage) {
var wpClElements = document.querySelectorAll('.wp.cl');
wpClElements.forEach(function(element) {
element.style.width = percentage + '%';
});
var clElements = document.querySelectorAll('.cl');
clElements.forEach(function(element) {
element.style.width = percentage + '%';
});
var scbarHotTdElement = document.querySelector('td.scbar_hot_td');
function adjustTdWidth() {
if (scbarHotTdElement && clElements.length > 0) {
var clRightEdge = clElements[0].offsetLeft + clElements[0].offsetWidth;
scbarHotTdElement.style.width = (clRightEdge - scbarHotTdElement.offsetLeft) + 'px';
}
}
function adjustFlBmChildren() {
var flBmElements = document.querySelectorAll('.fl.bm');
flBmElements.forEach(function(element) {
element.style.width = '100%';
element.style.boxSizing = 'border-box';
var children = element.children;
for (var i = 0; i < children.length; i++) {
children[i].style.width = '100%';
children[i].style.boxSizing = 'border-box';
}
});
}
function adjustAdditionalElements() {
var ptElement = document.querySelector('#pt.bm');
if (ptElement) {
ptElement.style.width = percentage + '%';
ptElement.style.margin = '0 auto';
}
var specificDiv = document.querySelector('div[style*="padding:0 15px;background:#fafafa;border:1px solid #ececec;"]');
if (specificDiv) {
specificDiv.style.width = percentage + '%';
specificDiv.style.margin = '0 auto';
specificDiv.style.boxSizing = 'border-box';
}
}
adjustTdWidth();
adjustFlBmChildren();
adjustAdditionalElements();
adjustScrollTopPosition();
}
// 从 localStorage 获取初始宽度值
var savedWidth = localStorage.getItem('pageWidth') || '90';
slider.value = savedWidth;
sliderValue.innerHTML = savedWidth + '%';
adjustWidth(savedWidth);
// 保存滑块值到 localStorage
slider.addEventListener('input', function() {
var value = slider.value;
sliderValue.innerHTML = value + '%';
adjustWidth(value);
localStorage.setItem('pageWidth', value);
});
var logoElement = document.querySelector('a[title="远景论坛 - 微软极客社区"]');
var scbarFormElement = document.getElementById('scbar_form');
function alignLogo() {
if (logoElement && scbarFormElement) {
var scbarFormRect = scbarFormElement.getBoundingClientRect();
logoElement.style.position = 'absolute';
logoElement.style.left = scbarFormRect.left + 'px';
}
}
function observeScbarForm() {
if (scbarFormElement) {
const observer = new MutationObserver(function() {
alignLogo();
});
observer.observe(scbarFormElement, {
attributes: true,
childList: true,
subtree: true
});
alignLogo();
}
}
observeScbarForm();
window.addEventListener('resize', function() {
alignLogo();
adjustScrollTopPosition();
});
function makeElementDraggable(element) {
var offsetX, offsetY;
var isDragging = false;
element.addEventListener('mousedown', function(e) {
if (e.target === slider || e.target === toggleButton || e.target === themeToggleButton) return;
e.preventDefault();
offsetX = e.clientX - element.getBoundingClientRect().left;
offsetY = e.clientY - element.getBoundingClientRect().top;
isDragging = true;
document.addEventListener('mousemove', moveElement);
document.addEventListener('mouseup', stopMovingElement);
});
function moveElement(e) {
if (isDragging) {
element.style.left = (e.clientX - offsetX) + 'px';
element.style.top = (e.clientY - offsetY) + 'px';
}
}
function stopMovingElement() {
isDragging = false;
document.removeEventListener('mousemove', moveElement);
document.removeEventListener('mouseup', stopMovingElement);
}
}
function adjustScrollTopPosition() {
var scrollTopElement = document.getElementById('scrolltop');
if (scrollTopElement) {
scrollTopElement.style.position = 'fixed';
scrollTopElement.style.right = '40px';
scrollTopElement.style.bottom = '40px';
scrollTopElement.style.zIndex = '1000';
}
}
makeElementDraggable(sliderContainer);
adjustScrollTopPosition();
// 主题切换功能
var isDarkMode = localStorage.getItem('isDarkMode') === 'true';
function toggleTheme() {
isDarkMode = !isDarkMode;
localStorage.setItem('isDarkMode', isDarkMode);
applyTheme();
}
function applyTheme() {
if (isDarkMode) {
document.documentElement.style.setProperty('--background-color', '#333333');
document.documentElement.style.setProperty('--text-color', '#ffffff');
document.documentElement.style.setProperty('--element-background-color', '#444444');
document.documentElement.style.setProperty('--element-border-color', '#555555');
themeToggleButton.innerHTML = getSunIcon(''); // 更改为使用SVG图标
document.body.style.backgroundColor = getComputedStyle(document.documentElement).getPropertyValue('--background-color');
document.body.style.color = getComputedStyle(document.documentElement).getPropertyValue('--text-color');
var elements = document.querySelectorAll('div, span, p, td, th, h1, h2, h3, h4, h5, h6, a, input, label, button, select, textarea');
elements.forEach(function(element) {
element.style.backgroundColor = getComputedStyle(document.documentElement).getPropertyValue('--element-background-color');
element.style.color = getComputedStyle(document.documentElement).getPropertyValue('--text-color');
element.style.borderColor = getComputedStyle(document.documentElement).getPropertyValue('--element-border-color');
});
// 设置暗色模式下滑块组件的颜色
sliderContainer.style.backgroundColor = '#f1f1f1'; // 保持与浅色模式相同的背景颜色
// 确保滑块文字颜色为黑色
sliderLabel.style.color = '#000';
sliderValue.style.color = '#000';
slider.style.backgroundColor = ''; // 使用默认背景颜色
slider.style.borderColor = ''; // 使用默认边框颜色
// 设置暗色模式下折叠图标背景色为透明
toggleButton.style.backgroundColor = 'transparent';
// 确保文字“页面宽度: 90%”没有背景色
sliderLabel.style.backgroundColor = 'transparent';
sliderValue.style.backgroundColor = 'transparent';
themeToggleButton.style.backgroundColor = 'transparent';
} else {
removeDarkThemeStyles();
themeToggleButton.innerHTML = getMoonIcon(); // 更改为使用 SVG 图标
// 设置浅色模式下的背景颜色
sliderContainer.style.backgroundColor = '#f1f1f1'; // 设置浅色模式的背景颜色
sliderContainer.style.color = '#000'; // 确保文字颜色为黑色
slider.style.backgroundColor = ''; // 恢复默认背景颜色
sliderContainer.style.borderColor = '#b5b5b5'; // 默认边框颜色
// 设置浅色模式下折叠图标的颜色为黑色,并确保背景色为透明
toggleButton.style.color = '#000 !important';
toggleButton.style.backgroundColor = 'transparent'; // 确保背景色为透明
// 确保文字“页面宽度: 90%”没有背景色
sliderLabel.style.backgroundColor = 'transparent';
sliderValue.style.backgroundColor = 'transparent';
themeToggleButton.style.backgroundColor = 'transparent';
}
}
// 检查当前主题并应用
applyTheme();
function removeDarkThemeStyles() {
document.body.style.backgroundColor = '';
document.body.style.color = '';
var elements = document.querySelectorAll('div, span, p, td, th, h1, h2, h3, h4, h5, h6, a, input, label, button, select, textarea');
elements.forEach(function(element) {
element.style.backgroundColor = '';
element.style.color = '';
element.style.borderColor = '';
});
}
themeToggleButton.addEventListener('click', toggleTheme);
applyTheme(); // 在页面加载时应用主题
// 获取月亮图标的 SVG
function getMoonIcon() {
return `
`;
}
// 获取太阳图标的 SVG
function getSunIcon(color = '#000000') {
return `
`;
}
// 获取左箭头图标的 SVG
function getLeftArrowIcon() {
return `
`;
}
// 获取右箭头图标的 SVG (镜像)
function getRightArrowIcon() {
return `
`;
}
})();