Переписаны компоенты главной страницы
This commit is contained in:
parent
2b087c02b7
commit
284e37fa94
7 changed files with 320 additions and 227 deletions
|
|
@ -50,6 +50,19 @@ const {
|
|||
const showImage = layout === 'with-image' && sideImage;
|
||||
---
|
||||
|
||||
<!-- КРИТИЧНО: Инлайн-скрипт скрывает элементы ДО рендера, но только если JS работает -->
|
||||
<script is:inline>
|
||||
(function() {
|
||||
if (window.matchMedia('(prefers-reduced-motion: reduce)').matches) return;
|
||||
|
||||
const style = document.createElement('style');
|
||||
style.textContent = '.animate-load{opacity:0;transform:translateY(30px)}' +
|
||||
'.hero-image-wrapper.animate-load{opacity:0;transform:translateX(50px) scale(0.95)}' +
|
||||
'.experience-badge.animate-load{opacity:0;transform:translateY(20px) scale(0.9)}';
|
||||
document.head.appendChild(style);
|
||||
})();
|
||||
</script>
|
||||
|
||||
<section
|
||||
class="hero-section"
|
||||
style={`min-height: ${minHeight}; padding-top: ${headerOffset}; ${bgImage ? `background-image: url("${bgImage}")` : ''}`}
|
||||
|
|
@ -142,7 +155,6 @@ const showImage = layout === 'with-image' && sideImage;
|
|||
animatedElements.forEach((el) => {
|
||||
const delay = parseInt((el as HTMLElement).dataset.delay || '0');
|
||||
|
||||
// Используем requestAnimationFrame для лучшей производительности
|
||||
setTimeout(() => {
|
||||
requestAnimationFrame(() => {
|
||||
el.classList.add('is-visible');
|
||||
|
|
@ -220,10 +232,10 @@ const showImage = layout === 'with-image' && sideImage;
|
|||
max-width: 700px;
|
||||
}
|
||||
|
||||
/* --- АНИМАЦИИ ПРИ ЗАГРУЗКЕ --- */
|
||||
/* --- АНИМАЦИИ ПРИ ЗАГРУЗКЕ - ИСПРАВЛЕНО: opacity:1 по умолчанию --- */
|
||||
.animate-load {
|
||||
opacity: 0;
|
||||
transform: translateY(30px);
|
||||
opacity: 1;
|
||||
transform: translateY(0);
|
||||
transition: opacity 0.8s cubic-bezier(0.4, 0, 0.2, 1),
|
||||
transform 0.8s cubic-bezier(0.4, 0, 0.2, 1);
|
||||
will-change: opacity, transform;
|
||||
|
|
@ -236,8 +248,8 @@ const showImage = layout === 'with-image' && sideImage;
|
|||
|
||||
/* Специальная анимация для изображения */
|
||||
.hero-image-wrapper.animate-load {
|
||||
opacity: 0;
|
||||
transform: translateX(50px) scale(0.95);
|
||||
opacity: 1;
|
||||
transform: translateX(0) scale(1);
|
||||
transition: opacity 1s cubic-bezier(0.4, 0, 0.2, 1),
|
||||
transform 1s cubic-bezier(0.4, 0, 0.2, 1);
|
||||
}
|
||||
|
|
@ -249,8 +261,8 @@ const showImage = layout === 'with-image' && sideImage;
|
|||
|
||||
/* Анимация для бейджа опыта */
|
||||
.experience-badge.animate-load {
|
||||
opacity: 0;
|
||||
transform: translateY(20px) scale(0.9);
|
||||
opacity: 1;
|
||||
transform: translateY(0) scale(1);
|
||||
transition: opacity 0.6s cubic-bezier(0.4, 0, 0.2, 1),
|
||||
transform 0.6s cubic-bezier(0.4, 0, 0.2, 1);
|
||||
}
|
||||
|
|
@ -281,7 +293,7 @@ const showImage = layout === 'with-image' && sideImage;
|
|||
flex-shrink: 0;
|
||||
}
|
||||
|
||||
/* Мерцающая точка - ИСПРАВЛЕНО: заменил box-shadow на opacity/transform */
|
||||
/* Мерцающая точка - оптимизированная анимация */
|
||||
.status-dot {
|
||||
width: 10px;
|
||||
height: 10px;
|
||||
|
|
@ -317,7 +329,6 @@ const showImage = layout === 'with-image' && sideImage;
|
|||
stroke-width: 2 !important;
|
||||
}
|
||||
|
||||
/* Оптимизированная анимация pulse - только opacity и transform */
|
||||
@keyframes pulse-ring {
|
||||
0% {
|
||||
transform: scale(1);
|
||||
|
|
@ -472,7 +483,7 @@ const showImage = layout === 'with-image' && sideImage;
|
|||
}
|
||||
|
||||
.hero-image-wrapper.animate-load {
|
||||
transform: translateY(40px) scale(0.95);
|
||||
transform: translateY(0) scale(1);
|
||||
}
|
||||
|
||||
.hero-image-wrapper.animate-load.is-visible {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue