- 添加 .env 及相关文件,配置环境变量 - 添加 .eslintignore 和 .eslintrc.js 文件,配置 ESLint 规则 - 添加 .gitignore 文件,配置 Git忽略项 - 添加 .prettierignore 文件,配置 Prettier 忽略项 - 添加隐私政策文档,详细说明用户数据的收集和使用
243 lines
3.7 KiB
Plaintext
243 lines
3.7 KiB
Plaintext
// 动画样式定义
|
|
|
|
// 关键帧动画
|
|
@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;
|
|
}
|
|
}
|