Контроль состояния прозрачности JavaScript?

Доброе утро, хабр!

Задача, что стоит передо мной проста и стара как мир — анимационная смена одной картинки другой при наведении мышки. Картинки имеют одинаковые размеры, одна — просто кнопка, другая — кнопка со «свечением»(hover state), кнопки абсолютно позиционированны и находятся «друг в друге». В примитиве задача решается такими строками кода на jQuery:

$('div#left ul li').css({opacity: 0.0});<br/>
$('div#left ul li:first').css({opacity: 1.0});<br/>
$(&quot;div#left li&quot;).mouseover(function () {<br/>
 $('div#left ul li:first').animate({opacity: 0.0}, 1000);<br/>
 $('div#left ul li:last').animate({opacity: 1.0}, 1000);<br/>
});<br/>
$(&quot;div#left li&quot;).mouseout(function () {<br/>
 $('div#left ul li:first').animate({opacity: 1.0}, 1000);<br/>
 $('div#left ul li:last').animate({opacity: 0.0}, 1000);<br/>
});<br/>


Но у данного подхода есть 1 большая проблема — события вызываются и ставятся в очередь вне зависимости от текущего состояния элемента, то есть несколько наведений мышки на элемент вызывают «перемигивание» элемента. Вопрос состоит в том, как отследить текущее состояние элемента и тем самым не включать его обработку, если в данный момент прозрачность картинки изменяется?
  • Вопрос задан
  • 2622 просмотра
Пригласить эксперта
Ответы на вопрос 4
Эм… самый тупой вариант: перед началом анимации забивать некую переменную в true, а по окончанию в false. Уже на основе самого тупого варианта контролировать, какая именно сейчас анимация (подсветка контрола или нет), и при необходимости (если в процессе анимации подсветки мышка ушла за рамки контрола) стартовать обратную анимацию.
Ответ написан
Комментировать
Немного не по теме, но я бы второму элементу опасити не менял. Просто скрытому больший z-index ставим, и его «появляем». Соответственно он закроет собой нижний. А так в промежуточном состоянии, когда у обоих по 50%, будет проглядывать фон на 25%.
Ответ написан
Предлагаю так: дабавляем li класс .animated. Перед анимацией класс удаляем, после анимации возвращаем. А для mouseover меняем селектор с «div#left li» на «div#left li.animated»
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы