This commit is contained in:
2026-05-03 14:14:07 +05:00
parent 9d4d0306a9
commit 76314352cf
3 changed files with 121 additions and 0 deletions

61
public/hero-slideshow.js Normal file
View File

@@ -0,0 +1,61 @@
// Массив фоновых изображений (те же, что были)
const heroImages = [
'img/h777.webp',
'img/h777o.webp',
'img/h777l.webp',
'img/h777z.webp'
];
// Возможные эффекты анимации (классы CSS)
const effects = ['effect-shutter', 'effect-tornado', 'effect-wave'];
// Текущий индекс изображения
let currentIndex = 0;
let intervalId = null;
// Получаем элемент hero
const hero = document.querySelector('.hero');
// Функция для применения случайного эффекта и смены фона
function changeBackgroundWithEffect() {
if (!hero) return;
// Выбираем случайный эффект
const randomEffect = effects[Math.floor(Math.random() * effects.length)];
// Добавляем класс эффекта
hero.classList.add('effect-active', randomEffect);
// Через небольшую задержку меняем фон (чтобы анимация началась)
// Но для плавности меняем изображение сразу, а эффект создаёт иллюзию перехода
currentIndex = (currentIndex + 1) % heroImages.length;
const newImageUrl = heroImages[currentIndex];
// Меняем фон
hero.style.backgroundImage = `linear-gradient(rgba(0,0,0,0.6), rgba(0,0,0,0.6)), url('${newImageUrl}')`;
// Через время, равное длительности анимации, убираем класс эффекта
setTimeout(() => {
hero.classList.remove('effect-active', randomEffect);
}, 800); // длительность анимации 0.8с
}
// Запуск слайдшоу
function startSlideshow(intervalMs = 15000) {
if (intervalId) clearInterval(intervalId);
intervalId = setInterval(changeBackgroundWithEffect, intervalMs);
}
// Остановка слайдшоу (опционально)
function stopSlideshow() {
if (intervalId) {
clearInterval(intervalId);
intervalId = null;
}
}
// Инициализация: устанавливаем первый фон сразу
if (hero) {
hero.style.backgroundImage = `linear-gradient(rgba(0,0,0,0.6), rgba(0,0,0,0.6)), url('${heroImages[0]}')`;
startSlideshow(15000);
}

View File

@@ -138,5 +138,6 @@
<script src="scripts.js"></script>
<script src="about.js"></script>
<script src="location.js"></script>
<script src="hero-slideshow.js"></script>
</body>
</html>

View File

@@ -498,4 +498,63 @@ footer {
border-radius: 20px;
border-left: 4px solid var(--secondary);
font-size: 1rem;
}
/* Эффекты перехода для hero */
.hero {
position: relative;
overflow: hidden;
transition: background-image 0.2s ease; /* плавная смена самого фона (не обязательно) */
}
/* Базовые стили для псевдоэлемента анимации */
.hero.effect-active::before {
content: '';
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
pointer-events: none;
z-index: 1;
background: rgba(0,0,0,0.2);
animation-duration: 0.8s;
animation-fill-mode: forwards;
}
/* 1. Шторка - полоса, проходящая по экрану */
.hero.effect-shutter::before {
background: linear-gradient(90deg, transparent, rgba(255,255,255,0.4), transparent);
animation-name: shutterSlide;
animation-timing-function: ease-in-out;
}
@keyframes shutterSlide {
0% { transform: translateX(-100%); width: 10%; }
50% { transform: translateX(0%); width: 100%; }
100% { transform: translateX(100%); width: 10%; }
}
/* 2. Торнадо - завихрение (масштаб+поворот) */
.hero.effect-tornado::before {
background: radial-gradient(circle, rgba(255,255,255,0.3) 0%, rgba(255,255,255,0) 80%);
animation-name: tornadoSpin;
animation-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
}
@keyframes tornadoSpin {
0% { transform: scale(0.1) rotate(0deg); opacity: 0; }
50% { transform: scale(1.5) rotate(180deg); opacity: 0.8; }
100% { transform: scale(0.1) rotate(360deg); opacity: 0; }
}
/* 3. Волна - ripple effect */
.hero.effect-wave::before {
background: radial-gradient(circle at 50% 50%, rgba(255,255,255,0.5) 0%, rgba(255,255,255,0) 70%);
animation-name: waveRipple;
animation-timing-function: ease-out;
}
@keyframes waveRipple {
0% { transform: scale(0); opacity: 1; }
100% { transform: scale(4); opacity: 0; }
}