:root { /* 浅色主题 - 专业商务风格 */ --bg: #F8FAFC; --bg-card: #FFFFFF; --bg-elevated: #F1F5F9; --border: #E2E8F0; --border-hover: #CBD5E1; --text: #0F172A; --text-muted: #64748B; --accent: #0369A1; --accent-dim: #0284C7; --accent-glow: rgba(3, 105, 161, 0.1); --green: #059669; --green-dim: #047857; --orange: #EA580C; --red: #DC2626; --font-mono: "JetBrains Mono", "Fira Code", monospace; --font-sans: "Noto Sans SC", -apple-system, sans-serif; --radius: 8px; --radius-lg: 12px; --shadow: 0 1px 3px rgba(0, 0, 0, 0.1), 0 1px 2px rgba(0, 0, 0, 0.06); --shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05); --transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1); } * { box-sizing: border-box; } body { margin: 0; min-height: 100vh; font-family: var(--font-sans); font-size: 15px; color: var(--text); background: var(--bg); line-height: 1.5; display: flex; flex-direction: column; } .header { background: linear-gradient(135deg, #FFFFFF 0%, #F8FAFC 100%); border-bottom: 1px solid var(--border); padding: 2rem 1.5rem; position: relative; overflow: hidden; } .header::before { content: ''; position: absolute; top: 0; left: 0; right: 0; height: 3px; background: linear-gradient(90deg, var(--accent), var(--green), var(--accent)); opacity: 0.8; } .header-inner { max-width: 1200px; margin: 0 auto; } .logo { font-family: var(--font-mono); font-size: 1.75rem; font-weight: 700; margin: 0 0 0.25rem 0; background: linear-gradient(135deg, #0F172A 0%, var(--accent) 100%); -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text; letter-spacing: -0.02em; display: inline-block; } .tagline { margin: 0; color: var(--text-muted); font-size: 0.95rem; } .main { flex: 1; max-width: 1200px; margin: 0 auto; padding: 1.5rem; width: 100%; } .filters { display: flex; flex-wrap: wrap; gap: 1rem; align-items: flex-end; margin-bottom: 1.5rem; padding: 1.25rem; background: var(--bg-card); border: 1px solid var(--border); border-radius: var(--radius-lg); box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2); transition: var(--transition); } .filters:hover { border-color: var(--border-hover); box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3); } .filter-group { display: flex; flex-direction: column; gap: 0.35rem; } .filter-group label { font-size: 0.8rem; color: var(--text-muted); text-transform: uppercase; letter-spacing: 0.05em; } .filter-group select { font-family: var(--font-mono); font-size: 0.9rem; padding: 0.5rem 0.75rem; min-width: 140px; background: var(--bg-card); border: 1.5px solid var(--border); border-radius: 6px; color: var(--text); cursor: pointer; transition: var(--transition); } .filter-group select:hover { border-color: var(--accent); background: var(--bg-card); } .filter-group select:focus { outline: none; border-color: var(--accent); box-shadow: 0 0 0 3px var(--accent-glow); } .btn-reset { font-family: var(--font-sans); font-size: 0.9rem; font-weight: 500; padding: 0.5rem 1rem; background: var(--bg-card); border: 1.5px solid var(--border); border-radius: 6px; color: var(--text); cursor: pointer; margin-left: auto; transition: var(--transition); } .btn-reset:hover { border-color: var(--accent); background: var(--accent); color: white; transform: translateY(-1px); box-shadow: 0 4px 6px rgba(3, 105, 161, 0.2); } .btn-reset:active { transform: translateY(0); } .table-wrap { overflow-x: auto; border: 1px solid var(--border); border-radius: var(--radius-lg); background: var(--bg-card); box-shadow: var(--shadow); position: relative; } .table-wrap::before { content: ''; position: absolute; top: 0; left: 0; right: 0; height: 1px; background: linear-gradient(90deg, transparent, var(--accent), transparent); opacity: 0.3; } .price-table { width: 100%; border-collapse: collapse; font-size: 0.9rem; } .price-table th, .price-table td { padding: 0.75rem 1rem; text-align: left; border-bottom: 1px solid var(--border); } .price-table th { font-family: var(--font-mono); font-weight: 600; font-size: 0.8rem; text-transform: uppercase; letter-spacing: 0.04em; color: var(--text-muted); background: var(--bg-elevated); } .price-table tbody tr { transition: var(--transition); } .price-table tbody tr:hover { background: var(--bg-elevated); transform: scale(1.001); box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05); } .price-table tbody tr:last-child td { border-bottom: none; } .col-price { text-align: right; white-space: nowrap; } .price-table td.col-price { font-family: var(--font-mono); font-weight: 700; color: var(--green); font-size: 0.95rem; } .price-table .provider { font-weight: 500; color: var(--text); } .price-table .region { color: var(--text-muted); font-size: 0.85em; } .price-table .col-link { white-space: nowrap; } .price-table .col-link a { color: white; background: var(--accent); text-decoration: none; padding: 0.35rem 0.85rem; border-radius: 6px; transition: var(--transition); display: inline-block; font-size: 0.85rem; font-weight: 500; } .price-table .col-link a:hover { background: var(--accent-dim); transform: translateY(-2px); box-shadow: 0 4px 12px rgba(3, 105, 161, 0.3); } /* 广告位占位,接入 AdSense 后可移除最小高度 */ .ad-slot { min-height: 50px; margin: 0.5rem 0; } .ad-slot-header { margin-top: 1rem; } .ad-slot-inline { margin-bottom: 1rem; } .ad-slot-footer { margin-bottom: 1rem; } .disclaimer { margin-top: 1rem; font-size: 0.8rem; color: var(--text-muted); } .footer { margin-top: auto; padding: 1rem 1.5rem; border-top: 1px solid var(--border); text-align: center; font-size: 0.85rem; color: var(--text-muted); } .footer p { margin: 0; } .footer .contact { margin-top: 0.5rem; } .footer .contact a { color: var(--accent); text-decoration: none; } .footer .contact a:hover { text-decoration: underline; } .empty-state { text-align: center; padding: 3rem 2rem; color: var(--text-muted); } .empty-state p { margin: 0; font-size: 1rem; } /* 加载状态 */ .loading-skeleton { animation: pulse 1.5s ease-in-out infinite; } @keyframes pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.5; } } .loading-row { height: 48px; background: linear-gradient(90deg, var(--bg-card) 25%, var(--bg-elevated) 50%, var(--bg-card) 75%); background-size: 200% 100%; animation: shimmer 1.5s infinite; } @keyframes shimmer { 0% { background-position: 200% 0; } 100% { background-position: -200% 0; } } /* 数据徽章 */ .badge { display: inline-block; padding: 0.15rem 0.5rem; border-radius: 4px; font-size: 0.75rem; font-weight: 500; background: var(--bg-elevated); border: 1px solid var(--border); } .badge-primary { background: var(--accent-glow); border-color: var(--accent); color: var(--accent); } .badge-success { background: rgba(63, 185, 80, 0.15); border-color: var(--green); color: var(--green); } @media (max-width: 768px) { .header { padding: 1.5rem 1rem; } .logo { font-size: 1.5rem; } .filters { flex-direction: column; align-items: stretch; padding: 1rem; } .btn-reset { margin-left: 0; width: 100%; } .price-table th, .price-table td { padding: 0.5rem 0.6rem; font-size: 0.8rem; } .price-table .hide-mobile { display: none; } .table-wrap { border-radius: var(--radius); } } /* 平滑滚动 */ html { scroll-behavior: smooth; } /* 自定义滚动条 */ ::-webkit-scrollbar { width: 10px; height: 10px; } ::-webkit-scrollbar-track { background: var(--bg-elevated); } ::-webkit-scrollbar-thumb { background: var(--border-hover); border-radius: 5px; } ::-webkit-scrollbar-thumb:hover { background: var(--text-muted); } /* ========== 新增功能样式 ========== */ /* 搜索栏 */ .search-bar { margin-bottom: 1rem; } .search-bar input { width: 100%; max-width: 500px; padding: 0.65rem 1rem; font-size: 0.95rem; border: 1.5px solid var(--border); border-radius: var(--radius); background: var(--bg-card); color: var(--text); transition: var(--transition); font-family: var(--font-sans); } .search-bar input:focus { outline: none; border-color: var(--accent); box-shadow: 0 0 0 3px var(--accent-glow); } .search-bar input::placeholder { color: var(--text-muted); } /* 可排序表头 */ .sortable { user-select: none; transition: var(--transition); cursor: pointer; position: relative; } .sortable:hover { background: var(--bg-elevated) !important; color: var(--accent); } .sortable.sorted { color: var(--accent); font-weight: 700; } .sort-icon { font-size: 0.8em; margin-left: 0.25rem; display: inline-block; min-width: 1em; } /* 收藏按钮 */ .btn-favorite { background: none; border: none; font-size: 1.2rem; cursor: pointer; padding: 0.25rem 0.5rem; color: var(--text-muted); transition: var(--transition); margin-right: 0.5rem; border-radius: 4px; } .btn-favorite:hover { color: var(--orange); transform: scale(1.2); background: rgba(234, 88, 12, 0.1); } .btn-favorite:active { transform: scale(1.1); } /* 已收藏的行 */ .favorited { background: rgba(234, 88, 12, 0.05) !important; border-left: 3px solid var(--orange); } .favorited .btn-favorite { color: var(--orange); } /* 操作列样式优化 */ .col-link { white-space: nowrap; display: flex; align-items: center; gap: 0.5rem; } .col-link a { color: white; background: var(--accent); text-decoration: none; padding: 0.35rem 0.85rem; border-radius: 6px; transition: var(--transition); display: inline-block; font-size: 0.85rem; font-weight: 500; } .col-link a:hover { background: var(--accent-dim); transform: translateY(-2px); box-shadow: 0 4px 12px rgba(3, 105, 161, 0.3); } /* 结果计数样式 */ .result-count { margin-left: auto; color: var(--text-muted); font-size: 0.9rem; font-weight: 500; padding: 0.5rem 0; } /* 响应式优化 */ @media (max-width: 768px) { .search-bar input { max-width: 100%; } .col-link { flex-direction: column; align-items: flex-start; gap: 0.25rem; } .btn-favorite { font-size: 1rem; padding: 0.2rem 0.4rem; } }