Есть две проблемы с функцией, которые я вижу.
Во-первых, ваши операторы if
выполняют скорее присваивание, чем сравнение.Вы говорите if (n=0)
(один =, назначение), когда должны произносить if (n===0)
(три ===, сравнение, или вы можете использовать два == для сравнения с преобразованием типов).
Второйиспользование цикла for
для многократного изменения стиля не исчезнет, потому что браузер не обновляет отображение одновременно с выполнением вашего кода - по сути, он использует один и тот же поток для отображения и для JavaScript.Таким образом, страница будет обновлена после выхода из функции.Вы должны дать браузеру возможность обновляться после каждой итерации, используя setTimeout()
- что-то вроде:
function fadeEffect(element,startValue,target,delay){
element.style.opacity = startValue;
if (startValue < target)
startValue = Math.min(startValue + 0.1, target);
else
startValue = Math.max(startValue - 0.1, target);
if (startValue != target)
setTimeout(function(){fadeEffect(element,startValue,target,delay);}, delay);
}
<div onMouseOver="fadeEffect(this, 1, 0, 100);"
onMouseOut="fadeEffect(this, 0, 1, 100);" id="box">Menu</div>
Демо: http://jsfiddle.net/hLQ6y/2/
РЕДАКТИРОВАТЬ: обратите внимание, что этот код не 'Вы справляетесь со всем этим блестяще, если вы слишком быстро перемещаете мышь внутрь и наружу, т. е. если вы запускаете постепенное увеличение до того, как окончание постепенного исчезновения закончится.(Вы можете видеть, что я имею в виду в моем jsfiddle.) Вы можете решить эту проблему, сохранив возврат из .setTimeout () и вызвав .clearTimeout () , если потребуется.Учитывая, что я уже рассмотрел суть вопроса, оставлю тонкую настройку в качестве упражнения для читателя ...
ОБНОВЛЕНИЕ: Ваш обновленный код ввел новые операторы if с тем же назначением.вместо сравнения проблемы.Также он зовет setTimeout()
навсегда - вы должны сделать это условно, как в ответах, которые дали Пойнти и я.Также вы, похоже, полагаетесь на переменную i
, которая в качестве локальной переменной не будет сохранять свое значение между вызовами - вы можете сделать ее глобальной, но лучше управлять ею как параметром, как я, или как локальной переменной.во внешней функции, как это делал Пойнти.