You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

456 lines
7.7 KiB

/**
* 自定义动画样式文件
* 包含常用的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;
}