// ==UserScript== // @license MIT // @name Google搜索美化 // @namespace 豆沙包里加辣椒 // @version 8.1 // @description 美化Google搜索结果:宽屏居中显示、去除广告、背景色、悬停效果、整卡可点击、自动翻页、隐藏分页栏和推荐 // @author User // @match https://www.google.com/search* // @match https://www.google.com.hk/search* // @match https://www.google.co.*/ // @match https://*.google.*/ // @grant GM_addStyle // @run-at document-start // @downloadURL https://update.greasyfork.icu/scripts/573309/Google%E6%90%9C%E7%B4%A2%E7%BE%8E%E5%8C%96.user.js // @updateURL https://update.greasyfork.icu/scripts/573309/Google%E6%90%9C%E7%B4%A2%E7%BE%8E%E5%8C%96.meta.js // ==/UserScript== (function () { 'use strict'; if (window.__gsBeautified) return; window.__gsBeautified = true; const CARD_BG = '#f5e4ea'; const CARD_HOVER = '#e4f5f4'; const CSS = ` /* 隐藏广告 */ #tads, #tadsb, #bottomads, .commercial_unit, .ads-ad, [data-text-ad], .uEierd, .U3A9Ac { display: none !important; } /* 隐藏底部分页栏 */ #foot, #botstuff, .AaVjTc, #xjs, .T6zPgb, .mKDcx { display: none !important; } /* 隐藏搜索推荐/相关搜索 */ #extrares, #bres, .iKt1P, .ZCeoTe, .A6I4wd, .EIaa9b, .related-question-pair, .csAkad, #rso > div[data-hveid] > div[style*="margin"] { display: none !important; } /* 隐藏"人们也在问" */ .related-question-pair, .iDjcJe { display: none !important; } /* 隐藏右侧栏 */ #rhs, #rhscol { display: none !important; } /* 让 rcnt 撑满并居中 */ #rcnt { width: 100% !important; max-width: 1100px !important; margin: 0 auto !important; box-sizing: border-box !important; display: block !important; } /* center_col 独占整行,不给右侧栏留空间 */ #center_col { width: 100% !important; max-width: 100% !important; margin: 0 auto !important; box-sizing: border-box !important; grid-column: 1 / -1 !important; } /* 中间层容器撑满 */ #rso, #search, #rso .dURPMd, #rso .eqAnXb, #rso .s6JM6d { width: 100% !important; box-sizing: border-box !important; } /* 搜索结果卡片 */ #rso .MjjYud { background: ${CARD_BG} !important; border-radius: 10px !important; margin: 10px 0 !important; padding: 14px 18px !important; box-sizing: border-box !important; width: 100% !important; position: relative !important; overflow: hidden !important; cursor: pointer !important; transition: background 0.2s ease, transform 0.2s ease, box-shadow 0.2s ease !important; } /* 悬停 */ #rso .MjjYud:hover { background: ${CARD_HOVER} !important; transform: scale(1.012) !important; box-shadow: 0 4px 18px rgba(0,0,0,0.10) !important; z-index: 5 !important; } /* 扫光 */ #rso .MjjYud::before { content: '' !important; position: absolute !important; top: 0 !important; left: -100% !important; width: 100% !important; height: 100% !important; background: linear-gradient( 120deg, transparent 0%, rgba(0,255,255,0.15) 30%, rgba(138,43,226,0.12) 60%, transparent 100% ) !important; pointer-events: none !important; z-index: 1 !important; transition: left 1.2s ease !important; } #rso .MjjYud:hover::before { left: 100% !important; } /* 内容层级高于扫光 */ #rso .MjjYud > * { position: relative !important; z-index: 2 !important; } /* 响应式 */ @media (max-width: 768px) { #rcnt { padding: 0 10px !important; } } `; // ==================== 自动翻页功能 ==================== // 翻页状态 let isLoading = false; let loadedStarts = new Set(); let currentStart = 0; // 获取URL参数 function getUrlParam(name) { const reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)"); const r = window.location.search.substr(1).match(reg); return r ? decodeURIComponent(r[2]) : null; } // 显示提示 function showToast(msg) { let toast = document.getElementById('__gs_toast__'); if (!toast) { toast = document.createElement('div'); toast.id = '__gs_toast__'; toast.style.cssText = ` position: fixed; bottom: 80px; left: 50%; transform: translateX(-50%); padding: 10px 20px; background: rgba(0, 0, 0, 0.7); color: white; border-radius: 8px; font-size: 14px; z-index: 99999; transition: opacity 0.3s ease; `; document.body.appendChild(toast); } toast.textContent = msg; toast.style.opacity = '1'; setTimeout(() => { toast.style.opacity = '0'; }, 1000); } // 加载下一页 function loadNextPage() { if (isLoading) return; // 获取当前起始位置 const startParam = getUrlParam('start'); currentStart = startParam ? parseInt(startParam) : 0; const nextStart = currentStart + loadedStarts.size * 10; if (loadedStarts.has(nextStart)) return; loadedStarts.add(nextStart); isLoading = true; showToast(`加载第 ${Math.floor(nextStart / 10) + 1} 页...`); // 构造下一页URL const url = new URL(window.location.href); url.searchParams.set('start', nextStart); console.log('[Google美化] 加载下一页:', url.toString()); fetch(url.toString()) .then(response => response.text()) .then(html => { const parser = new DOMParser(); const doc = parser.parseFromString(html, 'text/html'); // 获取搜索结果卡片 const results = doc.querySelectorAll('#rso .MjjYud'); const container = document.querySelector('#rso'); if (container && results.length > 0) { let added = 0; results.forEach(result => { // 排除广告 if (!result.querySelector('.uEierd, .U3A9Ac, [data-text-ad]')) { container.appendChild(result.cloneNode(true)); added++; } }); if (added > 0) { showToast(`已加载第 ${Math.floor(nextStart / 10) + 1} 页`); } else { showToast('没有更多结果了'); } } else { showToast('没有更多结果了'); } isLoading = false; }) .catch(error => { console.error('[Google美化] 加载失败:', error); showToast('加载失败'); isLoading = false; loadedStarts.delete(nextStart); }); } // 回到顶部按钮 let scrollToTopBtn = null; let isScrollVisible = false; function createScrollToTopButton() { if (scrollToTopBtn) return; scrollToTopBtn = document.createElement('div'); scrollToTopBtn.id = '__gs_scroll_top__'; scrollToTopBtn.innerHTML = ` `; scrollToTopBtn.style.cssText = ` position: fixed; bottom: 80px; right: 50px; width: 44px; height: 44px; border-radius: 50%; background: #fff; box-shadow: 0 2px 8px rgba(0,0,0,0.15); cursor: pointer; display: none; align-items: center; justify-content: center; z-index: 1000; transition: opacity 0.2s ease; `; scrollToTopBtn.onclick = () => { window.scrollTo({ top: 0, behavior: 'smooth' }); }; document.documentElement.appendChild(scrollToTopBtn); } function updateScrollToTop() { if (!scrollToTopBtn) return; const shouldShow = window.scrollY > 200; if (shouldShow !== isScrollVisible) { isScrollVisible = shouldShow; scrollToTopBtn.style.display = shouldShow ? 'flex' : 'none'; } } // 滚动处理(防抖) let scrollTimer = null; function handleScroll() { updateScrollToTop(); if (scrollTimer) clearTimeout(scrollTimer); scrollTimer = setTimeout(() => { const scrollTop = document.documentElement.scrollTop || document.body.scrollTop; const clientHeight = document.documentElement.clientHeight || document.body.clientHeight; const scrollHeight = document.documentElement.scrollHeight || document.body.scrollHeight; const distanceToBottom = scrollHeight - scrollTop - clientHeight; if (distanceToBottom <= 100) { loadNextPage(); } }, 150); } // ==================== 样式注入 ==================== function injectStyle() { if (document.getElementById('__gs_beautify__')) return; const el = document.createElement('style'); el.id = '__gs_beautify__'; el.textContent = CSS; (document.head || document.documentElement).appendChild(el); console.log('[Google美化 v8.0] 样式注入成功'); } // ==================== 卡片点击 ==================== function bindClick() { if (window.__gsClickBound) return; window.__gsClickBound = true; document.addEventListener('click', function (e) { // 排除按钮、输入框等交互元素 if (e.target.closest('button, input, select, textarea')) return; const card = e.target.closest('#rso .MjjYud'); if (!card) return; // 查找卡片内的主链接 const link = card.querySelector('.yuRUbf a') || card.querySelector('a[jsname] h3')?.closest('a') || card.querySelector('h3 a') || card.querySelector('a[href^="http"]'); if (!link) return; const href = link.href; if (!href || href.includes('google.com/search')) return; // 无论点击卡片还是链接,都在新标签页打开 e.preventDefault(); e.stopPropagation(); window.open(href, '_blank', 'noopener,noreferrer'); }, true); } // ==================== 初始化 ==================== function init() { injectStyle(); bindClick(); createScrollToTopButton(); // 初始化已加载页码 const startParam = getUrlParam('start'); if (startParam) { loadedStarts.add(parseInt(startParam)); } } // 样式注入 if (document.head) { injectStyle(); } else { const watcher = new MutationObserver(function () { if (document.head) { watcher.disconnect(); injectStyle(); } }); watcher.observe(document.documentElement, { childList: true }); } // DOM加载完成 if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', init); } else { init(); } // URL变化监听 let lastUrl = location.href; new MutationObserver(function () { if (location.href !== lastUrl) { lastUrl = location.href; loadedStarts.clear(); const startParam = getUrlParam('start'); if (startParam) { loadedStarts.add(parseInt(startParam)); } setTimeout(init, 500); } }).observe(document.documentElement, { subtree: true, childList: true }); window.addEventListener('popstate', () => { loadedStarts.clear(); setTimeout(init, 500); }); // 滚动监听 window.addEventListener('scroll', handleScroll, { passive: true }); })();