Greasy Fork

来自缓存

Greasy Fork is available in English.

远景论坛界面调整

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

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。

您需要先安装用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==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>
    `;
        }

    }
})();