/* * Дополнительные анимации в стиле Apple * Микро-взаимодействия и плавные переходы */ /* ===== Плавное появление элементов ===== */ .fade-in { opacity: 0; transform: translateY(30px); animation: fadeInUp 0.8s cubic-bezier(0.4, 0, 0.2, 1) forwards; } @keyframes fadeInUp { from { opacity: 0; transform: translateY(30px); } to { opacity: 1; transform: translateY(0); } } /* ===== Эффект подъема текста при скролле ===== */ .scroll-text-effect { transition: all 0.5s cubic-bezier(0.4, 0, 0.2, 1); will-change: transform, opacity; } /* ===== Эффект блоков с боков ===== */ .side-block { opacity: 0; transform: translateX(0); transition: all 0.8s cubic-bezier(0.4, 0, 0.2, 1); } .side-block.from-left { transform: translateX(-100px); } .side-block.from-right { transform: translateX(100px); } .side-block.visible { opacity: 1; transform: translateX(0) translateY(0); } /* ===== Плавающая анимация ===== */ .float { animation: float 6s ease-in-out infinite; } @keyframes float { 0%, 100% { transform: translateY(0); } 50% { transform: translateY(-20px); } } /* ===== Пульсация ===== */ .pulse { animation: pulse 2s ease-in-out infinite; } @keyframes pulse { 0%, 100% { opacity: 1; transform: scale(1); } 50% { opacity: 0.8; transform: scale(1.05); } } /* ===== Вращение ===== */ .spin { animation: spin 20s linear infinite; } @keyframes spin { from { transform: rotate(0deg); } to { transform: rotate(360deg); } } /* ===== Сдвиг градиента ===== */ .gradient-shift { background: linear-gradient(90deg, var(--color-blue) 0%, var(--color-green) 25%, var(--color-orange) 50%, var(--color-red) 75%, var(--color-blue) 100%); background-size: 400% 400%; animation: gradientShift 3s ease infinite; } @keyframes gradientShift { 0%, 100% { background-position: 0% 50%; } 50% { background-position: 100% 50%; } } /* ===== Эффект набора текста ===== */ .typewriter { overflow: hidden; border-right: 3px solid var(--color-blue); 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: var(--color-blue) } } /* ===== Эффект мерцания ===== */ .shimmer { background: linear-gradient(90deg, transparent 0%, rgba(255, 255, 255, 0.2) 50%, transparent 100%); background-size: 1000px 100%; animation: shimmer 2s infinite; } @keyframes shimmer { 0% { background-position: -1000px 0; } 100% { background-position: 1000px 0; } } /* ===== Эффект волны ===== */ .wave { position: relative; overflow: hidden; } .wave::after { content: ''; position: absolute; top: 0; left: -100%; width: 100%; height: 100%; background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.2), transparent); animation: wave 1.5s ease-in-out; } @keyframes wave { 0% { left: -100%; } 100% { left: 100%; } } /* ===== Эффект увеличения ===== */ .zoom-in { animation: zoomIn 0.5s cubic-bezier(0.4, 0, 0.2, 1) forwards; } @keyframes zoomIn { from { opacity: 0; transform: scale(0.8); } to { opacity: 1; transform: scale(1); } } /* ===== Эффект скольжения ===== */ .slide-in-left { animation: slideInLeft 0.8s cubic-bezier(0.4, 0, 0.2, 1) forwards; } .slide-in-right { animation: slideInRight 0.8s cubic-bezier(0.4, 0, 0.2, 1) forwards; } .slide-in-up { animation: slideInUp 0.8s cubic-bezier(0.4, 0, 0.2, 1) forwards; } @keyframes slideInLeft { from { opacity: 0; transform: translateX(-50px); } to { opacity: 1; transform: translateX(0); } } @keyframes slideInRight { from { opacity: 0; transform: translateX(50px); } to { opacity: 1; transform: translateX(0); } } @keyframes slideInUp { from { opacity: 0; transform: translateY(50px); } to { opacity: 1; transform: translateY(0); } } /* ===== Эффект переворота ===== */ .flip { animation: flip 0.8s cubic-bezier(0.4, 0, 0.2, 1) forwards; } @keyframes flip { from { opacity: 0; transform: rotateY(90deg); } to { opacity: 1; transform: rotateY(0); } } /* ===== Эффект отскока ===== */ .bounce { animation: bounce 0.5s cubic-bezier(0.68, -0.55, 0.265, 1.55); } @keyframes bounce { 0%, 100% { transform: translateY(0); } 50% { transform: translateY(-20px); } } /* ===== Эффект дрожания ===== */ .shake { animation: shake 0.5s cubic-bezier(.36,.07,.19,.97) both; } @keyframes shake { 10%, 90% { transform: translateX(-1px); } 20%, 80% { transform: translateX(2px); } 30%, 50%, 70% { transform: translateX(-4px); } 40%, 60% { transform: translateX(4px); } } /* ===== Эффект свечения ===== */ .glow { animation: glow 2s ease-in-out infinite alternate; } @keyframes glow { from { box-shadow: 0 0 10px rgba(0, 122, 255, 0.5); } to { box-shadow: 0 0 20px rgba(0, 122, 255, 0.8); } } /* ===== Эффект загрузки ===== */ .loading { position: relative; overflow: hidden; } .loading::after { content: ''; position: absolute; top: 0; left: -100%; width: 100%; height: 100%; background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.3), transparent); animation: loading 1.5s infinite; } @keyframes loading { 0% { left: -100%; } 100% { left: 100%; } } /* ===== Эффект частиц ===== */ .particle { position: absolute; width: 4px; height: 4px; background: var(--color-blue); border-radius: 50%; opacity: 0; animation: particleFloat 3s ease-in-out infinite; } @keyframes particleFloat { 0% { transform: translateY(0) translateX(0); opacity: 0; } 10% { opacity: 0.5; } 90% { opacity: 0.5; } 100% { transform: translateY(-100px) translateX(20px); opacity: 0; } } /* ===== Эффект неона ===== */ .neon { color: #fff; text-shadow: 0 0 5px #fff, 0 0 10px #fff, 0 0 20px var(--color-blue), 0 0 40px var(--color-blue), 0 0 80px var(--color-blue); animation: neonFlicker 1.5s infinite alternate; } @keyframes neonFlicker { 0%, 18%, 22%, 25%, 53%, 57%, 100% { text-shadow: 0 0 5px #fff, 0 0 10px #fff, 0 0 20px var(--color-blue), 0 0 40px var(--color-blue), 0 0 80px var(--color-blue); } 20%, 24%, 55% { text-shadow: none; } } /* ===== Эффект жидкости ===== */ .liquid { position: relative; overflow: hidden; } .liquid::before { content: ''; position: absolute; bottom: 0; left: 0; width: 100%; height: 30%; background: var(--gradient-accent); animation: liquidRise 3s ease-in-out infinite; border-radius: 50% 50% 0 0; } @keyframes liquidRise { 0%, 100% { height: 30%; transform: translateY(0); } 50% { height: 70%; transform: translateY(-20%); } } /* ===== Эффект морфинга ===== */ .morph { animation: morph 4s ease-in-out infinite; } @keyframes morph { 0%, 100% { border-radius: 60% 40% 30% 70% / 60% 30% 70% 40%; } 50% { border-radius: 30% 60% 70% 40% / 50% 60% 30% 60%; } } /* ===== Задержки анимаций ===== */ .delay-100 { animation-delay: 100ms; } .delay-200 { animation-delay: 200ms; } .delay-300 { animation-delay: 300ms; } .delay-400 { animation-delay: 400ms; } .delay-500 { animation-delay: 500ms; } /* ===== Длительность анимаций ===== */ .duration-fast { animation-duration: 0.3s; } .duration-medium { animation-duration: 0.6s; } .duration-slow { animation-duration: 1s; } /* ===== Направление анимаций ===== */ .animation-forwards { animation-fill-mode: forwards; } .animation-backwards { animation-fill-mode: backwards; } .animation-both { animation-fill-mode: both; } /* ===== Отключение анимаций для пользователей, которые их не хотят ===== */ @media (prefers-reduced-motion: reduce) { *, *::before, *::after { animation-duration: 0.01ms !important; animation-iteration-count: 1 !important; transition-duration: 0.01ms !important; } }