/** * 自定义动画样式文件 * 包含常用的CSS动画效果和过渡效果 */ /* 基础动画类 */ .animate { animation-duration: 1s; animation-fill-mode: both; } .animate-fast { animation-duration: 0.5s; } .animate-slow { animation-duration: 2s; } /* 淡入淡出动画 */ @keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } } @keyframes fadeOut { from { opacity: 1; } to { opacity: 0; } } .fade-in { animation-name: fadeIn; } .fade-out { animation-name: fadeOut; } /* 滑动动画 */ @keyframes slideInUp { from { transform: translate3d(0, 100%, 0); visibility: visible; } to { transform: translate3d(0, 0, 0); } } @keyframes slideInDown { from { transform: translate3d(0, -100%, 0); visibility: visible; } to { transform: translate3d(0, 0, 0); } } @keyframes slideInLeft { from { transform: translate3d(-100%, 0, 0); visibility: visible; } to { transform: translate3d(0, 0, 0); } } @keyframes slideInRight { from { transform: translate3d(100%, 0, 0); visibility: visible; } to { transform: translate3d(0, 0, 0); } } .slide-in-up { animation-name: slideInUp; } .slide-in-down { animation-name: slideInDown; } .slide-in-left { animation-name: slideInLeft; } .slide-in-right { animation-name: slideInRight; } /* 缩放动画 */ @keyframes zoomIn { from { opacity: 0; transform: scale3d(0.3, 0.3, 0.3); } 50% { opacity: 1; } } @keyframes zoomOut { from { opacity: 1; } 50% { opacity: 0; transform: scale3d(0.3, 0.3, 0.3); } to { opacity: 0; } } .zoom-in { animation-name: zoomIn; } .zoom-out { animation-name: zoomOut; } /* 旋转动画 */ @keyframes rotateIn { from { transform-origin: center; transform: rotate3d(0, 0, 1, -200deg); opacity: 0; } to { transform-origin: center; transform: translate3d(0, 0, 0); opacity: 1; } } @keyframes spin { from { transform: rotate(0deg); } to { transform: rotate(360deg); } } .rotate-in { animation-name: rotateIn; } .spin { animation-name: spin; animation-duration: 1s; animation-iteration-count: infinite; animation-timing-function: linear; } /* 弹跳动画 */ @keyframes bounce { from, 20%, 53%, 80%, to { animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); transform: translate3d(0, 0, 0); } 40%, 43% { animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06); transform: translate3d(0, -30px, 0); } 70% { animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06); transform: translate3d(0, -15px, 0); } 90% { transform: translate3d(0, -4px, 0); } } .bounce { animation-name: bounce; transform-origin: center bottom; } /* 脉冲动画 */ @keyframes pulse { from { transform: scale3d(1, 1, 1); } 50% { transform: scale3d(1.05, 1.05, 1.05); } to { transform: scale3d(1, 1, 1); } } .pulse { animation-name: pulse; animation-iteration-count: infinite; } /* 摇摆动画 */ @keyframes shake { from, to { transform: translate3d(0, 0, 0); } 10%, 30%, 50%, 70%, 90% { transform: translate3d(-10px, 0, 0); } 20%, 40%, 60%, 80% { transform: translate3d(10px, 0, 0); } } .shake { animation-name: shake; } /* 翻转动画 */ @keyframes flipInX { from { transform: perspective(400px) rotate3d(1, 0, 0, 90deg); animation-timing-function: ease-in; opacity: 0; } 40% { transform: perspective(400px) rotate3d(1, 0, 0, -20deg); animation-timing-function: ease-in; } 60% { transform: perspective(400px) rotate3d(1, 0, 0, 10deg); opacity: 1; } 80% { transform: perspective(400px) rotate3d(1, 0, 0, -5deg); } to { transform: perspective(400px); } } @keyframes flipInY { from { transform: perspective(400px) rotate3d(0, 1, 0, 90deg); animation-timing-function: ease-in; opacity: 0; } 40% { transform: perspective(400px) rotate3d(0, 1, 0, -20deg); animation-timing-function: ease-in; } 60% { transform: perspective(400px) rotate3d(0, 1, 0, 10deg); opacity: 1; } 80% { transform: perspective(400px) rotate3d(0, 1, 0, -5deg); } to { transform: perspective(400px); } } .flip-in-x { animation-name: flipInX; backface-visibility: visible; } .flip-in-y { animation-name: flipInY; backface-visibility: visible; } /* 过渡效果 */ .transition-all { transition: all 0.3s ease; } .transition-opacity { transition: opacity 0.3s ease; } .transition-transform { transition: transform 0.3s ease; } .transition-colors { transition: color 0.3s ease, background-color 0.3s ease, border-color 0.3s ease; } /* 悬停效果 */ .hover-scale:hover { transform: scale(1.05); } .hover-lift:hover { transform: translateY(-5px); box-shadow: 0 10px 25px rgba(0, 0, 0, 0.15); } .hover-glow:hover { box-shadow: 0 0 20px rgba(0, 123, 255, 0.5); } /* 延迟动画 */ .delay-100 { animation-delay: 0.1s; } .delay-200 { animation-delay: 0.2s; } .delay-300 { animation-delay: 0.3s; } .delay-500 { animation-delay: 0.5s; } .delay-1000 { animation-delay: 1s; } /* 无限循环动画 */ .infinite { animation-iteration-count: infinite; } /* 动画暂停 */ .paused { animation-play-state: paused; } /* 响应式动画控制 */ @media (prefers-reduced-motion: reduce) { *, *::before, *::after { animation-duration: 0.01ms !important; animation-iteration-count: 1 !important; transition-duration: 0.01ms !important; } } /* 滚动触发动画的基础样式 */ .scroll-animate { opacity: 0; transform: translateY(30px); transition: all 0.6s ease; } .scroll-animate.active { opacity: 1; transform: translateY(0); } /* 加载动画 */ @keyframes loading { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } } .loading { display: inline-block; width: 20px; height: 20px; border: 3px solid rgba(0, 0, 0, 0.1); border-radius: 50%; border-top-color: #007bff; animation: loading 1s ease-in-out infinite; } /* 文字打字机效果 */ .typewriter { overflow: hidden; border-right: 0.15em solid orange; white-space: nowrap; margin: 0 auto; letter-spacing: 0.15em; animation: typing 3.5s steps(40, end), blink-caret 0.75s step-end infinite; } @keyframes typing { from { width: 0; } to { width: 100%; } } @keyframes blink-caret { from, to { border-color: transparent; } 50% { border-color: orange; } } /* GSAP动画元素初始状态 - 防止闪显 */ .gsap-animate, .section-title, .section-description, .accordion-item, .system-image img, .products-services-item, .features-item, .video-banner-content > *, [data-gsap-animate] { opacity: 0; visibility: hidden; } /* GSAP动画就绪后显示 */ .gsap-ready .gsap-animate, .gsap-ready .section-title, .gsap-ready .section-description, .gsap-ready .accordion-item, .gsap-ready .system-image img, .gsap-ready .products-services-item, .gsap-ready .features-item, .gsap-ready .video-banner-content > *, .gsap-ready [data-gsap-animate] { visibility: visible; }