// 动画样式定义 // 关键帧动画 @keyframes fadeInUp { from { opacity: 0; transform: translateY(30px); } to { opacity: 1; transform: translateY(0); } } @keyframes slideInLeft { from { opacity: 0; transform: translateX(-30px); } to { opacity: 1; transform: translateX(0); } } @keyframes slideInRight { from { opacity: 0; transform: translateX(30px); } to { opacity: 1; transform: translateX(0); } } @keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } } @keyframes fadeOut { from { opacity: 1; } to { opacity: 0; } } @keyframes shake { 0%, 100% { transform: translateX(0); } 10%, 30%, 50%, 70%, 90% { transform: translateX(-5px); } 20%, 40%, 60%, 80% { transform: translateX(5px); } } @keyframes pulseSuccess { 0% { transform: scale(1); box-shadow: 0 0 0 0 rgba(0, 125, 255, 0.7); } 70% { transform: scale(1.05); box-shadow: 0 0 0 10px rgba(0, 125, 255, 0); } 100% { transform: scale(1); box-shadow: 0 0 0 0 rgba(0, 125, 255, 0); } } @keyframes ripple { to { transform: scale(4); opacity: 0; } } @keyframes float { 0%, 100% { transform: translateY(0px); } 50% { transform: translateY(-10px); } } @keyframes glow { 0%, 100% { box-shadow: 0 0 5px rgba(0, 125, 255, 0.5); } 50% { box-shadow: 0 0 20px rgba(0, 125, 255, 0.8); } } // 动画类 .animate-fade-in-up { animation: fadeInUp 0.6s ease-out forwards; } .animate-slide-in-left { animation: slideInLeft 0.5s ease-out forwards; } .animate-slide-in-right { animation: slideInRight 0.5s ease-out forwards; } .animate-fade-in { animation: fadeIn 0.3s ease-out forwards; } .animate-fade-out { animation: fadeOut 0.3s ease-out forwards; } .animate-shake { animation: shake 0.5s ease-in-out; } .animate-pulse-success { animation: pulseSuccess 1s ease-out; } .animate-float { animation: float 3s ease-in-out infinite; } .animate-glow { animation: glow 2s ease-in-out infinite; } // 波纹效果 .ripple { position: absolute; border-radius: 50%; background: rgba(255, 255, 255, 0.6); transform: scale(0); animation: ripple 0.6s linear; pointer-events: none; } // 输入框聚焦效果 .input-focused { .ant-input, .ant-input-password { border-color: #007dff !important; box-shadow: 0 0 0 2px rgba(0, 125, 255, 0.2) !important; transform: translateY(-2px); transition: all 0.3s ease; } } // 按钮悬停效果 .dynamic-button { position: relative; overflow: hidden; transition: all 0.3s ease; &:hover { transform: translateY(-2px); box-shadow: 0 8px 25px rgba(0, 125, 255, 0.3); } &:active { transform: translateY(0); } } // 卡片悬停效果 .dynamic-card { transition: all 0.3s ease; &:hover { transform: translateY(-5px); box-shadow: 0 15px 35px rgba(0, 0, 0, 0.1); } } // 渐变背景动画 .gradient-bg { background: linear-gradient(-45deg, #007dff, #00d4ff, #ff6b6b, #4ecdc4); background-size: 400% 400%; animation: gradientShift 15s ease infinite; } @keyframes gradientShift { 0% { background-position: 0% 50%; } 50% { background-position: 100% 50%; } 100% { background-position: 0% 50%; } } // 加载动画 .loading-dots { display: inline-block; &::after { content: ''; animation: loadingDots 1.5s infinite; } } @keyframes loadingDots { 0%, 20% { content: ''; } 40% { content: '.'; } 60% { content: '..'; } 80%, 100% { content: '...'; } } // 响应式动画 @media (prefers-reduced-motion: reduce) { * { animation-duration: 0.01ms !important; animation-iteration-count: 1 !important; transition-duration: 0.01ms !important; } }