Files
template-10561/src/styles/animations.less
赵忠林 37f3b6327c feat: 初始化项目配置和文档- 添加 .editorconfig 文件,配置代码编辑规范
- 添加 .env 及相关文件,配置环境变量
- 添加 .eslintignore 和 .eslintrc.js 文件,配置 ESLint 规则
- 添加 .gitignore 文件,配置 Git忽略项
- 添加 .prettierignore 文件,配置 Prettier 忽略项
- 添加隐私政策文档,详细说明用户数据的收集和使用
2025-08-23 20:31:46 +08:00

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;
}
}