/* 2024长三角国际新能源汽车与智能交通产业博览会 - 高级动画样式 */ /* ============================================ 字体图标引入 ============================================ */ @import url('https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css'); /* ============================================ 自定义字体 ============================================ */ @font-face { font-family: 'TechFont'; src: url('https://fonts.googleapis.com/css2?family=Orbitron:wght@400;700;900&display=swap'); } /* ============================================ 核心动画变量 ============================================ */ :root { /* 动画时长 */ --anim-fast: 0.2s; --anim-normal: 0.3s; --anim-slow: 0.5s; --anim-slower: 0.8s; --anim-slowest: 1.2s; /* 缓动函数 */ --ease-bounce: cubic-bezier(0.68, -0.55, 0.265, 1.55); --ease-elastic: cubic-bezier(0.68, -0.55, 0.265, 1.55); --ease-smooth: cubic-bezier(0.4, 0, 0.2, 1); --ease-sharp: cubic-bezier(0.4, 0, 0.6, 1); /* 渐变色 */ --gradient-electric: linear-gradient(135deg, #667eea 0%, #764ba2 100%); --gradient-ocean: linear-gradient(135deg, #667eea 0%, #42e695 100%); --gradient-sunset: linear-gradient(135deg, #fa709a 0%, #fee140 100%); --gradient-aurora: linear-gradient(135deg, #42e695 0%, #3bb2b8 100%); } /* ============================================ 基础动画类 ============================================ */ /* 淡入向上动画 */ .animate-fadeInUp { opacity: 0; transform: translateY(30px); animation: fadeInUp 0.8s ease-out forwards; } @keyframes fadeInUp { to { opacity: 1; transform: translateY(0); } } /* 淡入向左动画 */ .animate-fadeInLeft { opacity: 0; transform: translateX(-30px); animation: fadeInLeft 0.8s ease-out forwards; } @keyframes fadeInLeft { to { opacity: 1; transform: translateX(0); } } /* 淡入向右动画 */ .animate-fadeInRight { opacity: 0; transform: translateX(30px); animation: fadeInRight 0.8s ease-out forwards; } @keyframes fadeInRight { to { opacity: 1; transform: translateX(0); } } /* 动画延迟类 */ .animation-delay-100 { animation-delay: 0.1s; } .animation-delay-200 { animation-delay: 0.2s; } .animation-delay-300 { animation-delay: 0.3s; } .animation-delay-400 { animation-delay: 0.4s; } .animation-delay-500 { animation-delay: 0.5s; } .animation-delay-600 { animation-delay: 0.6s; } .animation-delay-700 { animation-delay: 0.7s; } .animation-delay-800 { animation-delay: 0.8s; } .animation-delay-900 { animation-delay: 0.9s; } .animation-delay-1000 { animation-delay: 1s; } .animation-delay-1100 { animation-delay: 1.1s; } .animation-delay-2000 { animation-delay: 2s; } .animation-delay-4000 { animation-delay: 4s; } /* ============================================ 页面加载动画 ============================================ */ .page-loader { position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); z-index: 9999; display: flex; align-items: center; justify-content: center; animation: fadeOut 0.5s ease-out 1s forwards; } .loader-content { text-align: center; } .loader-logo { width: 100px; height: 100px; margin: 0 auto 20px; background: white; border-radius: 20px; display: flex; align-items: center; justify-content: center; animation: pulse 1s infinite; } .loader-text { color: white; font-size: 1.2rem; animation: fadeInUp 0.5s ease-out; } .loader-progress { width: 200px; height: 4px; background: rgba(255, 255, 255, 0.3); border-radius: 2px; margin: 20px auto; overflow: hidden; } .loader-progress-bar { width: 0%; height: 100%; background: white; animation: loading 1s ease-out forwards; } @keyframes loading { to { width: 100%; } } /* ============================================ 入场动画 ============================================ */ .fade-in { opacity: 0; animation: fadeIn var(--anim-slow) ease-out forwards; } @keyframes fadeIn { to { opacity: 1; } } .fade-in-up { opacity: 0; transform: translateY(30px); animation: fadeInUp var(--anim-slow) ease-out forwards; } @keyframes fadeInUp { to { opacity: 1; transform: translateY(0); } } .fade-in-down { opacity: 0; transform: translateY(-30px); animation: fadeInDown var(--anim-slow) ease-out forwards; } @keyframes fadeInDown { to { opacity: 1; transform: translateY(0); } } .fade-in-left { opacity: 0; transform: translateX(-30px); animation: fadeInLeft var(--anim-slow) ease-out forwards; } @keyframes fadeInLeft { to { opacity: 1; transform: translateX(0); } } .fade-in-right { opacity: 0; transform: translateX(30px); animation: fadeInRight var(--anim-slow) ease-out forwards; } @keyframes fadeInRight { to { opacity: 1; transform: translateX(0); } } /* ============================================ 缩放动画 ============================================ */ .zoom-in { opacity: 0; transform: scale(0.8); animation: zoomIn var(--anim-slow) var(--ease-bounce) forwards; } @keyframes zoomIn { to { opacity: 1; transform: scale(1); } } .zoom-out { opacity: 0; transform: scale(1.2); animation: zoomOut var(--anim-slow) var(--ease-bounce) forwards; } @keyframes zoomOut { to { opacity: 1; transform: scale(1); } } /* ============================================ 旋转动画 ============================================ */ .rotate-in { opacity: 0; transform: rotate(-180deg) scale(0.8); animation: rotateIn var(--anim-slow) var(--ease-bounce) forwards; } @keyframes rotateIn { to { opacity: 1; transform: rotate(0) scale(1); } } .flip-in-x { opacity: 0; transform: rotateX(-90deg); animation: flipInX var(--anim-slow) ease-out forwards; } @keyframes flipInX { to { opacity: 1; transform: rotateX(0); } } .flip-in-y { opacity: 0; transform: rotateY(-90deg); animation: flipInY var(--anim-slow) ease-out forwards; } @keyframes flipInY { to { opacity: 1; transform: rotateY(0); } } /* ============================================ 弹跳动画 ============================================ */ .bounce-in { opacity: 0; transform: scale(0.3); animation: bounceIn var(--anim-slower) var(--ease-bounce) forwards; } @keyframes bounceIn { 0% { opacity: 0; transform: scale(0.3); } 50% { opacity: 1; transform: scale(1.05); } 70% { transform: scale(0.9); } 100% { opacity: 1; transform: scale(1); } } /* ============================================ 悬停效果 ============================================ */ .hover-grow { transition: transform var(--anim-normal) var(--ease-smooth); } .hover-grow:hover { transform: scale(1.05); } .hover-shrink { transition: transform var(--anim-normal) var(--ease-smooth); } .hover-shrink:hover { transform: scale(0.95); } .hover-rotate { transition: transform var(--anim-normal) var(--ease-smooth); } .hover-rotate:hover { transform: rotate(5deg); } .hover-lift { transition: all var(--anim-normal) var(--ease-smooth); } .hover-lift:hover { transform: translateY(-8px); box-shadow: 0 20px 40px rgba(0, 0, 0, 0.15); } .hover-sink { transition: all var(--anim-normal) var(--ease-smooth); } .hover-sink:hover { transform: translateY(3px); box-shadow: 0 5px 15px rgba(0, 0, 0, 0.1); } /* ============================================ 按钮悬停效果 ============================================ */ .btn-hover-fill { position: relative; overflow: hidden; transition: color var(--anim-normal); z-index: 1; } .btn-hover-fill::before { content: ''; position: absolute; top: 0; left: -100%; width: 100%; height: 100%; background: var(--gradient-electric); transition: left var(--anim-normal) var(--ease-smooth); z-index: -1; } .btn-hover-fill:hover::before { left: 0; } .btn-hover-fill:hover { color: white; } /* 按钮波纹效果 */ .btn-ripple { position: relative; overflow: hidden; } .btn-ripple::after { content: ''; position: absolute; top: 50%; left: 50%; width: 0; height: 0; border-radius: 50%; background: rgba(255, 255, 255, 0.5); transform: translate(-50%, -50%); transition: width 0.6s, height 0.6s; } .btn-ripple:active::after { width: 300px; height: 300px; } /* 按钮发光效果 */ .btn-glow { transition: all var(--anim-normal); } .btn-glow:hover { box-shadow: 0 0 20px rgba(102, 126, 234, 0.6), 0 0 40px rgba(102, 126, 234, 0.4), 0 0 60px rgba(102, 126, 234, 0.2); } /* ============================================ 图片悬停效果 ============================================ */ .img-hover-zoom { overflow: hidden; } .img-hover-zoom img { transition: transform var(--anim-slow) var(--ease-smooth); } .img-hover-zoom:hover img { transform: scale(1.1); } .img-hover-rotate { overflow: hidden; } .img-hover-rotate img { transition: transform var(--anim-slow) var(--ease-smooth); } .img-hover-rotate:hover img { transform: scale(1.1) rotate(3deg); } .img-hover-blur { overflow: hidden; } .img-hover-blur img { transition: all var(--anim-slow) var(--ease-smooth); } .img-hover-blur:hover img { filter: blur(3px); transform: scale(1.1); } /* 图片叠加效果 */ .img-overlay { position: relative; overflow: hidden; } .img-overlay::before { content: ''; position: absolute; top: 0; left: 0; width: 100%; height: 100%; background: linear-gradient(135deg, rgba(102, 126, 234, 0.8), rgba(118, 75, 162, 0.8)); opacity: 0; transition: opacity var(--anim-normal); z-index: 1; } .img-overlay:hover::before { opacity: 1; } .img-overlay-content { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); color: white; text-align: center; opacity: 0; transition: opacity var(--anim-normal); z-index: 2; } .img-overlay:hover .img-overlay-content { opacity: 1; } /* ============================================ 文字动画 ============================================ */ .text-glow { animation: textGlow 2s ease-in-out infinite alternate; } @keyframes textGlow { from { text-shadow: 0 0 10px rgba(102, 126, 234, 0.5), 0 0 20px rgba(102, 126, 234, 0.3); } to { text-shadow: 0 0 20px rgba(102, 126, 234, 0.8), 0 0 30px rgba(102, 126, 234, 0.5); } } .text-typing { overflow: hidden; border-right: 2px solid; white-space: nowrap; 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: currentColor; } } .text-gradient-animate { background: linear-gradient(90deg, #667eea, #764ba2, #42e695, #667eea); background-size: 300% 100%; -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text; animation: gradientMove 5s ease infinite; } @keyframes gradientMove { 0% { background-position: 0% 50%; } 50% { background-position: 100% 50%; } 100% { background-position: 0% 50%; } } /* ============================================ 卡片动画 ============================================ */ .card-3d { transform-style: preserve-3d; transition: transform var(--anim-slow) var(--ease-smooth); } .card-3d:hover { transform: rotateY(10deg) rotateX(10deg) translateZ(20px); } .card-flip { position: relative; transform-style: preserve-3d; transition: transform var(--anim-slow); } .card-flip:hover { transform: rotateY(180deg); } .card-flip-front, .card-flip-back { position: absolute; width: 100%; height: 100%; backface-visibility: hidden; } .card-flip-back { transform: rotateY(180deg); } /* ============================================ 滚动动画 ============================================ */ .scroll-reveal { opacity: 0; transform: translateY(50px); transition: all var(--anim-slower) var(--ease-smooth); } .scroll-reveal.revealed { opacity: 1; transform: translateY(0); } .scroll-reveal-left { opacity: 0; transform: translateX(-50px); transition: all var(--anim-slower) var(--ease-smooth); } .scroll-reveal-left.revealed { opacity: 1; transform: translateX(0); } .scroll-reveal-right { opacity: 0; transform: translateX(50px); transition: all var(--anim-slower) var(--ease-smooth); } .scroll-reveal-right.revealed { opacity: 1; transform: translateX(0); } .scroll-reveal-scale { opacity: 0; transform: scale(0.8); transition: all var(--anim-slower) var(--ease-smooth); } .scroll-reveal-scale.revealed { opacity: 1; transform: scale(1); } /* ============================================ 视差效果 ============================================ */ .parallax { position: relative; transform-style: preserve-3d; } .parallax-layer { position: absolute; top: 0; left: 0; width: 100%; height: 100%; } .parallax-layer-back { transform: translateZ(-1px) scale(2); } .parallax-layer-base { transform: translateZ(0); } .parallax-layer-front { transform: translateZ(1px) scale(0.5); } /* ============================================ 加载动画 ============================================ */ .skeleton { position: relative; overflow: hidden; background: #f0f0f0; } .skeleton::after { content: ''; position: absolute; top: 0; left: -100%; width: 100%; height: 100%; background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.5), transparent); animation: skeleton-loading 1.5s infinite; } @keyframes skeleton-loading { to { left: 100%; } } /* ============================================ 脉冲动画 ============================================ */ .pulse { animation: pulse 2s infinite; } @keyframes pulse { 0% { transform: scale(1); opacity: 1; } 50% { transform: scale(1.05); opacity: 0.8; } 100% { transform: scale(1); opacity: 1; } } .pulse-slow { animation: pulse 3s infinite; } .pulse-fast { animation: pulse 1s infinite; } /* ============================================ 抖动动画 ============================================ */ .shake { animation: shake 0.5s; } @keyframes shake { 0%, 100% { transform: translateX(0); } 10%, 30%, 50%, 70%, 90% { transform: translateX(-10px); } 20%, 40%, 60%, 80% { transform: translateX(10px); } } .shake-horizontal { animation: shakeHorizontal 0.5s; } @keyframes shakeHorizontal { 0%, 100% { transform: translateX(0); } 25% { transform: translateX(-5px); } 75% { transform: translateX(5px); } } /* ============================================ 浮动动画 ============================================ */ .float { animation: float 3s ease-in-out infinite; } @keyframes float { 0%, 100% { transform: translateY(0); } 50% { transform: translateY(-20px); } } .float-slow { animation: float 5s ease-in-out infinite; } .float-fast { animation: float 2s ease-in-out infinite; } /* ============================================ 闪烁动画 ============================================ */ .blink { animation: blink 1s infinite; } @keyframes blink { 0%, 100% { opacity: 1; } 50% { opacity: 0; } } .flash { animation: flash 0.5s; } @keyframes flash { 0%, 50%, 100% { opacity: 1; } 25%, 75% { opacity: 0; } } /* ============================================ 渐变背景动画 ============================================ */ .bg-gradient-animate { background: linear-gradient(-45deg, #ee7752, #e73c7e, #23a6d5, #23d5ab); 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%; } } /* ============================================ 光标跟随效果 ============================================ */ .cursor-follow { position: fixed; width: 20px; height: 20px; border: 2px solid #667eea; border-radius: 50%; pointer-events: none; transition: all 0.1s ease; z-index: 9999; } .cursor-follow.active { transform: scale(2); background: rgba(102, 126, 234, 0.1); } /* ============================================ 工具提示 ============================================ */ .tooltip { position: relative; } .tooltip::after { content: attr(data-tooltip); position: absolute; bottom: 125%; left: 50%; transform: translateX(-50%) scale(0); background: #333; color: white; padding: 8px 12px; border-radius: 6px; font-size: 14px; white-space: nowrap; opacity: 0; transition: all var(--anim-normal) var(--ease-smooth); pointer-events: none; } .tooltip::before { content: ''; position: absolute; bottom: 115%; left: 50%; transform: translateX(-50%) scale(0); border: 6px solid transparent; border-top-color: #333; opacity: 0; transition: all var(--anim-normal) var(--ease-smooth); } .tooltip:hover::after, .tooltip:hover::before { transform: translateX(-50%) scale(1); opacity: 1; } /* ============================================ 交错动画 ============================================ */ .stagger-children > * { opacity: 0; transform: translateY(20px); animation: staggerIn var(--anim-slow) var(--ease-smooth) forwards; } .stagger-children > *:nth-child(1) { animation-delay: 0.1s; } .stagger-children > *:nth-child(2) { animation-delay: 0.2s; } .stagger-children > *:nth-child(3) { animation-delay: 0.3s; } .stagger-children > *:nth-child(4) { animation-delay: 0.4s; } .stagger-children > *:nth-child(5) { animation-delay: 0.5s; } .stagger-children > *:nth-child(6) { animation-delay: 0.6s; } .stagger-children > *:nth-child(7) { animation-delay: 0.7s; } .stagger-children > *:nth-child(8) { animation-delay: 0.8s; } @keyframes staggerIn { to { opacity: 1; transform: translateY(0); } } /* ============================================ 模糊背景 ============================================ */ .blur-background { backdrop-filter: blur(10px); background: rgba(255, 255, 255, 0.8); } .glass-morphism { background: rgba(255, 255, 255, 0.1); backdrop-filter: blur(10px); border: 1px solid rgba(255, 255, 255, 0.2); box-shadow: 0 8px 32px 0 rgba(31, 38, 135, 0.37); } /* ============================================ 响应式动画 ============================================ */ @media (prefers-reduced-motion: reduce) { *, *::before, *::after { animation-duration: 0.01ms !important; animation-iteration-count: 1 !important; transition-duration: 0.01ms !important; } }