cnblogs首页美化

美化 Cnblogs 首页,包括顶部导航,左侧边栏和右侧边栏,分页选择按钮,文章列表

You will need to install an extension such as Tampermonkey, Greasemonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey to install this script.

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Userscripts to install this script.

You will need to install an extension such as Tampermonkey to install this script.

You will need to install a user script manager extension to install this script.

(I already have a user script manager, let me install it!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(I already have a user style manager, let me install it!)

// ==UserScript==
// @name         cnblogs首页美化
// @namespace    http://tampermonkey.net/
// @version      0.1
// @license      MIT
// @icon         https://www.cnblogs.com/images/logo.svg?v=2SMrXdIvlZwVoB1akyXm38WIKuTHVqvGD0CweV-B6cY
// @description  美化 Cnblogs 首页,包括顶部导航,左侧边栏和右侧边栏,分页选择按钮,文章列表
// @author       xiaoye
// @match        https://www.cnblogs.com/*
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    // 包裹 "周边" 链接在 li 元素中
    const surroundWithLi = () => {
        const navLeft = document.getElementById('nav_left');
        if (navLeft) {
            navLeft.querySelectorAll('a').forEach(link => {
                if (link.textContent.includes('周边') && link.parentElement.tagName !== 'LI') {
                    const li = document.createElement('li');
                    navLeft.insertBefore(li, link);
                    li.appendChild(link);
                }
            });
        }
    };

    // 美化文章列表项
    const stylePostItems = () => {
        document.querySelectorAll('.post-item').forEach(article => {
            // 设置样式
            Object.assign(article.style, {
                backgroundColor: "#ffffff",
                boxShadow: "0px 0px 10px rgba(0, 0, 0, 0.1)",
                borderRadius: "8px",
                padding: "20px",
                marginBottom: "20px",
                transition: "transform 0.3s, box-shadow 0.3s, border 0.3s",
                cursor: "pointer",
                border: "1px solid #ddd"
            });

            // 鼠标移入和移出效果
            article.addEventListener('mouseenter', () => {
                article.style.boxShadow = "0px 0px 15px rgba(0, 0, 0, 0.2)";
                article.style.transform = "scale(1.02)";
                article.style.border = "1px solid #007acc";
            });

            article.addEventListener('mouseleave', () => {
                article.style.boxShadow = "0px 0px 10px rgba(0, 0, 0, 0.1)";
                article.style.transform = "scale(1)";
                article.style.border = "1px solid #ddd";
            });

            // 添加点击事件
            const titleLink = article.querySelector('a.post-item-title');
            if (titleLink) {
                const href = titleLink.getAttribute('href');
                article.addEventListener('click', (event) => {
                    if (!event.target.closest('a')) {
                        window.open(href, '_blank');
                    }
                });
            }

            // 防止其他链接的点击事件冒泡
            article.querySelectorAll('a').forEach(link => {
                link.addEventListener('click', (event) => {
                    event.stopPropagation();
                });
            });
        });
    };

    // 美化侧边栏
    const styleSidenavItems = () => {
        document.querySelectorAll('.sidenav-item a').forEach(item => {
            Object.assign(item.style, {
                borderRadius: '8px',
                padding: '10px',
                transition: 'background-color 0.3s, transform 0.3s, border 0.3s',
                border: "1px solid #ddd"
            });

            item.addEventListener('mouseenter', () => {
                item.style.backgroundColor = '#007acc';
                item.style.color = '#ffffff';
                item.style.transform = 'scale(1.05)';
                item.style.border = "1px solid #007acc";
            });

            item.addEventListener('mouseleave', () => {
                item.style.backgroundColor = '';
                item.style.color = '';
                item.style.transform = 'scale(1)';
                item.style.border = "1px solid #ddd";
            });
        });
    };


    // 美化侧边栏
    const beautifySidebar = () => {
        const sidebarItems = document.querySelectorAll('.sidebar .card, .sidebar .sidebar-bh');
        sidebarItems.forEach(function(item) {
            item.style.backgroundColor = '#ffffff';
            item.style.boxShadow = '0px 0px 10px rgba(0, 0, 0, 0.1)';
            item.style.borderRadius = '8px';
            item.style.padding = '15px';
            item.style.marginBottom = '20px';
            item.style.marginLeft = '15px';
            item.style.transition = 'transform 0.3s, box-shadow 0.3s';
        });

        // 侧边栏标题样式
        const cardTitles = document.querySelectorAll('.card-title a');
        cardTitles.forEach(function(title) {
            title.style.color = '#007acc';
            title.style.textDecoration = 'none';
            title.style.fontSize = '16px';
            title.style.fontWeight = 'bold';
            title.style.transition = 'color 0.3s';
        });

        cardTitles.forEach(function(title) {
            title.addEventListener('mouseenter', function() {
                title.style.color = '#005f99';
            });

            title.addEventListener('mouseleave', function() {
                title.style.color = '#007acc';
            });
        });

        // 侧边栏项目列表样式
        const itemList = document.querySelectorAll('.item-list li');
        itemList.forEach(function(item) {
            item.style.borderBottom = '1px solid #ddd';
            item.style.padding = ' 0';
        });

        // 侧边栏图片样式
        const sidebarImages = document.querySelectorAll('.sidebar-image img');
        sidebarImages.forEach(function(image) {
            image.style.borderRadius = '8px';
            image.style.boxShadow = '0px 0px 10px rgba(0, 0, 0, 0.1)';
            image.style.maxWidth = '100%';
            image.style.height = 'auto';
        });
    };



    // 修改下拉菜单的a标签宽度
    const styleDropdownLinks = () => {
        document.querySelectorAll('.dropdown-menu a').forEach(link => {
            Object.assign(link.style, {
                width: '80px',
                display: 'inline-block',
                textAlign: 'center'
            });
        });
    };


    // 创建样式元素并插入到页面头部
    const applyGlobalStyles = () => {
        const styleElement = document.createElement('style');
        styleElement.textContent = `
            .pager a, .pager span {
                display: inline-block;
                padding: 8px 12px;
                margin: 0 4px;
                border-radius: 5px;
                text-decoration: none;
                color: #007acc;
                border: 1px solid #ddd;
                background-color: #fff;
                transition: all 0.3s ease;
                box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.1);
            }
            .pager a.current, .pager span.current {
                background-color: #007acc;
                color: #fff;
                border-color: #007acc;
            }
            .pager a:hover {
                background-color: #005f99;
                color: #fff;
                border-color: #005f99;
                box-shadow: 0px 3px 6px rgba(0, 0, 0, 0.2);
                transform: scale(1.05);
            }
            .headline ul {
                display: flex;
                flex-wrap: wrap;
                justify-content: space-between;
                padding: 0;
                list-style: none;
            }
            .headline li {
                width: 48%;
                margin-bottom: 15px;
                display: flex;
                justify-content: space-between;
                align-items: center;
            }
            .headline a {
                display: inline-block;
                width: calc(100% - 40px);
                padding: 10px;
                border-radius: 8px;
                text-decoration: none;
                color: #333;
                border: 1px solid #ddd;
                background-color: #f9f9f9;
                transition: all 0.3s ease;
                box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.1);
            }
            .headline a:hover {
                background-color: #f9f9f9;
                color: #333;
                border-color: #007acc;
                box-shadow: 0px 3px 6px rgba(0, 0, 0, 0.2);
                transform: scale(1.05);
            }
            .headline .headline-label {
                font-weight: bold;
                color: #007acc;
                margin-right: 5px;
            }
            .headline .right_more {
                width: 30px;
                margin-left: 10px;
                padding: 5px 10px;
                font-size: 0.9em;
                background-color: #f9f9f9;
                color: #333;
                border: 1px solid #ddd;
                border-radius: 5px;
                text-decoration: none;
                transition: all 0.3s ease;
                box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.1);
            }
            .headline .right_more:hover {
                border-color: #007acc;
                box-shadow: 0px 3px 6px rgba(0, 0, 0, 0.2);
                transform: scale(1.05);
            }
            #nav_left li a {
                color: #333;
                text-decoration: none;
                padding: 10px 15px;
                display: block;
                position: relative;
                transition: color 0.3s ease;
            }
            #nav_left li a::after {
                content: '';
                position: absolute;
                left: 0;
                bottom: 0;
                width: 100%;
                height: 2px;
                background-color: #007acc;
                transform: scaleX(0);
                transform-origin: bottom right;
                transition: transform 0.3s ease;
            }
            #nav_left li a:hover {
                color: #007acc;
            }
            #nav_left li a:hover::after {
                transform: scaleX(1);
                transform-origin: bottom left;
            }
        `;
        document.head.appendChild(styleElement);
    };

    // 初始化所有样式和功能
    const init = () => {
        surroundWithLi();
        stylePostItems();
        styleSidenavItems();
        styleDropdownLinks();
        applyGlobalStyles();
        beautifySidebar();
    };

    // 页面初始加载时应用所有样式和功能
    init();

    // 监听DOM变化,确保动态内容的样式保持
    const observer = new MutationObserver(init);
    observer.observe(document.body, { childList: true, subtree: true });
})();