/* ---- 顶部装饰条 ---- */ .hero-section { position: relative; padding: 60px 24px 48px; text-align: center; overflow: hidden; } .hero-section::before { content: ''; position: absolute; inset: 0; background: radial-gradient(ellipse at 30% 20%, rgba(91,135,49,0.15) 0%, transparent 50%), radial-gradient(ellipse at 70% 60%, rgba(124,175,78,0.08) 0%, transparent 40%); pointer-events: none; } .hero-icon { display: inline-flex; align-items: center; justify-content: center; width: 64px; height: 64px; border-radius: 20px; background: var(--noir-bg-elevated); backdrop-filter: blur(20px) saturate(130%); border: 1px solid var(--noir-border-light); font-size: 28px; margin-bottom: 16px; box-shadow: var(--noir-shadow-md); animation: noir-float 3s ease-in-out infinite; } .hero-section h1 { font-size: clamp(28px, 5vw, 42px); font-weight: 700; letter-spacing: -0.03em; background: linear-gradient(135deg, #e9e9f5 0%, #a09fb1 100%); -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text; margin-bottom: 8px; } .hero-sub { color: var(--noir-text-tertiary); font-size: var(--noir-font-size-sm); display: flex; align-items: center; justify-content: center; gap: 8px; flex-wrap: wrap; } .hero-sub .count-badge { display: inline-flex; align-items: center; gap: 4px; padding: 4px 14px; border-radius: 9999px; background: var(--noir-accent-subtle); border: 1px solid var(--noir-border-light); font-weight: 500; font-size: 13px; } /* ---- 搜索与过滤栏 ---- */ .toolbar { max-width: 1024px; margin: 0 auto 28px; padding: 0 24px; } .toolbar-inner { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; } .search-wrap { flex: 1; min-width: 200px; position: relative; } .search-wrap .noir-input { padding-left: 40px; border-radius: 9999px; height: 44px; } .search-icon { position: absolute; left: 14px; top: 50%; transform: translateY(-50%); color: var(--noir-text-tertiary); font-size: 16px; pointer-events: none; } .filter-group { display: flex; gap: 8px; flex-wrap: wrap; } .filter-chip { display: inline-flex; align-items: center; gap: 6px; padding: 8px 18px; border-radius: 9999px; font-size: var(--noir-font-size-sm); font-weight: 500; background: var(--noir-bg-tertiary); border: 1px solid var(--noir-border-light); color: var(--noir-text-secondary); cursor: pointer; transition: all var(--noir-transition-base); user-select: none; white-space: nowrap; } .filter-chip:hover { border-color: var(--noir-border-medium); color: var(--noir-text-primary); } .filter-chip.active { background: var(--noir-accent); color: var(--noir-text-inverse); border-color: var(--noir-accent); box-shadow: var(--noir-shadow-sm); } /* ---- 同学卡片网格 ---- */ .class-grid-wrap { max-width: 1024px; margin: 0 auto; padding: 0 24px 48px; } .class-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); gap: 16px; } /* ---- 同学卡片 ---- */ .class-card { background: var(--noir-bg-elevated); backdrop-filter: blur(20px) saturate(130%) contrast(1.05) brightness(1.02); -webkit-backdrop-filter: blur(20px) saturate(130%) contrast(1.05) brightness(1.02); border: 1px solid var(--noir-border-light); border-radius: var(--noir-radius-lg); padding: 24px 20px 20px; box-shadow: var(--noir-shadow-xs), inset 0 1px 0 rgba(255,255,255,0.06); position: relative; overflow: hidden; transition: box-shadow var(--noir-transition-base), border-color var(--noir-transition-base), transform var(--noir-transition-base); animation: noir-fadeInUp 500ms cubic-bezier(0.16, 1, 0.3, 1) both; } .class-card::after { content: ''; position: absolute; inset: 0; border-radius: inherit; background: radial-gradient(ellipse at 30% 15%, rgba(255,255,255,0.06) 0%, transparent 55%), radial-gradient(ellipse at 85% 85%, rgba(255,255,255,0.02) 0%, transparent 40%); pointer-events: none; z-index: 0; } .class-card > * { position: relative; z-index: 1; } .class-card:hover { box-shadow: var(--noir-shadow-lg); border-color: var(--noir-border-medium); transform: translateY(-4px); } .class-card:active { transform: scale(0.985); transition: transform var(--noir-transition-fast); } /* 卡片顶部头像区 */ .card-top { display: flex; align-items: center; gap: 16px; margin-bottom: 14px; } .card-avatar { width: 64px; height: 64px; border-radius: 50%; object-fit: cover; border: 2px solid var(--noir-border-light); background: var(--noir-bg-tertiary); flex-shrink: 0; box-shadow: var(--noir-shadow-sm); transition: transform var(--noir-transition-spring), box-shadow var(--noir-transition-base); } .class-card:hover .card-avatar { transform: scale(1.05); box-shadow: var(--noir-shadow-md); } .card-name-row { flex: 1; min-width: 0; } .card-name { font-size: 18px; font-weight: 600; letter-spacing: -0.01em; color: var(--noir-text-primary); display: flex; align-items: center; gap: 8px; flex-wrap: wrap; } .card-gender { display: inline-flex; align-items: center; justify-content: center; width: 22px; height: 22px; border-radius: 50%; font-size: 12px; flex-shrink: 0; } .card-gender.male { background: rgba(70,130,255,0.15); color: #5b9aff; } .card-gender.female { background: rgba(255,100,150,0.15); color: #ff6b9d; } .card-time { font-size: 12px; color: var(--noir-text-tertiary); margin-top: 2px; } /* 卡片信息行 */ .card-info { display: flex; flex-direction: column; gap: 6px; } .card-info-row { display: flex; align-items: center; gap: 8px; font-size: 13px; color: var(--noir-text-secondary); } .card-info-row .label { color: var(--noir-text-tertiary); font-size: 12px; min-width: 36px; flex-shrink: 0; } .card-info-row .value { color: var(--noir-text-primary); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .card-info-row .value.motto-text { display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; white-space: normal; font-style: italic; opacity: 0.85; } /* 卡片分隔装饰 */ .card-divider { height: 1px; background: var(--noir-border-light); margin: 12px 0; } /* ---- 交错动画延迟 ---- */ .class-card:nth-child(1) { animation-delay: 0ms; } .class-card:nth-child(2) { animation-delay: 60ms; } .class-card:nth-child(3) { animation-delay: 120ms; } .class-card:nth-child(4) { animation-delay: 180ms; } .class-card:nth-child(5) { animation-delay: 240ms; } .class-card:nth-child(6) { animation-delay: 300ms; } .class-card:nth-child(7) { animation-delay: 360ms; } .class-card:nth-child(8) { animation-delay: 420ms; } .class-card:nth-child(9) { animation-delay: 480ms; } .class-card:nth-child(10) { animation-delay: 540ms; } .class-card:nth-child(11) { animation-delay: 600ms; } .class-card:nth-child(12) { animation-delay: 660ms; } .class-card:nth-child(13) { animation-delay: 720ms; } .class-card:nth-child(14) { animation-delay: 780ms; } .class-card:nth-child(15) { animation-delay: 840ms; } .class-card:nth-child(16) { animation-delay: 900ms; } .class-card:nth-child(17) { animation-delay: 960ms; } .class-card:nth-child(18) { animation-delay: 1020ms; } .class-card:nth-child(19) { animation-delay: 1080ms; } .class-card:nth-child(20) { animation-delay: 1140ms; } /* ---- 空状态 ---- */ .empty-state { grid-column: 1 / -1; text-align: center; padding: 80px 24px; color: var(--noir-text-tertiary); } .empty-state .empty-icon { font-size: 48px; margin-bottom: 16px; opacity: 0.5; } .empty-state p { font-size: var(--noir-font-size-sm); } /* ---- 底部水印 ---- */ .footer-note { text-align: center; padding: 24px; color: var(--noir-text-tertiary); font-size: 12px; opacity: 0.6; } /* ---- 响应式 ---- */ @media (max-width: 640px) { .hero-section { padding: 40px 16px 32px; } .toolbar { padding: 0 16px; } .class-grid-wrap { padding: 0 16px 32px; } .class-grid { grid-template-columns: 1fr; } .toolbar-inner { flex-direction: column; } .search-wrap { width: 100%; } .filter-group { width: 100%; justify-content: center; } .card-top { gap: 12px; } .card-avatar { width: 52px; height: 52px; } .card-name { font-size: 16px; } } @media (min-width: 768px) { .class-grid { grid-template-columns: repeat(2, 1fr); } } @media (min-width: 1024px) { .class-grid { grid-template-columns: repeat(3, 1fr); } } /* ---- 工具栏按钮补充 ---- */ .toolbar-actions { display: flex; align-items: center; gap: 8px; } .add-btn { display: inline-flex; align-items: center; gap: 6px; padding: 8px 18px; border-radius: 9999px; font-size: var(--noir-font-size-sm); font-weight: 500; background: linear-gradient(135deg, rgba(91,135,49,0.4), rgba(124,175,78,0.3)); border: 1px solid color-mix(in srgb, var(--text-primary) 12%, transparent); color: var(--noir-text-primary); cursor: pointer; transition: all var(--noir-transition-base); user-select: none; white-space: nowrap; } .add-btn:hover { background: linear-gradient(135deg, rgba(91,135,49,0.6), rgba(124,175,78,0.5)); border-color: rgba(255,255,255,0.2); box-shadow: var(--noir-shadow-sm); transform: translateY(-1px); } .add-btn:active { transform: scale(0.97); } /* ---- 返回主页按钮 ---- */ .home-btn { position: fixed; top: 16px; left: 16px; z-index: 100; width: 40px; height: 40px; border-radius: 50%; background: var(--noir-bg-elevated); backdrop-filter: blur(20px); border: 1px solid var(--noir-border-light); display: flex; align-items: center; justify-content: center; color: var(--noir-text-primary); text-decoration: none; font-size: 18px; transition: all var(--noir-transition-base); box-shadow: var(--noir-shadow-xs); } .home-btn:hover { box-shadow: var(--noir-shadow-md); transform: scale(1.08); } .home-btn:active { transform: scale(0.95); } /* ---- 上传弹窗表单 ---- */ .upload-form { display: flex; flex-direction: column; gap: 16px; } .upload-form .form-row { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; } .upload-form .form-row.single { grid-template-columns: 1fr; } .upload-form label { display: block; font-size: var(--noir-font-size-sm); font-weight: 500; color: var(--noir-text-secondary); margin-bottom: 4px; } .upload-form label .required { color: #ff6b6b; margin-left: 2px; } .avatar-upload-area { display: flex; align-items: center; gap: 16px; margin-bottom: 4px; } .avatar-preview-wrap { width: 72px; height: 72px; border-radius: 50%; overflow: hidden; border: 2px dashed var(--noir-border-medium); background: var(--noir-bg-tertiary); flex-shrink: 0; display: flex; align-items: center; justify-content: center; transition: border-color var(--noir-transition-base); } .avatar-preview-wrap.has-image { border-style: solid; border-color: var(--noir-border-light); } .avatar-preview-wrap img { width: 100%; height: 100%; object-fit: cover; } .avatar-preview-wrap .placeholder { font-size: 24px; color: var(--noir-text-tertiary); opacity: 0.5; } .avatar-upload-btn { display: inline-flex; align-items: center; gap: 6px; padding: 8px 16px; border-radius: 9999px; font-size: var(--noir-font-size-xs); font-weight: 500; background: var(--noir-bg-tertiary); border: 1px solid var(--noir-border-light); color: var(--noir-text-secondary); cursor: pointer; transition: all var(--noir-transition-fast); } .avatar-upload-btn:hover { border-color: var(--noir-border-medium); color: var(--noir-text-primary); } #avatarInput { display: none; } .upload-form .noir-input, .upload-form .noir-select { height: 42px; } @media (max-width: 640px) { .upload-form .form-row { grid-template-columns: 1fr; } } /* ---- 滚动条微调 ---- */ ::-webkit-scrollbar { width: 4px; } ::-webkit-scrollbar-thumb { background: color-mix(in srgb, var(--text-primary) 10%, transparent); border-radius: 10px; } /* ---- 圆形裁切弹窗 ---- */ .crop-overlay { position: fixed; inset: 0; z-index: 2000; display: none; align-items: center; justify-content: center; background: rgba(0,0,0,0.7); backdrop-filter: blur(6px); } .crop-overlay.open { display: flex; } .crop-panel { background: var(--noir-bg-elevated); border: 1px solid var(--noir-border-light); border-radius: var(--noir-radius-lg); padding: 24px; width: 360px; box-shadow: var(--noir-shadow-xl); } .crop-panel h3 { margin: 0 0 16px; font-size: 16px; font-weight: 600; text-align: center; color: var(--noir-text-primary); } .crop-stage { position: relative; width: 280px; height: 280px; margin: 0 auto 16px; border-radius: 50%; overflow: hidden; background: var(--noir-bg-elevated); box-shadow: 0 0 0 3px color-mix(in srgb, var(--text-primary) 15%, transparent), var(--noir-shadow-lg); cursor: grab; user-select: none; -webkit-user-select: none; } .crop-stage:active { cursor: grabbing; } .crop-stage img { position: absolute; top: 0; left: 0; pointer-events: none; width: auto; height: auto; min-width: 100%; min-height: 100%; } .crop-stage::after { content: ''; position: absolute; inset: 0; border-radius: 50%; box-shadow: inset 0 0 0 9999px rgba(0,0,0,0.45); pointer-events: none; z-index: 2; } .crop-hint { text-align: center; font-size: 13px; color: var(--noir-text-tertiary); margin-bottom: 16px; } .crop-actions { display: flex; gap: 12px; justify-content: center; } .crop-actions .noir-btn { min-width: 100px; height: 40px; } /* ---- 详情弹窗 ---- */ .detail-overlay { position: fixed; inset: 0; z-index: 2000; display: none; align-items: center; justify-content: center; background: rgba(0,0,0,0.65); backdrop-filter: blur(8px); padding: 20px; } .detail-overlay.open { display: flex; } .detail-panel { background: var(--noir-bg-elevated); border: 1px solid var(--noir-border-light); border-radius: var(--noir-radius-xl); width: 100%; max-width: 420px; box-shadow: var(--noir-shadow-xl); overflow: hidden; animation: detailIn 300ms cubic-bezier(0.16, 1, 0.3, 1); } @keyframes detailIn { from { opacity: 0; transform: scale(0.92) translateY(20px); } to { opacity: 1; transform: scale(1) translateY(0); } } .detail-head { display: flex; align-items: center; gap: 20px; padding: 28px 24px 20px; background: radial-gradient(ellipse at 30% 20%, rgba(91,135,49,0.2) 0%, transparent 60%); } .detail-avatar { width: 80px; height: 80px; border-radius: 50%; object-fit: cover; border: 3px solid var(--noir-border-light); background: var(--noir-bg-tertiary); flex-shrink: 0; box-shadow: var(--noir-shadow-md); } .detail-head-info { flex: 1; min-width: 0; } .detail-name { font-size: 22px; font-weight: 700; color: var(--noir-text-primary); display: flex; align-items: center; gap: 10px; } .detail-gender { display: inline-flex; align-items: center; width: 24px; height: 24px; border-radius: 50%; justify-content: center; flex-shrink: 0; } .detail-gender.male { background: rgba(70,130,255,0.2); color: #5b9aff; } .detail-gender.female { background: rgba(255,100,150,0.2); color: #ff6b9d; } .detail-time { font-size: 12px; color: var(--noir-text-tertiary); margin-top: 4px; } .detail-body { padding: 8px 24px 24px; } .detail-row { display: flex; align-items: flex-start; gap: 12px; padding: 12px 0; border-bottom: 1px solid var(--noir-border-light); cursor: pointer; transition: background var(--noir-transition-fast); border-radius: 8px; margin: 0 -8px; padding: 12px 8px; } .detail-row:hover { background: var(--noir-bg-tertiary); } .detail-row:active { transform: scale(0.98); } .detail-row-icon { width: 36px; height: 36px; border-radius: 10px; display: flex; align-items: center; justify-content: center; flex-shrink: 0; font-size: 16px; } .detail-row-icon.birthday { background: rgba(255,180,50,0.15); color: #ffb432; } .detail-row-icon.hobby { background: rgba(50,200,120,0.15); color: #32c878; } .detail-row-icon.contact { background: rgba(70,130,255,0.15); color: #5b9aff; } .detail-row-icon.motto { background: rgba(180,100,255,0.15); color: #b464ff; } .detail-row-content { flex: 1; min-width: 0; } .detail-row-label { font-size: 11px; font-weight: 600; color: var(--noir-text-tertiary); text-transform: uppercase; letter-spacing: 0.5px; margin-bottom: 2px; } .detail-row-value { font-size: 14px; color: var(--noir-text-primary); word-break: break-all; } .detail-row-value .contact-tag { display: inline-flex; align-items: center; gap: 4px; padding: 2px 10px; border-radius: 9999px; font-size: 12px; font-weight: 500; margin: 2px 4px 2px 0; } .detail-row-value .contact-tag.phone { background: rgba(70,130,255,0.12); color: #5b9aff; } .detail-row-value .contact-tag.qq { background: rgba(0,180,255,0.12); color: #00b4ff; } .detail-row-value .contact-tag.wechat { background: rgba(0,200,100,0.12); color: #00c864; } .detail-row-value .contact-tag.other { background: color-mix(in srgb, var(--text-primary) 8%, transparent); color: var(--noir-text-secondary); } .detail-copy-hint { font-size: 11px; color: var(--noir-text-tertiary); opacity: 0.6; flex-shrink: 0; align-self: center; } .detail-toast { position: fixed; bottom: 40px; left: 50%; transform: translateX(-50%); padding: 10px 24px; border-radius: 9999px; background: var(--noir-accent); color: var(--noir-text-inverse); font-size: 13px; font-weight: 500; box-shadow: var(--noir-shadow-lg); z-index: 3000; opacity: 0; transition: opacity 300ms; pointer-events: none; } .detail-toast.show { opacity: 1; } .detail-motto-text { font-style: italic; opacity: 0.85; line-height: 1.6; } .detail-close { position: absolute; top: 12px; right: 12px; width: 32px; height: 32px; border-radius: 50%; background: color-mix(in srgb, var(--text-primary) 8%, transparent); border: none; color: var(--noir-text-secondary); cursor: pointer; display: flex; align-items: center; justify-content: center; transition: all var(--noir-transition-fast); } .detail-close:hover { background: color-mix(in srgb, var(--text-primary) 15%, transparent); color: var(--noir-text-primary); } .detail-panel { position: relative; }

同学录

珍藏每一份同窗情谊 加载中…
全部

调整头像

crop preview
拖拽图片调整位置,圆形区域即为头像
已复制