/* ===== 扫描线效果 ===== */ @keyframes scanline { 0% { transform: translateY(-100%); } 100% { transform: translateY(100%); } } .animate-scanline { position: relative; overflow: hidden; } .animate-scanline::after { content: ''; position: absolute; top: 0; left: 0; right: 0; height: 100%; background: linear-gradient( to bottom, transparent 0%, rgba(42, 157, 111, 0.1) 50%, transparent 100% ); animation: scanline 3s linear infinite; pointer-events: none; } /* ===== 十字准星展开动画 ===== */ @keyframes crosshair-expand { 0% { transform: scale(0) rotate(45deg); opacity: 0; } 50% { opacity: 1; } 100% { transform: scale(1) rotate(0deg); opacity: 1; } } .animate-crosshair { animation: crosshair-expand 0.5s cubic-bezier(0.34, 1.56, 0.64, 1) forwards; } /* 十字准星线条 */ .crosshair-line { position: absolute; background: var(--military-400); } .crosshair-line.horizontal { width: 20px; height: 2px; top: 50%; left: 50%; transform: translate(-50%, -50%); } .crosshair-line.vertical { width: 2px; height: 20px; top: 50%; left: 50%; transform: translate(-50%, -50%); } /* ===== 数字滚动动画 ===== */ @keyframes digit-scroll { 0% { transform: translateY(100%); opacity: 0; } 20% { opacity: 1; } 80% { opacity: 1; } 100% { transform: translateY(-100%); opacity: 0; } } .animate-digit { display: inline-block; animation: digit-scroll 0.3s ease-out forwards; } /* 数字递增效果 */ @keyframes count-up { from { --num: 0; } to { --num: var(--target); } } .animate-count-up { animation: count-up 0.5s ease-out forwards; counter-reset: num var(--num); } .animate-count-up::after { content: counter(num); } /* ===== 边框流光效果 ===== */ @keyframes border-flow { 0% { background-position: 0% 50%; } 50% { background-position: 100% 50%; } 100% { background-position: 0% 50%; } } .animate-border-flow { position: relative; background: linear-gradient( 90deg, var(--charcoal-800), var(--military-600), var(--darkgold-500), var(--military-600), var(--charcoal-800) ); background-size: 300% 100%; animation: border-flow 3s ease infinite; } /* 流光边框容器 */ .border-flow-container { position: relative; } .border-flow-container::before { content: ''; position: absolute; inset: 0; padding: 1px; border-radius: inherit; background: linear-gradient( 90deg, var(--military-600), var(--darkgold-500), var(--military-600) ); background-size: 200% 100%; animation: border-flow 2s linear infinite; -webkit-mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0); mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0); -webkit-mask-composite: xor; mask-composite: exclude; pointer-events: none; } /* ===== 脉冲效果 ===== */ @keyframes pulse-glow { 0%, 100% { box-shadow: 0 0 5px var(--military-500), 0 0 10px var(--military-500); } 50% { box-shadow: 0 0 15px var(--military-400), 0 0 25px var(--military-400); } } .animate-pulse-glow { animation: pulse-glow 2s ease-in-out infinite; } /* ===== 闪烁效果 ===== */ @keyframes blink { 0%, 50% { opacity: 1; } 51%, 100% { opacity: 0; } } .animate-blink { animation: blink 1s step-end infinite; } /* ===== 渐变扫描 ===== */ @keyframes gradient-shift { 0% { background-position: 0% 50%; } 50% { background-position: 100% 50%; } 100% { background-position: 0% 50%; } } .animate-gradient { background-size: 200% 200%; animation: gradient-shift 5s ease infinite; } /* ===== 悬浮动画 ===== */ @keyframes float { 0%, 100% { transform: translateY(0); } 50% { transform: translateY(-5px); } } .animate-float { animation: float 3s ease-in-out infinite; } /* ===== 数据流动效果 ===== */ @keyframes data-flow { 0% { background-position: -200% 0; } 100% { background-position: 200% 0; } } .animate-data-flow { background: linear-gradient( 90deg, transparent, rgba(42, 157, 111, 0.3), transparent ); background-size: 50% 100%; animation: data-flow 2s linear infinite; }