|
|
/**
|
|
|
* 滚动触发动画系统 CSS
|
|
|
* 配合 GSAP ScrollTrigger 使用的动画类
|
|
|
* 使用方法:为元素添加相应的CSS类名即可
|
|
|
*/
|
|
|
|
|
|
/* ===== 基础动画配置 ===== */
|
|
|
.scroll-animate {
|
|
|
/* 确保动画平滑 */
|
|
|
will-change: transform, opacity;
|
|
|
/* 硬件加速 */
|
|
|
transform: translateZ(0);
|
|
|
backface-visibility: hidden;
|
|
|
perspective: 1000px;
|
|
|
}
|
|
|
|
|
|
/* ===== Fade In Up 动画 ===== */
|
|
|
.fade-in-up {
|
|
|
opacity: 0;
|
|
|
transform: translateY(50px);
|
|
|
transition: all 0.8s cubic-bezier(0.25, 0.46, 0.45, 0.94);
|
|
|
}
|
|
|
|
|
|
.fade-in-up.animate-active {
|
|
|
opacity: 1;
|
|
|
transform: translateY(0);
|
|
|
}
|
|
|
|
|
|
/* ===== Fade In Down 动画 ===== */
|
|
|
.fade-in-down {
|
|
|
opacity: 0;
|
|
|
transform: translateY(-50px);
|
|
|
transition: all 0.8s cubic-bezier(0.25, 0.46, 0.45, 0.94);
|
|
|
}
|
|
|
|
|
|
.fade-in-down.animate-active {
|
|
|
opacity: 1;
|
|
|
transform: translateY(0);
|
|
|
}
|
|
|
|
|
|
/* ===== Fade In Left 动画 ===== */
|
|
|
.fade-in-left {
|
|
|
opacity: 0;
|
|
|
transform: translateX(-50px);
|
|
|
transition: all 0.8s cubic-bezier(0.25, 0.46, 0.45, 0.94);
|
|
|
}
|
|
|
|
|
|
.fade-in-left.animate-active {
|
|
|
opacity: 1;
|
|
|
transform: translateX(0);
|
|
|
}
|
|
|
|
|
|
/* ===== Fade In Right 动画 ===== */
|
|
|
.fade-in-right {
|
|
|
opacity: 0;
|
|
|
transform: translateX(50px);
|
|
|
transition: all 0.8s cubic-bezier(0.25, 0.46, 0.45, 0.94);
|
|
|
}
|
|
|
|
|
|
.fade-in-right.animate-active {
|
|
|
opacity: 1;
|
|
|
transform: translateX(0);
|
|
|
}
|
|
|
|
|
|
/* ===== Scale In 动画 ===== */
|
|
|
.scale-in {
|
|
|
opacity: 0;
|
|
|
transform: scale(0.8);
|
|
|
transition: all 0.8s cubic-bezier(0.25, 0.46, 0.45, 0.94);
|
|
|
}
|
|
|
|
|
|
.scale-in.animate-active {
|
|
|
opacity: 1;
|
|
|
transform: scale(1);
|
|
|
}
|
|
|
|
|
|
/* ===== Rotate In 动画 ===== */
|
|
|
.rotate-in {
|
|
|
opacity: 0;
|
|
|
transform: rotate(-10deg) scale(0.9);
|
|
|
transition: all 0.8s cubic-bezier(0.25, 0.46, 0.45, 0.94);
|
|
|
}
|
|
|
|
|
|
.rotate-in.animate-active {
|
|
|
opacity: 1;
|
|
|
transform: rotate(0deg) scale(1);
|
|
|
}
|
|
|
|
|
|
/* ===== 组合动画 ===== */
|
|
|
.fade-scale-up {
|
|
|
opacity: 0;
|
|
|
transform: translateY(30px) scale(0.95);
|
|
|
transition: all 0.8s cubic-bezier(0.25, 0.46, 0.45, 0.94);
|
|
|
}
|
|
|
|
|
|
.fade-scale-up.animate-active {
|
|
|
opacity: 1;
|
|
|
transform: translateY(0) scale(1);
|
|
|
}
|
|
|
|
|
|
/* ===== 动画延迟类 ===== */
|
|
|
.animate-delay-100 { transition-delay: 0.1s; }
|
|
|
.animate-delay-200 { transition-delay: 0.2s; }
|
|
|
.animate-delay-300 { transition-delay: 0.3s; }
|
|
|
.animate-delay-400 { transition-delay: 0.4s; }
|
|
|
.animate-delay-500 { transition-delay: 0.5s; }
|
|
|
.animate-delay-600 { transition-delay: 0.6s; }
|
|
|
.animate-delay-700 { transition-delay: 0.7s; }
|
|
|
.animate-delay-800 { transition-delay: 0.8s; }
|
|
|
|
|
|
/* ===== 动画速度类 ===== */
|
|
|
.animate-fast {
|
|
|
transition-duration: 0.4s !important;
|
|
|
}
|
|
|
|
|
|
.animate-slow {
|
|
|
transition-duration: 1.2s !important;
|
|
|
}
|
|
|
|
|
|
.animate-slower {
|
|
|
transition-duration: 1.6s !important;
|
|
|
}
|
|
|
|
|
|
/* ===== 动画缓动函数类 ===== */
|
|
|
.animate-ease-out {
|
|
|
transition-timing-function: cubic-bezier(0.25, 0.46, 0.45, 0.94) !important;
|
|
|
}
|
|
|
|
|
|
.animate-ease-in-out {
|
|
|
transition-timing-function: cubic-bezier(0.42, 0, 0.58, 1) !important;
|
|
|
}
|
|
|
|
|
|
.animate-bounce {
|
|
|
transition-timing-function: cubic-bezier(0.68, -0.55, 0.265, 1.55) !important;
|
|
|
}
|
|
|
|
|
|
/* ===== 特殊效果 ===== */
|
|
|
.blur-in {
|
|
|
opacity: 0;
|
|
|
filter: blur(10px);
|
|
|
transform: translateY(20px);
|
|
|
transition: all 0.8s cubic-bezier(0.25, 0.46, 0.45, 0.94);
|
|
|
}
|
|
|
|
|
|
.blur-in.animate-active {
|
|
|
opacity: 1;
|
|
|
filter: blur(0px);
|
|
|
transform: translateY(0);
|
|
|
}
|
|
|
|
|
|
/* ===== 文字动画 ===== */
|
|
|
.text-reveal {
|
|
|
opacity: 0;
|
|
|
transform: translateY(100%);
|
|
|
display: inline-block;
|
|
|
transition: all 0.6s cubic-bezier(0.25, 0.46, 0.45, 0.94);
|
|
|
}
|
|
|
|
|
|
.text-reveal.animate-active {
|
|
|
opacity: 1;
|
|
|
transform: translateY(0);
|
|
|
}
|
|
|
|
|
|
/* ===== 容器动画(用于包含多个子元素的情况) ===== */
|
|
|
.stagger-container .stagger-item {
|
|
|
opacity: 0;
|
|
|
transform: translateY(30px);
|
|
|
transition: all 0.6s cubic-bezier(0.25, 0.46, 0.45, 0.94);
|
|
|
}
|
|
|
|
|
|
.stagger-container.animate-active .stagger-item:nth-child(1) {
|
|
|
transition-delay: 0.1s;
|
|
|
}
|
|
|
|
|
|
.stagger-container.animate-active .stagger-item:nth-child(2) {
|
|
|
transition-delay: 0.2s;
|
|
|
}
|
|
|
|
|
|
.stagger-container.animate-active .stagger-item:nth-child(3) {
|
|
|
transition-delay: 0.3s;
|
|
|
}
|
|
|
|
|
|
.stagger-container.animate-active .stagger-item:nth-child(4) {
|
|
|
transition-delay: 0.4s;
|
|
|
}
|
|
|
|
|
|
.stagger-container.animate-active .stagger-item:nth-child(5) {
|
|
|
transition-delay: 0.5s;
|
|
|
}
|
|
|
|
|
|
.stagger-container.animate-active .stagger-item {
|
|
|
opacity: 1;
|
|
|
transform: translateY(0);
|
|
|
}
|
|
|
|
|
|
/* ===== 响应式优化 ===== */
|
|
|
@media (max-width: 768px) {
|
|
|
.fade-in-up,
|
|
|
.fade-in-down,
|
|
|
.fade-in-left,
|
|
|
.fade-in-right,
|
|
|
.scale-in,
|
|
|
.rotate-in,
|
|
|
.fade-scale-up,
|
|
|
.blur-in {
|
|
|
/* 移动端减少动画距离 */
|
|
|
transform: translateY(20px);
|
|
|
transition-duration: 0.6s;
|
|
|
}
|
|
|
|
|
|
.fade-in-left {
|
|
|
transform: translateX(-20px);
|
|
|
}
|
|
|
|
|
|
.fade-in-right {
|
|
|
transform: translateX(20px);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/* ===== 减少动画偏好设置支持 ===== */
|
|
|
@media (prefers-reduced-motion: reduce) {
|
|
|
.fade-in-up,
|
|
|
.fade-in-down,
|
|
|
.fade-in-left,
|
|
|
.fade-in-right,
|
|
|
.scale-in,
|
|
|
.rotate-in,
|
|
|
.fade-scale-up,
|
|
|
.blur-in,
|
|
|
.text-reveal,
|
|
|
.stagger-item {
|
|
|
transition-duration: 0.01ms !important;
|
|
|
transition-delay: 0.01ms !important;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/* ===== 调试模式 ===== */
|
|
|
.scroll-animate-debug {
|
|
|
position: relative;
|
|
|
}
|
|
|
|
|
|
.scroll-animate-debug::before {
|
|
|
content: 'ScrollTrigger Debug';
|
|
|
position: absolute;
|
|
|
top: -20px;
|
|
|
left: 0;
|
|
|
background: rgba(255, 0, 0, 0.8);
|
|
|
color: white;
|
|
|
padding: 2px 6px;
|
|
|
font-size: 10px;
|
|
|
z-index: 9999;
|
|
|
pointer-events: none;
|
|
|
} |