Як я спростив свій індикатор прогресу за допомогою CSS-переходів

Нещодавно, працюючи над створенням індикатора прогресу, я зрозумів, що мій підхід міг бути значно простішим. Спочатку я використовував useRef в React для відслідковування позиції індикатора, припускаючи, що потрібно вручну оновлювати значення. Однак CSS-переходи елегантно впоралися з усім процесом без додаткового навантаження на JavaScript.

Ось що я зрозумів і як ви можете застосувати ці техніки у своїх проектах.

CSS перехід (CSS transition) — це спосіб змінювати CSS властивості протягом певного часу. Це чудово підходить для анімації поступових змін, таких як переміщення індикатора прогресу з однієї позиції в іншу.

Як працюють CSS-переходи

Переходи працюють на принципі плавної інтерполяції між початковим і кінцевим станом для заданої властивості. Щоб увімкнути перехід, достатньо вказати:

  1. Властивість, яку анімуємо.
  2. Тривалість анімації.
  3. Функцію часу (опційно), щоб контролювати плавність переходу.

Приклад: Індикатор прогресу

Ось мінімальний приклад індикатора прогресу, що використовує тільки CSS-переходи:

.progress-bar {  
 width: 0;  
 height: 3rem;  
 background: #4caf50;  
 transition: width 1s ease-in-out;  
}

Кожного разу, коли властивість width елемента .progress-bar змінюється, перехід забезпечує плавне оновлення за 1 секунду. Не потрібно вручну відстежувати попередній стан, оскільки браузер автоматично обчислює інтерполяцію.

Як я ускладнив це: Використання useRef

У моїй початковій реалізації я використовував useRef, щоб зберігати попередній стан індикатора прогресу в React:

const progressBarRef = useRef();
const updateProgress = (newWidth) => {  
 const progressBar = progressBarRef.current;  
 progressBar.style.width = `${newWidth}%`;  
};

Хоча це працювало, це було непотрібно. CSS-переходи вже автоматично відстежують і анімують зміни CSS властивостей. Видаливши useRef і просто оновлюючи width динамічно, перехід працював бездоганно.

Перекладено з: How I Simplified My Progress Bar with CSS Transitions

Leave a Reply

Your email address will not be published. Required fields are marked *