Ваш l oop работает синхронно, и браузер пакетирует стиль меняется - дисплей обновится только после того, как все Javascript завершено, и к этому времени непрозрачность вернется к 1, так что визуально изменений не будет.
Вместо этого добавьте небольшую задержку внутри циклов:
const delay = ms => new Promise(res => setTimeout(res, ms));
async function fade(element) {
var easeIn = 0.01;
var easeOut = 0.01;
for (alpha = 1; alpha >= 0.2 ; alpha -= easeIn){
element.style.opacity = String(alpha);
await delay(20);
}
for (alpha = 0.2; alpha <= 1 ; alpha += easeOut){
element.style.opacity = alpha;
await delay(20);
}
}
const elm = document.querySelector('button');
elm.addEventListener('click', () => {
fade(elm);
});
<button>click</button>
(обратите внимание, что переменная с именем element
должна, вероятно, на самом деле быть элементом , в противном случае вы вполне можете вызвать путаницу у тех, кто читает код, включая вас позже)
Для нескольких кнопок обязательно объявите переменную alpha
, иначе она будет неявно глобальной и общей для всех слушателей:
const delay = ms => new Promise(res => setTimeout(res, ms));
async function fade(element) {
var easeIn = 0.01;
var easeOut = 0.01;
for (let alpha = 1; alpha >= 0.2 ; alpha -= easeIn){
element.style.opacity = String(alpha);
await delay(20);
}
for (let alpha = 0.2; alpha <= 1 ; alpha += easeOut){
element.style.opacity = alpha;
await delay(20);
}
}
for (const elm of document.querySelectorAll('button')) {
elm.addEventListener('click', () => {
fade(elm);
});
}
<button>click</button>
<button>click</button>