Можливі шляхи оптимізації даного коду:
1. Використати зображення прогресу під час завантаження нового зображення, щоб користувач знав, що щось відбувається.
2. Уникнути спливаючої анімації прозорості і встановити нове зображення безпосередньо після закінчення попередньої.
Оптимізований код:
```css
.pic img {
opacity: 1;
transition: opacity 1s linear;
}
.pic img.invisible {
opacity: 0;
}
button {
padding: 1em;
}
button.active {
background: tomato;
}
.pictures-container {
position: relative;
width: 100%;
height: auto;
}
.loading-overlay {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: rgba(255, 255, 255, 0.5);
display: flex;
justify-content: center;
align-items: center;
opacity: 0;
transition: opacity 0.3s ease-in-out;
}
.loading-overlay.visible {
opacity: 1;
}
.loading-text {
font-size: 1.5em;
color: #333;
}
.hidden {
display: none;
}
```
```javascript
const buttons = document.querySelectorAll('button');
const images = document.querySelectorAll('.pic img');
const loadingOverlay = document.querySelector('.loading-overlay');
buttons.forEach(button => {
button.addEventListener('click', () => {
const activeButton = document.querySelector('button.active');
const activeImage = document.querySelector('.pic img:not(.invisible)');
if (activeButton === button) return;
activeButton.classList.remove('active');
button.classList.add('active');
loadingOverlay.classList.add('visible');
activeImage.addEventListener('transitionend', () => {
activeImage.addEventListener('load', () => {
loadingOverlay.classList.remove('visible');
activeImage.classList.remove('invisible');
});
activeImage.src = button.dataset.src;
activeImage.classList.add('invisible');
}, { once: true });
});
});
```
HTML-розмітка:
```html
<div class="pictures-container">
<div class="pic">
<img src="посилання_на_перше_зображення" alt="Зображення 1">
<img class="invisible" src="посилання_на_друге_зображення" alt="Зображення 2">
<!-- Повторіть цей шаблон для додаткових зображень -->
</div>
<div class="loading-overlay">
<p class="loading-text">Завантаження...</p>
</div>
</div>
<button data-src="посилання_на_перше_зображення" class="active">1</button>
<button data-src="посилання_на_друге_зображення">2</button>
<!-- Додайте кнопки для додаткових зображень -->
```
Це оптимізований код, який включає показування елемента завантаження, який з'являється під час завантаження нового зображення. Крім того, тепер нове зображення встановлюється безпосередньо після закінчення анімації попереднього, щоб запобігти спливаючих ефектів.