Greasy Fork is available in English.

远景论坛界面调整

调整论坛布局,优化搜索结果显示

// ==UserScript==
// @name         远景论坛界面调整
// @namespace    http://tampermonkey.net/
// @version      1.6
// @author       宇泽同学
// @description  调整论坛布局,优化搜索结果显示
// @icon         https://www.google.com/s2/favicons?sz=64&domain=pcbeta.com
// @license      MIT
// @match        https://bbs.pcbeta.com/
// @match        https://bbs.pcbeta.com/forum*
// @match        https://bbs.pcbeta.com/viewthread*
// @match        https://bbs.pcbeta.com/search.php?*
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    // 判断当前页面是否为搜索结果页面
    const isSearchPage = window.location.href.includes('bbs.pcbeta.com/search.php?');

    if (isSearchPage) {
        // 搜索结果页面的样式和功能
        const style = document.createElement('style');
        style.textContent = `
            .searchform,
            .pgs.cl.mbm,
            .slst.mtw#threadlist,
            .sttl.mbn {
                width: 85%;
                max-width: 85%;
                margin: 0 auto;
            }
            .slst.mtw#threadlist > ul {
                display: flex;
                flex-wrap: wrap;
                justify-content: space-between;
                padding: 0;
                margin: 0;
                list-style-type: none;
            }
            .slst.mtw#threadlist > ul > li {
                width: calc(50% - 5px);
                margin-bottom: 15px;
                box-sizing: border-box;
            }
            .slst.mtw#threadlist .pbw {
                padding: 10px;
            }
            @media (max-width: 768px) {
                .slst.mtw#threadlist > ul > li {
                    width: 100%;
                }
            }
        `;
        document.head.appendChild(style);

        function applySearchLayout() {
            const threadlist = document.querySelector('.slst.mtw#threadlist');
            if (threadlist) {
                let ul = threadlist.querySelector('ul');
                if (!ul) {
                    ul = document.createElement('ul');
                    Array.from(threadlist.children).forEach(child => {
                        if (child.classList.contains('pbw')) {
                            const li = document.createElement('li');
                            li.appendChild(child);
                            ul.appendChild(li);
                        }
                    });
                    threadlist.innerHTML = '';
                    threadlist.appendChild(ul);
                }
            }

            const sttlElement = document.querySelector('.sttl.mbn');
            if (sttlElement) {
                sttlElement.style.textAlign = 'center';
            }
        }

        const observer = new MutationObserver((mutations) => {
            for (let mutation of mutations) {
                if (mutation.type === 'childList') {
                    const threadlist = document.querySelector('.slst.mtw#threadlist');
                    if (threadlist) {
                        observer.disconnect();
                        applySearchLayout();
                        break;
                    }
                }
            }
        });
        observer.observe(document.body, { childList: true, subtree: true });

        window.addEventListener('load', () => {
            setTimeout(applySearchLayout, 500);
        });
    } else {
        // 宽屏化脚本的代码
        // 创建滑块容器
        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)';
        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';
                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', 'transparent');
                document.documentElement.style.setProperty('--element-border-color', '#555555');
                themeToggleButton.innerHTML = getSunIcon();
                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) {
                    if (!element.closest('#sliderContainer')) {
                        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');
                    }
                });
            } else {
                removeDarkThemeStyles();
                themeToggleButton.innerHTML = getMoonIcon();
            }

            // 保持滑块组件样式一致
            sliderContainer.style.backgroundColor = '#f1f1f1';
            sliderContainer.style.color = '#000';
            sliderContainer.style.borderColor = '#b5b5b5';
            sliderLabel.style.color = '#000';
            sliderValue.style.color = '#000';
            toggleButton.style.backgroundColor = 'transparent';
            themeToggleButton.style.backgroundColor = 'transparent';
        }

        applyTheme();

        function removeDarkThemeStyles() {
            document.documentElement.style.removeProperty('--background-color');
            document.documentElement.style.removeProperty('--text-color');
            document.documentElement.style.removeProperty('--element-background-color');
            document.documentElement.style.removeProperty('--element-border-color');

            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) {
                if (!element.closest('#sliderContainer')) {
                    element.style.backgroundColor = '';
                    element.style.color = '';
                    element.style.borderColor = '';
                }
            });
        }


        themeToggleButton.addEventListener('click', toggleTheme);


        function getMoonIcon() {
            return `
        <svg viewBox="0 0 1024 1024" width="18" height="18" fill="#000000">
            <path d="M644.5056 70.528C834.4064 127.488 972.8 303.5648 972.8 512c0 254.4896-206.3104 460.8-460.8 460.8-222.4128 0-408.0128-157.568-451.2768-367.1296A433.4848 433.4848 0 0 0 230.4 640c240.3584 0 435.2-194.8416 435.2-435.2 0-44.2112-6.5792-86.8608-18.8416-127.0528z"/>
        </svg>
    `;
        }

        function getSunIcon() {
            return `
      <svg t="1726942162389" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="12302" width="20" height="20">
      <path d="M480 160V64h64v96h-64z m180.288 31.168l48-83.136 55.424 32-48 83.136-55.424-32zM512 736a224 224 0 1 0 0-448 224 224 0 0 0 0 448z m0 64a288 288 0 1 0 0-576 288 288 0 0 0 0 576z m352-320h96v64h-96v-64z m19.968-219.712l-83.136 48 32 55.424 83.136-48-32-55.424zM260.288 140.032l48 83.136 55.424-32-48-83.136-55.424 32z m-69.12 223.68l-83.136-48 32-55.424 83.136 48-32 55.424zM480 864v96h64v-96h-64zM160 480H64v64h96v-64z m-51.968 228.288l83.136-48 32 55.424-83.136 48-32-55.424z m200.256 92.544l-48 83.168 55.424 32 48-83.168-55.424-32z m400 115.168l-48-83.168 55.424-32 48 83.168-55.424 32z m92.544-200.288l83.136 48 32-55.424-83.136-48-32 55.424z" p-id="12303">
      </path></svg>
    `;
        }

        function getArrowIcon() {
            return `
        <svg viewBox="0 0 1024 1024" width="18" height="18">
            <path d="M1009.1026963 512c0-274.57156741-222.53112889-497.1026963-497.1026963-497.1026963s-497.1026963 222.53112889-497.1026963 497.1026963 222.53112889 497.1026963 497.1026963 497.1026963 497.1026963-222.53112889 497.1026963-497.1026963z" fill="#515151"/>
            <path d="M494.78264098 222.02342717c8.15559111-8.15559111 18.64135111-12.16865975 29.25656494-12.16865976s21.23042765 4.01306864 29.25656494 12.16865976c16.18172839 16.18172839 16.18172839 42.46085531 0 58.64258369l-216.70570667 216.70570667c-8.02613728 8.02613728-8.02613728 21.23042765 0 29.25656494L553.42522469 743.33398914c16.18172839 16.18172839 16.18172839 42.46085531 0 58.64258369s-42.46085531 16.18172839-58.64258371 0L263.44865185 570.6425837c-32.3634568-32.3634568-32.3634568-84.7922568 0-117.15571357L494.78264098 222.02342717z" fill="#ffffff"/>
        </svg>
    `;
        }


        function getLeftArrowIcon() {
            return getArrowIcon();
        }

        function getRightArrowIcon() {
            return `
        <div style="transform: scale(-1, 1); display: inline-block;">
            ${getArrowIcon()}
        </div>
    `;
        }

    }
})();